2009-10-04 3 views
3

Я пытаюсь создать фреймворк Prism (CAL) (это мой первый forray в CAL), и мне трудно создать сервис для регистрации пунктов меню для региона). Вот что я придумал до сих пор ...Служба меню в приложении Prism CAL

/// <summary> 
/// Menu item service - allows any module to register menu items with any region 
/// </summary> 
public class MenuService : IMenuService 
{ 
    private IUnityContainer m_UnityContainer; 
    private IRegionManager m_RegionManager; 
    private Dictionary<string, IUnityContainer> m_MenuContainers = new Dictionary<string,IUnityContainer>(); 

    /// <summary> 
    /// Injection ctor 
    /// </summary> 
    /// <param name="unityContainer"></param> 
    /// <param name="regionManager"></param> 
    public MenuService(IUnityContainer unityContainer, IRegionManager regionManager) 
    { 
     m_UnityContainer = unityContainer; 
     m_RegionManager = regionManager; 
    } 

    /// <summary> 
    /// Registers a menu item with the service 
    /// </summary> 
    /// <param name="topLevelName"></param> 
    /// <param name="regionIdentity"></param> 
    /// <param name="displayText"></param> 
    public void RegisterMenuItem(string topLevelName, string regionIdentity, string displayText) 
    {  
     IUnityContainer container = GetOrCreateUiIdentityContainer(regionIdentity); 

     if (string.IsNullOrEmpty(topLevelName)) 
      container.RegisterInstance("MENUITEM" + displayText, new MenuItem { Header = displayText}); 
     else 
     { 
      MenuItem topLevel = container.Resolve<MenuItem>("MENUITEM" + topLevelName); 
      if (topLevel.Header == null) 
      { 
       topLevel = new MenuItem{ Header = topLevelName}; 
       container.RegisterInstance<MenuItem>("MENUITEM" + topLevelName, topLevel); 
      } 
      MenuItem newItem = new MenuItem{Header = displayText}; 
      topLevel.Items.Add(newItem); 
      container.RegisterInstance("MENUITEM" + topLevelName + "_" + displayText, newItem); 
     } 
    } 

    private IUnityContainer GetOrCreateUiIdentityContainer(string regionIdentity) 
    { 
     IUnityContainer container; 
     container = GetUnityContainer(regionIdentity); 
     if (container != null) 
      return container; 

     container = m_UnityContainer.CreateChildContainer(); 
     m_MenuContainers.Add(regionIdentity, container); 
     return container; 
    } 

    private IUnityContainer GetUnityContainer(string regionIdentity) 
    { 
     IUnityContainer container; 
     m_MenuContainers.TryGetValue(regionIdentity, out container); 
     return container; 
    } 

    /// <summary> 
    /// Builds up the menu for a given region 
    /// </summary> 
    /// <param name="regionIdentity"></param> 
    public void BuildMenu(string regionIdentity) 
    { 
     IUnityContainer container; 
     container = GetUnityContainer(regionIdentity); 
     if (container == null) 
      return; 

     IRegion region = m_RegionManager.Regions[regionIdentity]; 
     if (region == null) 
      return; 

     IEnumerable<MenuItem> menuItems = container.ResolveAll<MenuItem>(); 

     foreach (MenuItem item in menuItems) 
     { 
      if (item.Role == MenuItemRole.SubmenuHeader) 
       region.Add(item); 
     } 
    } 

} 

Есть ли лучший способ сделать то, что я пытаюсь сделать? Cheers, Jason

ответ

1

У меня есть образец, на котором вы можете взглянуть, что делает именно это. Надеюсь, это поможет вам немного. Если у вас есть какие-то конкретные вопросы, посмотрев на это, дайте мне знать! http://dl.getdropbox.com/u/376992/CAGMenus.zip

Надеюсь, это поможет.