SCSF: Jak přidat submenu pro jednotlivé moduly
Tak se tak prokousávám tím chytrákem SmartClientem a dneska se mi podařilo vyřešit jedna z mnoha věcí a to přidání submenu při načítání modulu.
Problém spočíval v tom, ža objekt UIExtensionSites nepodporuje Get metodu, takže se nemůžete dostat k již existující položce kolekce. Podporované metody jsou jen Add a Remove. V případě menu pak nelze přidat dynamicky menu dle potřeb na příslušné místo.
Jedno řešení je použít další třídu, která pomocí svých public metod bude vracet případné existující objekty. Pomoc jsem našel na SCSF fóru. Komentář obsahuje kompletní zdroják takovéto třídy, kterým jsem vložil do nového projektu, zkompiloval a vložil do referencí jako nový projekt. Záměrně jsem tuto třídu nedával nikam do složky Infrastructure, kde sou rootové projekty, které se automaticky linkují do modulů. Nebyl jsem si jist kam bych mohl tuto třídu dát, jako jediná možná volba by mohl být projekt Infrastructure.Interface, ale ten obsahuje záměrně jen Interface objekty, čímž bych zjevně porušil pravidla nezávislosti.
Při vytváření submenu v modulu pak jen již vytvořím tuto třídu, podhodím ji rootový WorkItem a název hledaného menu a v případě, kdy není menu není vytvořeno, tak ho vytvořím. A pak již přidám jen lokální submenu dle potřeb jednotlivých modulů. Vypadá to asi takto.
Příklad metody z třídy ModuleController
{
//check if root menu exist, if not then create new
ExtensionSiteUtility<ToolStripMenuItem> mainMenu =
new ExtensionSiteUtility<ToolStripMenuItem>(
WorkItem.RootWorkItem, UIExtensionSiteNames.MainMenu);
ToolStripMenuItem diary = mainMenu.GetSite(HelloWord.Infrastructure.Interface.Constants.MenuItemNames.Diary);
if (diary == null) {
//adding menuitem to RootWorkItem to UIExtensionSites collection
diary = new ToolStripMenuItem();
diary.Text = HelloWord.Infrastructure.Interface.Constants.MenuItemNames.Diary;
WorkItem.RootWorkItem.UIExtensionSites[UIExtensionSiteNames.MainMenu].Add<ToolStripMenuItem>(diary);
}
//add module menu to module WorkItem
ToolStripMenuItem sport = AddMainMenuItem(null, "Sport");
ToolStripMenuItem info = AddMainMenuItem(CommandNames.ShowSportInfoList, "Sport InfoList");
ToolStripMenuItem detail = AddMainMenuItem(CommandNames.ShowSportDetail, "Sport Detail");
sport.DropDownItems.AddRange(new ToolStripMenuItem[] { info, detail });
diary.DropDownItems.AddRange(new ToolStripMenuItem[] { sport });
}
Detail metody AddMainMenuItem pro jistotu
{
ToolStripMenuItem item = new ToolStripMenuItem();
item.Text = text;
if (!String.IsNullOrEmpty(commandName)) {
WorkItem.UIExtensionSites[UIExtensionSiteNames.MainMenu].Add<ToolStripMenuItem>(item);
WorkItem.Commands[commandName].AddInvoker(item, "Click");
}
return item;
}