2011-02-26 86 views
19

我建立一個演示應用程序來學習棱鏡4的導航功能的應用程序有兩個模塊 - 每一個有三種意見:棱鏡4:RequestNavigate()不工作

  • 一個用戶控件與文本塊( 「歡迎到模塊A」)
  • 甲RibbonTab(使用區域適配器),和
  • 的Outlook風格任務按鈕(例如Outlook的郵件,日曆等)

殼牌有三個命名區域:「RibbonRegion」,「TaskB」 uttonRegion「和」WorkspaceRegion「。視圖加載到這些區域。爲了測試基本設置,我使用Prism Region Manager註冊了所有三個視圖,以便它們在啓動時加載,並且按預期工作。

接下來,我修改了安裝程序,以便在啓動時只加載任務按鈕。其他視圖只會根據請求加載,方法是單擊任務按鈕。我的模塊初始化是這樣的:

public void Initialize() 
{ 
    /* We register the Task Button with the Prism Task Button Region because we want it 
    * to be displayed immediately when the module is loaded, and for the lifetime of 
    * the application. */ 

    // Register Task Button with Prism Region 
    m_RegionManager.RegisterViewWithRegion("TaskButtonRegion", typeof(ModuleATaskButton)); 

    /* We register these objects with the Unity container because we don't want them 
    * instantiated until we navigate to this module. */ 

    // Register View and Ribbon Tab as singletons with Unity container 
    m_Container.RegisterType(typeof(ModuleAView), "ModuleAView", new ContainerControlledLifetimeManager()); 
    m_Container.RegisterType(typeof(ModuleARibbonTab), "ModuleARibbonTab", new ContainerControlledLifetimeManager()); 
} 

當用戶點擊任務按鈕,它調用調用IRegionManager.RequestNavigate()顯示視圖一個ICommand對象:

的命令被調用時任務按鈕被點擊,但我所得到的是這樣的:

Demo app screen shot

的用戶控件加載顯然爲System.Object,我懷疑RibbonTab加載的是相同的。我認爲問題出在我的RequestNavigate()電話上,或者我在Unity中註冊。但我無法確定問題。

任何人都可以闡明發生了什麼嗎?謝謝你的幫助。

+0

你介意檢查一下嗎? http://stackoverflow.com/questions/18309661/navigation-not-occurring – 2013-08-19 08:43:35

回答

28

終於想出了這一個。答案在Microsoft Prism開發人員指南(Ver 4),第120-121頁。它有兩個部分:

首先,UserControlRibbonTab對象從Unity解析爲System.Object類型。這是Unity的侷限性,也是我用來註冊視圖對象的重載。爲了讓他們下定決心,正確的類型,您需要使用不同的過載IUnityContainer.RegisterType()

// Register other view objects with DI Container (Unity) 
m_Container.RegisterType<Object, ModuleAView>("ModuleAView"); 
m_Container.RegisterType<Object, ModuleARibbonTab>("ModuleARibbonTab"); 

此重載地圖統一的原始分辨率System.Object到正確的類型要求的視圖。請參見第29頁的註釋。 開發人員指南

第二個問題沒有在我的問題中明確說明,但當我解決第一個問題時發生。當我切換到其他模塊時,我希望每個模塊的RibbonTab都被刪除。由於我的Ribbon Region的行爲類似於ItemsControl,所以最後都顯示了RibbonTabs - 當我切換到模塊B時,模塊A的RibbonTab未卸載。爲了解決該問題,我在RibbonTab類上實現了IRegionMemberLifetime。這個問題已經在p。 開發人員指南

順便說一下,我在View對象上實現了IRegionMemberLifetime接口,而不是它們的View Models,因爲接口不會影響應用的後端,只有視圖對象。

+3

+1你剛剛度過了我的一天。完全是我的問題。 Plus解決方案:-) – 2011-07-07 13:36:46

+2

感謝您回答您的問題,以便我們都可以看到結果。 – Thelonias 2011-12-02 18:38:23

+0

是的,它爲我工作。但問題是,如果我需要註冊類型接口的視圖爲g:registerType (「ViewA」);它遇到了同樣的問題,我們如何解決它 – WPFKK 2014-10-24 15:19:01