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);
}
我有一个用户控件,我在其中定义了多个用于注入视图的 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);
}