首页 > 解决方案 > Prism/WPF 中的新外壳/窗口显示错误视图

问题描述

这个答案的启发,我创建了一个通用的 Shell(Prism,WPF),如下所示:

<Window x:Class="VRMDataLogger.UI.Shell" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:prism="http://prismlibrary.com/" Title="My App" Height="450" Width="800">
    <Grid>
        <ContentControl prism:RegionManager.RegionManager="{Binding RegionManager}" prism:RegionManager.RegionName="MainShellRegion" />
    </Grid>
</Window>
public partial class Shell : Window
{
    public Shell(IRegionManager regionManager, Type contentType)
    {
        RegionManager = regionManager;
        InitializeComponent();
        RegionManager.RegisterViewWithRegion("MainShellRegion", contentType);
    }

    public IRegionManager RegionManager { get; }
}

初始外壳创建于App.CreateShell()

protected override Window CreateShell()
{
    return new Shell(Container.Resolve<IRegionManager>(), typeof(StartScreen));
}

这工作正常,正确的视图显示在初始外壳中。

然后我尝试创建第二个 Shell,StartScreenViewModel从中显示不同的视图:

var shell = new Shell(RegionManager.CreateRegionManager(), typeof(MainScreen));
shell.Show();

这将打开一个新窗口,但它显示的视图与第一个窗口 ( StartScreen) 相同,而不是MainScreen。我在这里做错了什么?

标签: wpfmvvmprismprism-7

解决方案


尝试为每个 shell 使用唯一的区域名称:

public partial class Shell : Window
{
    public Shell(IRegionManager regionManager, Type contentType)
    {
        RegionManager = regionManager;
        InitializeComponent();
        MainRegionName = Guid.NewGuid().ToString();
        RegionManager.RegisterViewWithRegion(MainRegionName, contentType);
    }

    public string MainRegionName { get; }
    public IRegionManager RegionManager { get; }

}

XAML:

<ContentControl prism:RegionManager.RegionManager="{Binding RegionManager}"
                prism:RegionManager.RegionName="{Binding MainRegionName, RelativeSource={RelativeSource AncestorType=Window}}" />

推荐阅读