You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WPF/Prism/MVVM中同一视图多实例加载及导航传参问题

多实例加载同一视图的MVVM/Prism/WPF问题处理

需求说明

  • 主应用MainWindow的TabControl中存在tabregion区域
  • 某模块的mainView包含region1和region2两个区域,该mainView会加载到主窗口的TabControl中
  • 需在这两个区域内加载同一个VideoPanel视图(用于摄像头流播放的大型视图),实现同时播放2个及以上摄像头画面

已尝试的实现方式及遇到的问题

方式一:模块初始化阶段注册视图到区域

在模块的初始化方法中直接将VideoPanel注册到目标区域:

public void OnInitialized(IContainerProvider containerProvider)
{
    var regionManager = containerProvider.Resolve<IRegionManager>();
    regionManager.RegisterViewWithRegion("Video1Region", typeof(VideoPanel));
    regionManager.RegisterViewWithRegion("Video2Region", typeof(VideoPanel));
}

此方法可正常运行,但会出现部分设置混乱的问题。

方式二:通过导航传递参数加载视图

在mainView的XAML中添加加载事件触发命令:

<i:Interaction.Triggers>
    <i:EventTrigger EventName="Loaded">
        <i:InvokeCommandAction Command="{Binding LoadedCmd}" PassEventArgsToCommand="True" />
    </i:EventTrigger>
</i:Interaction.Triggers>

在mainView的ViewModel中实现加载命令,通过导航传递不同的摄像头ID参数:

private void LoadedCmd(RoutedEventArgs args)
{
    var par1 = new NavigationParameters
    {
        { "Id", 1 }
    };

    _regionManager.RequestNavigate("Region1", nameof(VideoPanel), par1);

    var par2 = new NavigationParameters
    {
        { "Id", 2 }
    };

    _regionManager.RequestNavigate("Region2", nameof(VideoPanel), par2);
}

此方法下,VideoPanel的NavigationAware功能未生效,无法获取传递给其ViewModel的Id参数。

内容的提问来源于stack exchange,提问作者A.Pols

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 11:42:58