2011-05-16 44 views
1

我們使用Castle Windsor和Prism 4(2010年2月)。我們使用Windsor引導程序,使Castle在CompositeWPFContrib包中發佈的Prism中發揮出色。棱鏡4 RegionManager在WPF中添加第二個區域時丟失第一個區域

我想在我的主殼牌的XAML上定義區域。如果我定義一個區域,像這樣:

<ContentControl prism:RegionManager.RegionName="{x:Static core:RegionNames.ToolBarRegion}" 
        DockPanel.Dock="Top"/> 

,然後做在我的模塊之一以下初始化方法:

_regionManager.Regions[RegionNames.ToolBarRegion].Add(typeof(SomeView)); 

...生活是美好的。

但是,只要我在殼牌的XAML添加其他區域:

<ContentControl prism:RegionManager.RegionName="{x:Static core:RegionNames.WorkspaceRegion}" 
        DockPanel.Dock="Bottom"/> 

然後執行:

_regionManager.Regions[RegionNames.WorkspaceRegion].Add(typeof(SomeOtherView)); 

...我得到的錯誤:「該地區管理者不知道包含ToolBarRegion區域。「

什麼給?只要我註釋掉第二個區域,就會找到第一個區域,當我將第二個區域添加回來時,就好像RegionManager拒絕持有區域集合一樣。應該說這是我第一次進軍溫莎城堡和棱鏡城,所以我不會錯過這裏可怕的東西。任何可以擺脫的光線都是最有幫助的。

回答

0

你確定它是你添加控件的DockPanel嗎?也許你的容器是一個內容控件本身(只接受一個孩子的控件)?

此外,您可以嘗試在引導程序註冊您的區域經理:

RegionManager.SetRegionManager(shell, this.Container.Resolve<IRegionManager>()); 

請參見下面的問題:

Cannot find Region in RegionManager (using PRISM)

WPF, Prism v2, Region in a modal dialog, add region in code behind

編輯

我看了一下示例解決方案(註釋中的鏈接),發現您的視圖注入代碼在主視圖創建之前得到執行。您的模塊初始化器在StartRuntime-> CreatePrismBootStrapper中被調用,而DisplayRootView(它將創建您的shell)稍後調用。當然,當shell尚未創建時,它無法找到該區域。

如果你想在模塊初始化代碼中註冊你的子控件,查看發現更合適 - 它不需要你的殼已經創建。當您需要根據用戶輸入切換視圖時,查看注入更好(在這種情況下,確保包含控件已註冊由您決定)。

您有幾種選擇:

  1. 使用視圖發現 - 當你在樣品溶液一樣。

  2. 在加載模塊之前創建並註冊您的Shell實例。 base.DisplayRootView()應該能夠在容器中找到它,所以它不會創建另一個。一種方式做,但我不知道最好的:

PrismBootstrapper.cs:

protected override DependencyObject CreateShell() 
{ 
    Thor.Application.Views.ShellView view = new Thor.Application.Views.ShellView(); 
    _container.Register(Castle.MicroKernel.Registration.Component.For<Thor.Application.Views.ShellView>().Instance(view)); 
    // _container.Resolve<Thor.Application.Views.ShellView>(); 

    return view; 
} 

0.3。在base.DisplayRootView之後CreatePrismBootstrapper()?它不工作,在服務定位器(NullPointerException異常,我不知道這是否會有效,因爲我不是很熟悉使用你除了棱鏡圖書館...

希望這有助於...

+0

有一個MainShellView,它是應用程序的Shell,MainShellView是一個MainSiteView,它是一個UserControl,它包含上面提到的DockPanel,它包含兩個ContentControl。如果在MainShellView中註冊它沒有找到任何區域,則在MainSiteView上註冊它會顯示所描述的行爲 – Scott 2011-05-16 21:55:16

+0

您確定不要在MainSiteView上使用MainShellView嗎?不要嵌套你的地區?嘗試添加一個簡單的控制到DockPanel並查看它是否在添加區域後保持在那裏。也許當第二個區域被添加時,它會從DockPanel中刪除所有其他控件,就好像DockPanel是實際的區域一樣? – surfen 2011-05-16 22:46:01

+0

這裏是heirarchy: 我們的MainWindow是一個Actipro RibbonWindow,我們在引導程序中手動創建。 MainWindow的內容設置爲MainShellView,它是一個UserControl,它具有兩個重疊的ContentControl,一個用於工作區,另一個用於對話框。 Workspace ContentControl在啓動時被設置爲MainSiteView。 MainSiteView有兩個ContentControls,一個是ToolBarRegion,另一個是WorkspaceRegion。我試着用MainWindow,MainShellView和MainSiteView註冊RM,並總是得到這個問題。一個地區有效,兩個地區失敗。 – Scott 2011-05-17 15:52:52