SCSF: Jak přidat submenu pro jednotlivé moduly

MyEgo.cz

home foto blogy mywindows.cz kontakt

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

CODE
   private void ExtendMenu()
     {
        //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

CODE
   private ToolStripMenuItem AddMainMenuItem(string commandName, string text)
     {
        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;
     }


Nový komentář