2012-01-10 52 views
1

我正在使用PRISM 4.0和MEF作为我的容器。我在Shell中定义了2个区域,ToolBar和MainRegion。工具栏区域使用自定义RegionBehaviour - AutoPopulateExportedViewsBehaviour自动填充到我的ToolBarModule中。我的MainRegion可以包含1个或多个视图模块,这些模块将通过第三方码头布局管理器进行对接。如何使用MEF和MVVM将PRISM模块添加到工具栏中

我无法创建工具栏按钮来表示我的应用程序中的可用视图。我的想法是使用ToolBarService或Event模式,以便每个View模块可以以解耦的方式向ToolBar注册自己。

但是看来我查看模块构造器不叫,直到我打电话RegionManager.RegisterViewWithRegion ...

如何控制我的模块初始化,使他们能够使用工具栏登记。因此允许他们添加一个按钮,但实际上并不显示视图本身。该视图将仅在点击刚注册的按钮时显示。

感谢

+0

感谢您的提示。我没有意识到我应该这样做。 – user630190 2012-01-10 15:24:57

回答

0

如何控制我的模块初始化,使他们能够 寄存器与工具栏,但不initally显示?

我不确定你的意思。

据我所知,您希望模块在加载时注册自己的导航部分。我有类似的情况,我有顶部的菜单栏和下面的按钮栏。加载时每个模块 - 插入它的使用初始化代码自己的按钮/菜单:

public void Initialize() 
     { 
      this.RegionManager.RegisterViewWithRegion(RegionNames.Menu, typeof(NavigationView)); 
      this.RegionManager.RegisterViewWithRegion(RegionNames.Toolbar, typeof(ToolbarNavigationView)); 
     } 

这些地区有实际按钮/按下该按钮时调用别的项目。对于examle,这里是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(); 
     } 
    } 
} 
+0

嗨凯蒂特,谢谢你的帮助。我会将我的问题重新说清楚一点。基本上我创建的是一个空的应用程序,我不知道按钮和视图将可用。这将是我的框架的用户来决定。我需要做的是给他们一个方法来添加一个按钮到工具栏。点击此按钮时,视图将加载。它看起来像我的视图模块构造函数不会调用,直到我调用RegionManager.RegisterViewWithRegion ...我想更好地控制我的视图模块的生命周期。希望更清楚。谢谢 – user630190 2012-01-11 08:41:15

+0

为什么按钮会“神奇地”出现还有点不清楚?如果让用户选择可用的内容,而不是在将代码写入“RegisterViewWithRegion”时使用这些设置,并显示适当的按钮。 – katit 2012-01-11 14:09:13

+0

嗨凯蒂,我正在写的是一个通用的框架,其中包含一个工具栏区域和一个主要区域。内容用户将采用这个框架并编写他们自己的视图模块。主要区域可以同时托管多个视图模块,并且可以以各种配置对接。我需要公开的是内容用户在工具栏上创建可以启动视图模块的按钮的方式。也许我会以错误的方式去解决这个问题,但现在它似乎可以用于定制区域行为。没有我的构造函数不会被调用。 – user630190 2012-01-11 14:35:35

0

它看起来像我可以“逼”我的观点模块的构造函数可以通过使用自定义的RegionBehaviour调用。在这里面,我可以将我的视图模块转换为特定的基本视图或接口类型,并调用一个函数。然后这将注册我的视图与工具栏,但不一定在我的应用程序的“主”区域显示视图。

感谢您的帮助。