C# 如何:告诉模块在运行时将视图注册到哪个区域

C# 如何:告诉模块在运行时将视图注册到哪个区域,c#,wpf,prism,C#,Wpf,Prism,是否可以将区域名称传递给模块,以便模块知道视图应注册到哪个区域 我在许多代码示例中看到regionName是在模块初始化方法中硬编码的 我要做的是,当模块将视图注册到某个区域时,在区域名称中包含SHELL过程 如果这是不可能的或不推荐的,为什么这是一件坏事或好事?我和其他人如何处理避免设置/传递魔法字符串的想法,就是集中存储字符串,以便您可以在其他地方参考它们 首先,需要一个存储字符串的类。我用了一个叫RegionNames的来做我的Prism。。。区域名字。下面是一个例子 namespace

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

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

我要做的是,当模块将视图注册到某个区域时,在区域名称中包含SHELL过程


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

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

首先,需要一个存储字符串的类。我用了一个叫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!您可以在任何编程语言中使用此模式。与其叫区域名称,不如叫它StringBag,或者别的什么


希望这对您有所帮助。

您最好创建一个服务来管理您的地区名称,并将其注入模块中

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

在容器中将您的服务注册为singleton,现在您可以在应用程序启动时和模块加载之前按照您希望的方式配置它。

Shell不会将任何区域名称传递给模块。shell定义了任何模块都可以在其中插入视图的区域。我不明白你想做什么,但这听起来好像是错误的方法。你如何将相同模块视图的两个或多个实例加载到同一个shell中?例如,如果我有一个部件输入模块,并且希望允许用户想要的实例数量。每个实例都将加载到一个可固定的选项卡中。类似于此:谢谢。如果在运行时需要不同的regionname怎么办?例如,如果我想加载同一模块的两个实例,它们需要位于两个不同的区域名称,对吗?我认为这家伙的想法是正确的:如果你想在运行时在不同的区域显示视图,你可以通过RequestNavigate来实现。您不必在编译时将其一成不变。你真的要引用一篇7年前的博文吗?这是个很坏的例子。???我指出这个概念是因为我无法理解我的想法。如果最新版本的prism可以处理这个问题,但在一个新的术语,那么这就是我正在寻找的。我审查你的链接。谢谢但这仍然不能解决问题。您仍然需要将您的区域定义为时间头。想象一下一个选项卡式应用程序,它动态加载内容。Tab可能会加载同一视图的新实例,但需要一个新的RegionName,因为shell不能有多个具有相同名称的区域。我现在使用的是EventService。但仍然对解决方案不满意。