将模块与Prism中的应用程序集成,即CompositeWpf

时间:2009-11-04 03:23:46

标签: wpf prism modularity

来自MSDN

  

模块中的大多数视图可能不必直接显示,而是仅在用户执行某些操作后才能显示。根据应用程序的样式,您可能希望使用菜单,工具栏或其他导航策略供用户访问视图。在模块的初始化方法中,您还可以注册应用程序的导航结构。在导航结构的事件处理程序中(即,当用户单击菜单项时),您可以使用View Injection技术将视图添加到适当的区域。

我有一个类似的场景,我正在使用RegisterViewWithRegion在Module的Initialization方法中向Region添加Views。我想用菜单(这是一个不同的模块)显示基于视图的用户交互。

如何在不破坏棱镜中模块的解耦行为的情况下实现此行为?

是否可以激活/显示已添加到某个区域的视图,例如ModuleA中的ModuleA?

2 个答案:

答案 0 :(得分:2)

我所做的是使用以下界面在我的Shell中创建一个视图注册表(我在这里简化):

public interface IViewRegistry
{
     void RegisterView(string title, string key, Func<UIElement> viewCreationMethod);
     void OpenView(string key);
}

这是过于简单化的方式,但希望这会给你一张照片。每个模块在初始化时使用此接口向shell注册其视图。在我的shell中,我创建了一个存储这些东西的ViewStore。

public static class ViewStore
{
     public Dictionary<string, ViewEntry> Views { get; set; }
     static ViewStore()
     {
          Views = new Dictionary<string, ViewEntry>();
     }

     public void RegisterView(string name, string key, Func<UIElement> createMethod)
     {
         Views.Add(key, new ViewEntry() { Name = name, CreateMethod = createMethod });
     }
}

然后从我的IViewRegistry实现:

public class ViewRegistryService : IViewRegistry
{
     public void RegisterView(string title, string key, Func<UIElement> createMethod)
     {
          ViewStore.RegisterView(title, key, createMethod);
     }

     public void OpenView(string key)
     {
          //Check here with your region manager to see if
          //the view is already open, if not, inject it
          var view = _regionManager.Regions["MyRegion"].GetView(key);
          if(view != null)
          {
               view = ViewStore.Views[key]();
               _regionManager.Regions["MyRegion"].Add(view, key);
          }
          _regionManager.Regions["MyRegion"].Activate(view);
     }

     private IRegionManager _regionManager;
     public ViewRegistryService(IRegionManager rm)
     {
          _regionManager = rm;
     }
}

现在我有两件事:

  1. 我可以用来在我的shell中创建菜单的ViewStore。
  2. 模块打开其他模块所拥有的视图的方式,而不会超出简单的ModuleDependencies(实际上,甚至ModuleDependency也不是必需的,但可能是正确的。
  3. 显然这种方式过于简单化了。我有东西表明视图是否应该是一个菜单项。我的应用程序有几个菜单等,但这是基础知识,应该让你去。

    另外,你应该给Stackoverflow一点机会给你一个答案......你只给了我们3个小时才放弃:)

    希望这有帮助。

答案 1 :(得分:0)

RegisterViewWithRegion没有接受View name作为参数的重载。这可以简化模块的集成。我在Codeplex

中添加了一个工作项

目前我正在添加对其他视图注入模块的引用,并且失去了Prism的松散耦合性