Prism 库 - 在视图中获取范围区域

时间:2021-06-01 14:45:14

标签: wpf prism

我提出这个问题是为了了解 Prism 库中的最佳实践。

基本上,我有一个 MainView(定义了范围区域)。在下面的代码片段中,我将 MainView 注册为 Singleton,我这样做是为了解决并控制 Scoped RegionManager。但在解决问题上,它再次构建 MainView 实例。这真的很令人困惑,我不明白为什么?

之前我的方法是从 NavViewA.xaml 内导航到视图(例如 ViewA.xaml --> TabNavigationRegion, MainViewModel --> TabContentRegion)(其中作用域 RegionManager 可用),但后来我看到 @BrianLagunas 视频,解释此类绑定应进入 OnInitialized,而不是从 ViewModel 中导航的视图(这是错误的方法)。

关于我如何解决这个问题的任何说明。

public void OnInitialized(IContainerProvider containerProvider)
{
    _regionManager.RequestNavigate<MainView>(RegionNames.TabRegion);

    // here wanna get hold on ScopedRegionManager of MainView to do this
    var view = containerProvider.Resolve<MainView>();
    // but this above statement create a new instance of MainView despite being marked Singleton in RegisterTypes
    var scopedRegionManager = RegionManager.GetRegionManager(view);
    scopedRegionManager.RequestNavigate<NavViewA>(RegionNames.TabNavigationRegion);
    scopedRegionManager.RequestNavigate<ViewA>(RegionNames.TabContentRegion);
}

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

主视图.xaml

<UserControl x:Class="PrismDemo.Module.Core.Views.MainView"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:prism="http://prismlibrary.com/"
    xmlns:views="clr-namespace:PrismDemo.Core.Views;assembly=PrismDemo.Core"
    prism:ViewModelLocator.AutoWireViewModel="True">
    <Grid>
        <views:TabItemView />
    </Grid>
</UserControl>

TabItemView.xaml

<UserControl x:Class="PrismDemo.Core.Views.TabItemView"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:PrismDemo.Core"
    xmlns:prism="http://prismlibrary.com/"
    prism:ViewModelLocator.AutoWireViewModel="False">
    <UserControl.Resources />
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="1*" MinWidth="40" />
            <ColumnDefinition Width="2" />
            <ColumnDefinition Width="3*" />
        </Grid.ColumnDefinitions>
        <ContentControl Grid.Column="0" prism:RegionManager.RegionName="{x:Static local:RegionNames.TabNavigationRegion}" />
        <GridSplitter Grid.Column="1" Style="{StaticResource GridSplitterStyle}" />
        <ContentControl Grid.Column="2" prism:RegionManager.RegionName="{x:Static local:RegionNames.TabContentRegion}" />
    </Grid>
</UserControl>

0 个答案:

没有答案
相关问题