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

时间:2017-06-15 21:10:22

标签: wpf prism prism-6

我有一个用户控件,我为注入视图定义了多个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

1 个答案:

答案 0 :(得分:2)

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

更新:感谢您的示例,它有助于解决问题。老实说,我没有花时间试图弄清楚它为什么不起作用,而是让我开始工作。您只需要为您的区域提供x:Name,然后使用代码中的附加属性设置区域管理器:

<ContentControl x:Name="_rightContents" />

然后在代码隐藏中:

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