【问题标题】:Prism 6 Region Manager RequestNavigate fails to navigate for some regionsPrism 6 区域管理器 RequestNavigate 无法导航某些区域
【发布时间】:2017-06-17 00:52:16
【问题描述】:

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

【问题讨论】:

    标签: wpf prism prism-6


    【解决方案1】:

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

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

    <ContentControl x:Name="_rightContents" />
    

    然后在代码隐藏中:

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

    【讨论】:

    • 我会深入研究它们是否被实现。使用 VS2017 工具显示实时可视化树,ContentControls 显示在列表中,但区域似乎不包含在区域管理器中。导航请求是由于用户单击列表框项而发生的,因此它是在应用程序的启动/初始化发生后完成的。
    • 在展开导航窗格之前,可能不会将内容控件添加到可视化树中。只是猜测。
    • 当我发出导航命令时,内容控件打开。我将尝试将我所拥有的内容缩减为一个独立的示例。
    • 我整理了一个独立的样本,位于:github.com/robgoodwin/samples.git。我确信这一定是我按照您的建议处理自定义控件的方式,但尚未找到解决方案。感谢您的宝贵时间。
    • 感谢您的样品。查看我的更新回复。它现在可以工作了:)
    猜你喜欢
    • 1970-01-01
    • 2012-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多