SCSF: MDI zarovnání child objektů
Vcelku jednoduchá zaležitost, ale hotové řešení pro někoho jiného se vždycky hodí. :-)
Prvně, nastavení umístění child objektů pro MDI parent form se mění pomocí metody LayoutMdi an objektu Form. Např.
LayoutMdi(MdiLayout.TileHorizontal);
Pro porovnání oken jsem použil tento postup:
- V menu jsou klasicky dostupné položky pro různé typy rozmístění oken.
- Při kliknutí na vybranou položku se vyvolá klasický command, který vyvolá event, kterou si odebere shell form.
- V shell formu se pak volá samotné zarovnání child objektů.
Prakticky by se ani nemusela volat ta event a šlo by napřímo odebrat ten command, který se volá při kliku na položku menu, ale event se dá volat programově, což umožňuje případně volat zarovnání child objektů i z jiných míst než jsou položky menu, třeba kliknutím na tlačítko a podobně.
Kód pro zarovnání child objektů z Shellform.cs:
[EventSubscription(EventTopicNames.MdiLayoutCascade, ThreadOption.UserInterface)]
public void OnMdiLayoutCascadeChange(object sender, EventArgs<string> eventArgs){
LayoutMdi(MdiLayout.Cascade);
}
[EventSubscription(EventTopicNames.MdiLayoutHorizontal, ThreadOption.UserInterface)]
public void OnMdiLayoutHorizontalChange(object sender, EventArgs<string> eventArgs){
LayoutMdi(MdiLayout.TileHorizontal);
}
[EventSubscription(EventTopicNames.MdiLayoutVertical, ThreadOption.UserInterface)]
public void OnMdiLayoutVerticalChange(object sender, EventArgs<string> eventArgs){
LayoutMdi(MdiLayout.TileVertical);
}
Kód pro zachycení kliknutí na položku menu a vyvolání události s požadavkem na zarovnání child objektů.
[CommandHandler(CommandNames.LayoutCascade)]
public void OnLayoutCascade(object sender, EventArgs e){
WorkItem.EventTopics[EventTopicNames.MdiLayoutCascade].Fire(this, newEventArgs<string>(EventTopicNames.MdiLayoutCascade), null, PublicationScope.Global);
}
[CommandHandler(CommandNames.LayoutHorizontally)]
public void OnLayoutHorizontally(object sender, EventArgs e){
WorkItem.EventTopics[EventTopicNames.MdiLayoutHorizontal].Fire(this, newEventArgs<string>(EventTopicNames.diLayoutHorizontal), null, PublicationScope.Global);
}
[CommandHandler(CommandNames.LayoutVertically)]
public void OnLayoutVertically(object sender, EventArgs e){
WorkItem.EventTopics[EventTopicNames.MdiLayoutVertical].Fire(this, newEventArgs<string>(EventTopicNames.MdiLayoutVertical), null, PublicationScope.Global);
}