0

我有一个用户控件,其中定义了多个用于注入视图的 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 区域作为测试,并且它起作用了。我通过依赖注入获得区域管理器。关于为什么区域经理不知道其他定义的区域的任何线索?

更新 由于需要更详细的信息,我创建了一个小的独立示例来显示失败的导航。 棱镜导航示例

4

1 回答 1

3

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

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

<ContentControl x:Name="_rightContents" />

然后在代码隐藏中:

public MainWindow(IRegionManager regionManager)
{
    InitializeComponent();
    RegionManager.SetRegionManager(_rightContents, regionManager);
}
于 2017-06-15T21:45:04.510 回答