2012-01-10 28 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調用。在這裏面,我可以將我的視圖模塊轉換爲特定的基本視圖或接口類型,並調用一個函數。然後這將註冊我的視圖與工具欄,但不一定在我的應用程序的「主」區域顯示視圖。

感謝您的幫助。