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
相关产品推荐
相关产品推荐

