模块集成及其在Prism aka CompositeWpf中的应用

模块集成及其在Prism aka CompositeWpf中的应用,wpf,prism,modularity,Wpf,Prism,Modularity,发件人: 模块中的大多数视图可能不必直接显示,而只需在用户执行某些操作后显示。根据应用程序的样式,您可能希望使用菜单、工具栏或其他导航策略让用户访问视图。在模块的初始化方法中,您还可以注册应用程序的导航结构。在导航结构的事件处理程序中(即,当用户单击菜单项时),可以使用视图注入技术将视图添加到适当的区域 我有一个类似的场景,我使用RegisterViewWithRegion在模块的初始化方法中向区域添加视图。我想用一个菜单显示一个基于视图的用户交互(这是一个不同的模块) 如何在不破坏Prism中

发件人:

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

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

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


是否可以激活/显示已添加到某个区域的视图,例如通过ModuleB中的ModuleA?RegisterViewWithRegion没有接受视图名称作为参数的重载。这本可以简化模块的集成。我已在中添加了一个工作项


目前,我正在为视图注入添加对其他模块的引用,并失去了Prism的松散耦合特性。我所做的是使用以下接口在Shell中创建一个视图注册表(我在这里简化):

公共接口IViewRegistry
{
无效注册表视图(字符串标题、字符串键、Func viewCreationMethod);
void OpenView(字符串键);
}
这太简单了,但希望这能给你一个画面。每个模块在初始化时使用此接口向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 });
     }
}
公共静态类ViewStore
{
公共字典视图{get;set;}
静态视图存储()
{
视图=新字典();
}
public void RegisterView(字符串名称、字符串键、Func createMethod)
{
添加(键,newviewEntry(){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;
     }
}
公共类ViewRegistryService:IViewRegistry
{
public void RegisterView(字符串标题、字符串键、Func createMethod)
{
RegisterView(标题、键、createMethod);
}
公共void OpenView(字符串键)
{
//请与您的区域经理联系,查看是否
//视图已打开,如果未打开,请将其插入
var view=_regionManager.Regions[“MyRegion”].GetView(键);
如果(视图!=null)
{
view=ViewStore.Views[key]();
_regionManager.Regions[“MyRegion”].Add(视图,键);
}
_regionManager.Regions[“MyRegion”]。激活(查看);
}
私有IRegionManager(区域管理器);
公共视图注册服务(IRegionManager rm)
{
_regionManager=rm;
}
}
现在我有两件事:

  • 可用于在shell中创建菜单的ViewStore
  • 模块打开其他模块拥有的视图的一种方式,无需耦合到简单的ModuleDependency之外(实际上,即使ModuleDependency也不是必需的,但可能是正确的)
  • 显然,这种方式过于简单化了。我有一些东西可以指示视图是否应该是菜单项。我的应用程序有几个菜单,等等,但这是最基本的,应该可以让你开始

    另外,你应该给Stackoverflow一点机会让你得到答案……你在放弃之前只给了我们3个小时:)


    希望这有帮助。

    这不是必需的。我很快会发布一个替代方案。感谢您的投入。在看到你的回复之前,你能看一下我写的那篇文章吗?嗨,你能给我一个RegisterView()的示例吗,特别是Func部分。
    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;
         }
    }