2017-06-15 54 views
0

我有一個用戶控件,我有多個棱鏡區域定義注入視圖。我決定使用Prism視圖導航來處理根據用戶操作(如下所示)切換 我的「SelectedMenuContentRegion」,並且遇到了問題。我相信問題出在我的用法上,但我一直無法弄清楚我做錯了什麼。我有以下用戶控件,其中包含一個自定義的WPF控件。棱鏡6區域管理器RequestNavigate無法導航的一些區域

<Grid> 
    <commonwpfcontrols:NavigationPane Background="{StaticResource SecondaryColorBrush}" IsExpanded="False" MenuItems="{Binding MenuItems}"> 
    <commonwpfcontrols:NavigationPane.Content> 
     <ContentControl prism:RegionManager.RegionName="MapRegion"/> 
    </commonwpfcontrols:NavigationPane.Content> 
    <commonwpfcontrols:NavigationPane.SelectedMenuContent> 
     <ContentControl prism:RegionManager.RegionName="SelectedMenuContentRegion"/> 
    </commonwpfcontrols:NavigationPane.SelectedMenuContent> 
    </commonwpfcontrols:NavigationPane> 

    <Grid> 
    <ContentControl prism:RegionManager.RegionName="ApplicationOverlay"/> 
    </Grid> 

有定義3個區域。如果我做標準

mRegionManager.RegisterViewWithRegion("SelectedMenuContentRegion",() => mUnityContainer.Resolve<MapSettingsView>()); 

它能正常工作,但是,如果我註冊的觀點像以下導航:

mUnityContainer.RegisterTypeForNavigation<MapSettingsView>(); 

,然後嘗試晚些時候導航

mRegionManager.RequestNavigate("SelectedMenuContentRegion ", "MapSettingsView", NavigationComplete); 

失敗。我在調試器中注意到區域管理器只有區域列表中的「ApplicationOverlay」區域。因此,我將我正在導航的區域更改爲ApplicationOverlay區域作爲測試,並且工作正常。我通過依賴注入來獲得區域經理。關於爲什麼區域經理不知道其他定義區域的任何線索?

更新 由於需要更詳細的信息,我創建了一個小的獨立樣本,顯示失敗的導航。 Prism Navigation Sample

回答

1

這取決於您使用的自定義控件。有可能導航窗格不在可視樹的一部分(或初始化),直到後來。 RegisterViewWithRegion的工作原因是因爲它在注入之前一直等到該區域已經實現。所以這告訴我你正試圖在區域初始化之前導航。

更新:感謝您的示例,它有助於回購問題。老實說,我沒有花時間去弄清楚爲什麼它不起作用,但我只是把它工作。所有你需要做的是給你的區域的X:名稱,然後在代碼中使用附加屬性設置區域經理:

<ContentControl x:Name="_rightContents" /> 

然後在後臺代碼:

public MainWindow(IRegionManager regionManager) 
{ 
    InitializeComponent(); 
    RegionManager.SetRegionManager(_rightContents, regionManager); 
} 
+0

我會挖弄清楚它們是否被實現。使用VS2017工具顯示活動的可視化樹,ContentControls顯示在列表中,但區域似乎不包含在區域管理器中。導航請求是由於用戶單擊列表框項目而發生的,因此在應用程序啓動/初始化發生之後完成。 –

+0

在導航窗格展開之前,內容控件可能不會添加到可視化樹中。只是一個猜測。 –

+0

當我發出命令導航時,內容控件已打開。我會盡力削減我已經成爲一個獨立的例子。 –