Prism.WPF实现多个窗口区域导航

1、问题场景

WPF使用Prism.WPF、Prism.Unity组件之后,使用IOC方法创建主窗口(MainWindow):

protected override Window CreateShell()
{
    return Container.Resolve<MainWindow>();
}

在主窗口中再创建SecondWindow,

_secondWindow = container.Resolve<SecondWindow>();
_secondWindow.Show();

<Window x:Class="MyApp.Views.SecondWindow">
    <Grid Background="Black">
        <ContentControl regions:RegionManager.RegionName="SecondContentRegion"/>
    </Grid>
</Window>

之后在SecondWindow使用RegionManager进行导航管理,

复制代码
public SecondWindow(
    IContainerExtension container,
    IRegionManager regionManager
)
{
    InitializeComponent();

    _regionManager = regionManager;
    _control1 = container.Resolve<Control1>();
    _control2 = container.Resolve<Control2>();
}

private void SecondWindow_OnLoaded(object sender, RoutedEventArgs e)
{
    _region = _regionManager.Regions["SecondContentRegion"];
    _region?.Add(_control1);
    _region?.Add(_control2);
    _region?.Activate(_control1);
}
复制代码

代码执行到“_region = _regionManager.Regions["SecondContentRegion"];”时就会出现System.Collections.Generic.KeyNotFoundException异常,即:The region manager does not contain the SecondContentRegion region.

2、解决方法

出现上述问题的原因是系统当前通过IOC注册的IRegionManager是在执行CreateShell()时创建的,它被注册到MainWindow中。因此,在SecondWindow中再创建一个IRegionManager实例,将该实例和SecondWindow绑定即可。

在SecondWindow的构造函数中处理如下:

复制代码
public SecondWindow(IContainerExtension container)
{
    InitializeComponent();

    _regionManager = container.Resolve<IRegionManager>();
    _control1 = container.Resolve<Control1>();
    _control2 = container.Resolve<Control2>();

    //设置区域后重新刷新
    RegionManager.SetRegionManager(this, _regionManager);
    RegionManager.UpdateRegions();
}
复制代码
posted @   xhubobo  阅读(37)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
点击右上角即可分享
微信分享提示