2010-05-27 104 views
5

我有一個類似於Windows控制面板的小工具。該工具允許我們管理用戶,配置數據庫,管理腳本等。 主頁顯示應用程序的所有子類別。 點擊鏈接時,它將在右側面板中加載此類別的視圖,而左側小面板將顯示此類別可用的任務。簡單。棱鏡:更改活動視圖

基本上,我想要做的是有一個「情境化」狀態欄。如果您處於需要連接的視圖中,則狀態欄應顯示您的狀態。如果您處於應該顯示信息的視圖中,我希望它在我的狀態欄中顯示。

我已經把Region(名爲StatusBarRegion狀態欄在我的殼。 對於每個模塊,我註冊這個模塊的StatusBarView外殼上的區域。

現在,我要處理的語境的改變。我需要激活視野良好時,它的時間。

但每次我試圖解決StatusBarRegion,不能在大區經理的區域找到。

請參閱:

var region = _regionManager.Regions[.RegionNames.StatusBarRegion]; 
region.Activate(_container.Resolve<StatusBarView>()); 

該區域始終爲空。爲什麼 ?

謝謝你的時間。

回答

0

區域爲空的原因是什麼? 這段代碼是在初始化方法的模塊,所以用戶界面還沒有創建。

爲了最好的方式來管理我的狀態欄,我仍然想知道我將如何去做。

+0

根據PRISM團隊的說法,模塊初始化將在shell初始化後發生。看到這裏:http://msdn.microsoft.com/en-us/library/gg430868(v=pandp.40).aspx所以你的假設,沒有被創建的用戶界面,我相信是不正確的。 – 2010-12-16 23:04:46

1

雙重檢查RegionNames.StatusBarRegion如果您的shell中的區域目標已經相同,則該值爲。

如果是這樣,區域不應該爲空我認爲,除了把你的句柄放在你的view/viewmodel模塊中,並且你沒有在構造函數上得到區域管理器和容器。

讓我們來說說它在您的視圖SilverlightUserControl1處理。構造函數可能是這樣的:

private readonly IRegionManager _regionManager; 
private readonly IUnityContainer _container; 

public SilverlightUserControl1(IRegionManager regionManager, IUnityContainer container) 
{ 
    _regionManager = regionManager; 
    _container = container; 
} 

private Button1_Click(object sender, RoutedEventArgs e) 
{ 
    var statusBarView = _container.Resolve<StatusBarView>(); 
    statusBarRegion = _regionManager.Regions["StatusBarRegion"]; 

    statusBarRegion.Add(statusBarView, "StatusBarView"); 
    statusBarRegion.Activate(statusBarView); 

    // or you could remove all views in `ActiveViews` and add the view then 
    // (no need to activate) 
} 
+0

謝謝你的時間,它已被讚賞。 但正如我之前所說,該區域爲空,因爲代碼是在模塊的Initialize方法中,所以UI尚未創建,因此該區域無法解析。 這就是說,你的答案給出了使用區域的正確方式的一個很好的例子。再次感謝。 – esylvestre 2010-06-03 15:55:00

+0

使用'RemoveAll()'去激活和激活視圖,然後添加所需的視圖是否有優勢?謝謝。 – 2017-03-24 14:20:01

3

我相信你的錯誤與

region.Activate(_container.Resolve<StatusBarView>()); 

,而不是

var region = _regionManager.Regions[.RegionNames.StatusBarRegion]; 

有幾個原因,爲什麼這可能是你的問題我會給你解決方案,你可以嘗試。

首先,region.Activate()要求視圖實例已經存在於該區域。因此,從您的代碼中,我懷疑_container.Resolve<StatusBarView>()是給你一個StatusBarView的新實例,因此不會在該地區存在。

解決方案:當您在容器中註冊StatusBarView時,請考慮單例視圖。

_container.RegisterType<IStatusBarView,StatusBarView> 
    (new ContainerControlledLifetimeManager()) 

其次,必須註冊視圖類型(或手動添加)到該區域,然後才能激活。

解決方案:

_regionManager.RegisterViewWithRegion 
    (RegionNames.StatusBarRegion, typeof(IStatusBarView)); 

或者:

_regionManager.Regions[RegionNames.StatusBarRegion] 
    .Add(_container.Resolve<StatusBarView>()); 
1

我也曾有過類似的問題而回。我發佈了一個問題here,但後來發現問題及其解決方案。

我的問題是我的區域沒有在Shell中定義。查看full question and answer here

我希望這會有所幫助。