如何:告诉模块运行时注册视图的区域

时间:2017-02-16 20:19:57

标签: c# wpf prism

是否可以将区域名称传递给模块,以便它知道视图应该注册哪个区域?

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

我想要做的是当模块将视图注册到某个区域时,让SHELL传入区域名称。

如果不可能或不推荐,为什么这会是坏事还是好事?

2 个答案:

答案 0 :(得分:0)

您最好的选择是创建一个管理您的地区名称并将其注入模块的服务。

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

将您的服务注册为您的容器的单身人士,现在您可以在应用程序启动时以及加载模块之前按照您希望的方式对其进行配置。

答案 1 :(得分:-1)

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

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

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类使用的命名空间,它们就可以访问静态属性。没有什么可以通过这种方式。

此技术不仅限于Prism或C#!您可以在任何编程语言中使用此模式。而不是调用RegionNames,而是将其称为StringBag,或其他任何内容!

希望这会对你有所帮助。

相关问题