【发布时间】:2019-10-13 03:00:42
【问题描述】:
受this answer 的启发,我创建了一个像这样的通用 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; }
}
初始 shell 在 App.CreateShell(): 中创建:
protected override Window CreateShell()
{
return new Shell(Container.Resolve<IRegionManager>(), typeof(StartScreen));
}
这工作正常,正确的视图显示在初始外壳中。
然后我尝试从 StartScreenViewModel 创建第二个 Shell,它显示了不同的视图:
var shell = new Shell(RegionManager.CreateRegionManager(), typeof(MainScreen));
shell.Show();
这会打开一个新窗口,但它会显示与第一个窗口 (StartScreen) 相同的视图,而不是 MainScreen。我在这里做错了什么?
【问题讨论】:
-
这两个附加属性可能会相互干扰,导致有效使用了错误的区域管理器...只是猜测...您可以尝试从代码隐藏中设置所有内容吗?喜欢这里:stackoverflow.com/questions/41212881/…
-
@Haukinger 感谢您的建议。不幸的是,它没有帮助。我删除了绑定,并将 x:Name 添加到 ContentControl。然后在后面的代码中我使用了 SetRegionName 和 SetRegionManager。但它仍然以与以前相同的方式运行。现在将尝试 mm8 的建议。
-
问题:如果区域名称无关紧要,而且您只使用一个区域,为什么要使用一个区域?您可以在 shell 视图中放置一个属性
object ContentViewModel { get; }并将其绑定到内容控件。据我所知,区域的好处是导航和从任何提供一些(通过注册)的模块收集内容。如果两者都不使用,则一开始就不需要该区域。 -
好问题。我是 Prism 的新手,并尝试使事情尽可能简单(目前)。所以我也在考虑摆脱区域的东西。但我认为这样做会失去将依赖注入到我的视图模型中的好功能 - 还是我错了?
-
你错了。如果你总是有一个主窗口,你也根本不需要那些 shell 的东西。