Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 如何使用MEF和MVVM将PRISM模块添加到工具栏_Wpf_Mvvm_Prism_Mef - Fatal编程技术网

Wpf 如何使用MEF和MVVM将PRISM模块添加到工具栏

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停靠 创建工具栏按钮以表示应用程序中的可用视图时遇到问题。我的想法是使用工具栏服务或事件模式,这样每个视图模块都可以以解耦的方式向工具栏注册 然而,在

我使用带有MEF的PRISM 4.0作为容器。我在Shell中定义了两个区域:工具栏和主区域。工具栏区域使用自定义区域行为自动填充my toolbar Module-AutoPopulateExportedViewsBehaviour。My Main Region可以包含一个或多个视图模块,这些模块将通过第三方dock layout manager停靠

创建工具栏按钮以表示应用程序中的可用视图时遇到问题。我的想法是使用工具栏服务或事件模式,这样每个视图模块都可以以解耦的方式向工具栏注册

然而,在调用RegionManager.RegisterViewWithRegion之前,似乎没有调用视图模块构造函数

如何控制模块的初始化,以便模块可以在工具栏上注册。因此,允许他们添加一个按钮,但实际上不显示视图本身。仅当单击刚刚注册的视图按钮时,视图才会显示

谢谢

我如何控制模块的初始化,以便它们能够 是否向工具栏注册,但不显示初始值

我不知道你说的是什么意思

我知道您希望模块在加载时注册自己的导航部分。我有类似的场景,在上面有菜单栏,下面有按钮栏。加载时的每个模块-使用初始化代码插入其自己的按钮/菜单:

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
执行此操作。