【问题标题】:Integrating Modules with Application in Prism aka CompositeWpf在 Prism aka CompositeWpf 中将模块与应用程序集成
【发布时间】:2009-11-04 03:23:45
【问题描述】:

来自MSDN

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

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

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

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

【问题讨论】:

    标签: wpf prism modularity


    【解决方案1】:

    我所做的是在我的 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 也不是必需的,但可能是正确的。

    显然这种方式过于简单化了。我有一些东西表明视图是否应该是菜单项。我的应用程序有几个菜单等,但这是基础知识,应该可以帮助您进行操作。

    另外,你应该给 Stackoverflow 一点机会来给你一个答案……你只给了我们 3 个小时,然后你就放弃了 :)

    希望这会有所帮助。

    【讨论】:

    • 感谢您的意见。你能看看stackoverflow.com/questions/1678423/…我在看到你的回复之前发了那个帖子。
    • 您好,能否给我一个RegisterView() 的示例,尤其是Func 部分。
    【解决方案2】:

    RegisterViewWithRegion 没有接受视图名称作为参数的重载。这本可以简化模块的集成。我在Codeplex中添加了一个工作项

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

    【讨论】:

    • 这不是必须的。我会尽快发布替代方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多