Обслуживание меню в приложении Prism CAL

Я пытаюсь создать инфраструктуру Prism (CAL) (это мой первый forray в 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>
 /// 
 /// 
 public MenuService(IUnityContainer unityContainer, IRegionManager regionManager)
 {
 m_UnityContainer = unityContainer;
 m_RegionManager = regionManager;
 }
 /// <summary>
 /// Registers a menu item with the service
 /// </summary>
 /// 
 /// 
 /// 
 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>("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>
 /// 
 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><menuitem> menuItems = container.ResolveAll</menuitem><menuitem>();
 foreach (MenuItem item in menuItems)
 {
 if (item.Role == MenuItemRole.SubmenuHeader )
 region.Add(item);
 }
 }
}
</menuitem></string,iunitycontainer></string,>

Есть ли лучший способ сделать то, что я пытаюсь сделать? Ура, Джейсон

1 ответ

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

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

licensed under cc by-sa 3.0 with attribution.