WPF MEF +棱镜初始区域加载

新西兰詹姆斯

我已经在WPF中使用MEF和Prism在三个不同的区域编写了MVVM应用程序。代码位于App.Config中发现的两个模块之间。

我的所有导航命令和结构都工作正常,但是我感到困惑的是,如何设置在应用启动时将初始视图加载到每个区域中,因为我似乎无处可做。此外,如果我在MainViewModel构造函数的末尾添加一些内容以显式导航到屏幕集A,则似乎有其他内容将其覆盖并加载了另一组视图。

这似乎也取决于我在app.config中加载模块的顺序,这似乎是不可取的。如果我最后加载管理模块,则从管理模块加载一组屏幕,如果我最后加载搜索模块,则从搜索模块加载一组视图,在这种情况下,甚至没有找到用于主要地区。

使用MEF和配置发现时,用于指定在应用启动时在每个区域中加载哪些视图的方法是什么?

using System;
using System.ComponentModel.Composition;
using Microsoft.Practices.Prism.Regions;

namespace CRM.GUI.WPF.Shared.Infrastructure.Behaviour
{
    [Export(typeof(AutoPopulateExportedViewsBehavior))]
    [PartCreationPolicy(CreationPolicy.NonShared)]
    public class AutoPopulateExportedViewsBehavior : RegionBehavior, IPartImportsSatisfiedNotification
    {
        protected override void OnAttach()
        {
            AddRegisteredViews();
        }

        public void OnImportsSatisfied()
        {
            AddRegisteredViews();
        }

        private void AddRegisteredViews()
        {
            if (Region != null)
            {
                foreach (var viewEntry in RegisteredViews)
                {
                    if (viewEntry.Metadata.RegionName == Region.Name)
                    {
                        var view = viewEntry.Value;

                        if (!Region.Views.Contains(view))
                        {
                            Region.Add(view);
                        }
                    }
                }
            }
        }

        [ImportMany(AllowRecomposition = true)]
        public Lazy<object, IViewRegionRegistration>[] RegisteredViews { get; set; }
    }
}

[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
    [MetadataAttribute]
    public class ViewExportAttribute : ExportAttribute, IViewRegionRegistration
    {
        public ViewExportAttribute()
            : base(typeof(object))
        { }

        public ViewExportAttribute(string viewName)
            : base(viewName, typeof(object))
        { }

        public string RegionName { get; set; }
    }

用过的

[ViewExport(RegionName = RegionNames.MainRegion)]
public partial class ReportView
格斯托洛夫斯基

根据我的理解,棱镜负载和默认显示第一视图是被每个注册的地区(只有第一个视图,如果该区域被设置在将显示在ContentControl中项目)。

因此,您可以不想在启动时显示的每个RegionBehavior停用不需要的视图这样一来,当添加了所需的“启动视图”时,它将被激活,因为还没有其他活动视图

另一种选择是在相应的Module initialize()方法注册每个View,而不是使用RegionBehaviours因此,最后,在将每个视图添加到相应的Region之后,您将决定停用视图,无论它是否为“启动视图”

更新:

以下实现显示了在每个RegionBehavior停用非启动视图的可能选择为了获得更好的解决方案,您可以创建一个字典或一个简单的静态类,以返回相应RegionStartUpView名称,然后按如下所示进行调用:

private void AddRegisteredViews()
{
   ...
       var view = viewEntry.Value;

       if (!Region.Views.Contains(view))
       {
            Region.Add(view);
            if (view.GetType().Name != StartUpViewNames.getViewNameFromRegion(Region))
            {
                 Region.deactivate(view);
            }
       }
  ...
}

请注意,在找到StartUpView并将其保持活动状态后,我将继续停用以下添加的视图,但是您可以将其保持活动状态正如我提到的,将显示的视图将是第一个Region中变为活动视图

希望这对您有所帮助。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

WPF + PRISM + MEF初始化DownloadedPartCatalogCollection

来自分类Dev

棱镜WPF动态区域

来自分类Dev

棱镜ServiceLocator GetInstance和MEF

来自分类Dev

在Prism(MEF v.5)wpf应用程序中,视图的加载速度非常慢

来自分类Dev

WPF GUI对象共享(PRISM / MEF)

来自分类Dev

MEF还是团结是棱镜的必然选择?

来自分类Dev

使用MEF动态加载接口

来自分类Dev

带有MEF 2的WPF MvvM中的插件

来自分类Dev

WPf,MEF体系结构设计

来自分类Dev

如何使用MEF初始化viewModel?

来自分类Dev

如何使用MEF初始化viewModel?

来自分类Dev

尝试使用MEF加载插件时出错

来自分类Dev

c# MEF 上下文中的 WPF 窗口关闭确认

来自分类Dev

为什么在使用MEF时成功加载了程序集引用?

来自分类Dev

实现接口并匹配属性的MEF加载类型

来自分类Dev

WPF-棱镜区域以及相对于祖先的绑定的问题

来自分类Dev

MEF给CompositionException

来自分类Dev

WPF图像加载前的初始大小

来自分类Dev

WPF棱镜:开发新模块

来自分类Dev

WPF应用程序安全性和数据访问-MEF模块化应用程序MVVM

来自分类Dev

如何解析/加载MEF导出程序集的外部依赖关系

来自分类Dev

将.dll加载到单独的应用程序域(MEF)中

来自分类Dev

棱镜 WPF MVVM 你好世界

来自分类Dev

WPF:初始可见性和模板加载

来自分类Dev

无法按需初始化或加载棱镜模块

来自分类Dev

MEF和对象处置

来自分类Dev

MEF ImportMany简单插件

来自分类Dev

Unity与MEF合作

来自分类Dev

WPF资源无法加载?