gpt4 book ai didi

WPF MEF + Prism 初始区域加载

转载 作者:行者123 更新时间:2023-12-04 22:28:45 29 4
gpt4 key购买 nike

我在 WPF 中使用 MEF 和 Prism 在三个不同的区域编写了一个 MVVM 应用程序。代码跨两个模块,在 App.Config 中被发现。

我的所有导航命令和结构都运行良好,但我感到困惑的一件事是如何设置在应用程序启动时加载到每个区域的初始 View ,因为我似乎无处可做。此外,如果我在 MainViewModel 构造函数的末尾添加一些内容以显式导航到屏幕集 A,则其他内容似乎会覆盖它并加载一组不同的 View 以开始。

这似乎也取决于我在 app.config 上加载模块的顺序,这似乎是不可取的。如果我最后加载管理模块,它会从管理模块加载一组屏幕,如果我最后加载搜索模块,它会从搜索模块加载一组 View ,在这种情况下,它甚至找不到 View 主要区域。

在使用 MEF 和配置发现时,指定在应用程序启动时将哪些 View 加载到每个区域的方法是什么?

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

最佳答案

根据我的理解,Prism 默认加载并显示在每个 Region 上注册的第一个 View(仅第一个 >View 如果在 ContentControl 项上设置区域,则会显示。

因此,您可以停用您不想在启动时显示的每个RegionBehavior 上不需要的Views。这将使当添加所需的启动 View 时,它将被激活,因为没有其他事件 查看

另一种方法是在相应的Module initialize() 方法上注册每个View,而不是使用RegionBehaviours .所以最后,在将每个 View 添加到相应的 Region 之后,您将决定停用 View 是否StartUp View 或不是。

更新:

以下实现显示了在每个 RegionBehavior停用 非启动 Views 的可能替代方案。为了获得更优雅的解决方案,您可以创建一个字典或一个简单的静态类,返回相应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 并保持事件后,它会继续停用以下添加的 View ,但您可以离开他们活跃。正如我提到的,将要显示的View 将是Region 中第一个Active 的 View 。

希望对你有帮助问候。

关于WPF MEF + Prism 初始区域加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19526287/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com