一个视图MVVM / Prism / WPF上2个区域中同一视图的多个示例

omvjsjqw  于 2023-05-08  发布在  其他
关注(0)|答案(1)|浏览(256)

我也有类似的问题但不明白这页上的答案。
Am I doing it correctly do deal with multiple instances of same view in MVVM / Prism / WPF
我想做的是以下几点。
我有一个主窗口的主要应用程序,在那个窗口上我有一个tabcontrol,它有一个叫做tabregion的区域。
然后我有我有一个模块与mainView与2区域'region1'和'region2'和这个视图中的tabcontrol加载在主窗口.
然后我有一个视图(VideoPanel)女巫是非常大(流摄像头的视图)我真的很想有机会流2个摄像头(或更多)在一个页面上具有相同的视图(VideoPanel),所以我想加载视图(Videopanel)到区域1和2。
这就是我现在在模块中所做的

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

    }

它可以工作,但并不完美。因为我使用的一些设置是混乱的。
然后,我尝试在加载mainView时加载区域中的视图(VideoPanel),然后向其添加参数

<i:Interaction.Triggers>
        <i:EventTrigger EventName="Loaded">
            <i:InvokeCommandAction Command="{Binding LoadedCmd}" PassEventArgsToCommand="True" />
        </i:EventTrigger>
    </i:Interaction.Triggers>
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)中不起作用,所以我没有得到我想发送给我的视图模型的ID。
我希望你能理解我的问题,因为我的英语不是很好。

b4wnujal

b4wnujal1#

因为我是你所链接的帖子的作者,我将尝试解释我是如何在我们的应用程序中完成的。
首先要确保ViewModel实现了INavigationAware,但就你的帖子而言,你似乎已经实现了。
然后,我们已经在模块中注册了用于导航的视图

public void RegisterTypes(IContainerRegistry containerRegistry)
{
     containerRegistry.RegisterForNavigation<Axes2View>();
}

因此,如果您删除了RegisterViewWithRegion,则需要在您拥有regionManager的某个位置进行调用(例如通过依赖注入)

regionManager.RequestNavigate(regionName, viewName, navParameters);

根据您放置这些调用的位置(每个示例一个),您应该有一个标记,以便在每个区域只执行一次导航。请注意,区域可能不会创建得太早。
最后,在Viewmodel中,您可以在IsNavigationTarget中管理参数,以便在需要时创建新示例,也可以在OnNavigatedTo中管理参数,具体取决于如何处理参数。

相关问题