Prism 6 区域管理器 RequestNavigate 无法导航某些区域

Prism 6 Region Manager RequestNavigate fails to navigate for some regions

我有一个用户控件,我在其中定义了多个用于注入视图的 Prism 区域。我决定使用 Prism 视图导航来处理切换 我的 "SelectedMenuContentRegion" 基于用户操作(如下所示),我 运行 遇到了问题。我确定问题出在我的使用上,但我无法弄清楚我做错了什么。我有以下用户控件,其中包含自定义 WPF 控件。

<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

这取决于您使用的自定义控件。导航窗格可能不是可视化树的一部分(或未初始化),直到稍后。 RegisterViewWithRegion 之所以起作用,是因为它会等到该区域在注入之前实现。所以这告诉我你正在尝试在区域初始化之前导航。

更新:感谢您提供示例,它有助于解决问题。老实说,我没有花任何时间去弄清楚为什么它不起作用,而是让它起作用了。您所要做的就是给您的区域一个 x:Name,然后使用代码中附带的 属性 设置区域管理器:

<ContentControl x:Name="_rightContents" />

然后在代码隐藏中:

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