2017-02-16 58 views
-2

是否可以将区域名称传递给模块,以便知道视图应该注册哪个区域?如何在运行时告诉模块要注册哪个区域

我在许多代码示例中看到,regionName在模块初始化方法中是硬编码的。

当模块注册视图到区域时,我想要做的是在区域名称中传递SHELL。

如果这不可能或不被推荐,为什么这是一件坏事或好事?

+1

壳牌不将任何地区名称“传入”模块。 shell *定义了任何模块可以注入视图的区域。我不明白你想要做什么,但听起来像是错误的方法。 – mm8

+0

如何将相同模块视图的两个或多个实例加载到同一个shell中?例如,如果我有一个“零件输入”模块,并希望允许用户想要的任意多个实例。每个实例都会加载到一个可停靠的选项卡中。 – Arcadian

+0

与此类似:http://4-getful.blogspot.com/2010/04/ensuring-your-prism-modules-can-load.html – Arcadian

回答

-1

我和其他人如何处理避免在任何地方设置/传递魔术字符串的想法,是集中存储字符串,以便您可以在其他地方引用它们。

首先,您需要一个将存储字符串的类。我使用一个叫做RegionNames的我的Prism ...区域名称。下面是一个例子。

namespace Application.Shared 
{ 
    public class RegionNames 
    { 
     // Main window regions 
     public static string RibbonRegion { get { return "RibbonRegion"; } } 
     public static string TitleBarRegion { get { return "TitleBarRegion"; } } 
     public static string ToolBarRegion { get { return "ToolBarRegion"; } } 
     public static string DashboardRegion { get { return "DashboardRegion"; } } 
     public static string ContentRegion { get { return "ContentRegion"; } } 
    } 
} 

一旦有了这种建立在一个中心位置在您的解决方案,像所有其他组件可以引用,你可以用它像下面的程序集。

using Application.Shared; 

namespace Application.Modules 
{ 
    public class ModuleX : IModule 
    { 
    private readonly IUnityContainer _container; 
    private readonly IRegionManager _region_manager; 

    public ModuleX (IUnityContainer container, IRegionManager region_manager) 
     { 
     _container = container; 
     _region_manager = region_manager; 
     } 
     public override void Initialize() 
     { 
      _region_manager.RegisterViewWithRegion(RegionNames.RibbonRegion, typeof(ToolViewX)); 
      _region_manager.RegisterViewWithRegion(RegionNames.ContentRegion, typeof(FinderViewX)); 
     } 
    } 
} 

只要一个类可以访问RegionNames类使用的命名空间,他们可以访问的静态属性。没有什么可以通过这种方式

这种技术不限于棱镜或C#!你可以用任何编程语言来使用这个模式。而不是打电话RegionNames,叫它StringBag,或其他什么!

希望这可以帮助你。

+0

谢谢。如果我在运行时需要不同的地区名称怎么办?例如,如果我想要加载同一个模块的两个实例,他们需要在两个不同的regionnames中? – Arcadian

+0

我认为这个家伙有正确的想法:http://4-getful.blogspot.com/2010/04/ensuring-your-prism-modules-can-load.html – Arcadian

+0

如果你想显示一个视图的差异在运行时可以通过RequestNavigate来完成。 http://prismlibrary.readthedocs.io/en/latest/WPF/08-Navigation/#view-based-navigation您不必在编译时将其设置为无用。你真的会引用近7年前的博客文章吗?这是一个不好的例子。 –

0

最好的办法是创建一个服务来管理你的地区名称并将其注入到模块中。

IRegionNameService 
{ 
    string MainRegion {get;} 
    string DetailRegion {get;} 
} 

注册您的服务为您的容器一个单身,现在你可以把它配置只是你想要它加载的应用程序启动之前模块时的方式。

+0

我结束了现在使用EventService。但仍然不满意解决方案。 – Arcadian