Wpf 如何使用MEF和MVVM将PRISM模块添加到工具栏
我使用带有MEF的PRISM 4.0作为容器。我在Shell中定义了两个区域:工具栏和主区域。工具栏区域使用自定义区域行为自动填充my toolbar Module-AutoPopulateExportedViewsBehaviour。My Main Region可以包含一个或多个视图模块,这些模块将通过第三方dock layout manager停靠 创建工具栏按钮以表示应用程序中的可用视图时遇到问题。我的想法是使用工具栏服务或事件模式,这样每个视图模块都可以以解耦的方式向工具栏注册 然而,在调用RegionManager.RegisterViewWithRegion之前,似乎没有调用视图模块构造函数 如何控制模块的初始化,以便模块可以在工具栏上注册。因此,允许他们添加一个按钮,但实际上不显示视图本身。仅当单击刚刚注册的视图按钮时,视图才会显示 谢谢 我如何控制模块的初始化,以便它们能够 是否向工具栏注册,但不显示初始值 我不知道你说的是什么意思 我知道您希望模块在加载时注册自己的导航部分。我有类似的场景,在上面有菜单栏,下面有按钮栏。加载时的每个模块-使用初始化代码插入其自己的按钮/菜单:Wpf 如何使用MEF和MVVM将PRISM模块添加到工具栏,wpf,mvvm,prism,mef,Wpf,Mvvm,Prism,Mef,我使用带有MEF的PRISM 4.0作为容器。我在Shell中定义了两个区域:工具栏和主区域。工具栏区域使用自定义区域行为自动填充my toolbar Module-AutoPopulateExportedViewsBehaviour。My Main Region可以包含一个或多个视图模块,这些模块将通过第三方dock layout manager停靠 创建工具栏按钮以表示应用程序中的可用视图时遇到问题。我的想法是使用工具栏服务或事件模式,这样每个视图模块都可以以解耦的方式向工具栏注册 然而,在
public void Initialize()
{
this.RegionManager.RegisterViewWithRegion(RegionNames.Menu, typeof(NavigationView));
this.RegionManager.RegisterViewWithRegion(RegionNames.Toolbar, typeof(ToolbarNavigationView));
}
这些区域有实际的按钮/项目,按下这些按钮/项目时会调用其他内容。例如,这里是NavigationViewModel
namespace IDATT.Module.SystemManager.ViewModels
{
using System;
using System.ComponentModel.Composition;
using Microsoft.Practices.Prism.Regions;
[Export]
public class NavigationViewModel
{
[Import]
public ISecurityService SecurityService { get; set; }
[Import]
public IRegionManager RegionManager { get; set; }
public void Mail()
{
this.RegionManager.RequestNavigate(RegionNames.Tabs, new Uri(typeof(MailView).Name, UriKind.Relative));
}
public void MaintainUser()
{
this.RegionManager.RequestNavigate(RegionNames.Tabs, new Uri(typeof(MaintainUserView).Name, UriKind.Relative));
}
public void MaintainGroup()
{
this.RegionManager.RequestNavigate(RegionNames.Tabs, new Uri(typeof(MaintainGroupView).Name, UriKind.Relative));
}
public void MaintainMailTemplate()
{
this.RegionManager.RequestNavigate(RegionNames.Tabs, new Uri(typeof(MaintainMailTemplateView).Name, UriKind.Relative));
}
public void SetUpOptions()
{
this.RegionManager.RequestNavigate(RegionNames.Tabs, new Uri(typeof(SetUpSystemManagerOptionsView).Name, UriKind.Relative));
}
public void Logout()
{
this.SecurityService.Logout();
}
}
}
看起来我可以通过使用自定义RegionBehavior“强制”调用视图模块的构造函数。在这里面,我可以将视图模块转换为特定的基本视图或接口类型,并调用a函数。这将在工具栏中注册我的视图,但不一定在我的应用程序的“主”区域中显示视图
谢谢你的帮助。谢谢你的提示。我没有意识到我应该这么做。嗨,Katit,谢谢你的帮助。我会把我的问题再说清楚一点。本质上,我创建的是一个空的应用程序,我不知道哪些按钮和视图可用。这将由我的框架的用户决定。我需要做的是给他们一种方法,在工具栏上添加一个按钮。单击此按钮时,将加载视图。在调用RegionManager.RegisterViewWithRegion之前,似乎没有调用我的视图模块构造函数。。。我希望更好地控制视图模块的生命周期。希望这能让事情变得更清楚。谢谢,为什么按钮会“神奇地”出现还不清楚?如果您允许用户选择可用的内容,而不是在将代码写入
RegisterViewWithRegion
并显示相应的按钮时使用这些设置。嗨,Katit,我正在编写的是一个包含工具栏区域和主区域的通用框架。然后,内容用户将采用此框架并编写自己的视图模块。主区域可以同时承载多个视图模块,这些模块可以停靠在各种配置中。我需要公开的是内容用户在工具栏上创建按钮的一种方法,该按钮可以在那里启动视图模块。也许我这样做是错误的,但它现在似乎适用于自定义区域行为。如果没有这个,我的构造函数就不会被调用。我认为你想得太多了。您的用户(无论是谁编写模块)都将按惯例使用。您告诉他们需要将按钮放置在何处的区域名称,他们在模块初始化时通过RegisterViewWithRegion
执行此操作。