MVVM 模式是一种很好的方法。您可以将单个外部 Window 制作为一个外壳,该外壳可以换入和换出代表 windowA 和 windowB 功能的 UserControl。实现 MVVM 的答案有点多; here 是一个基本实现的好主意,对于您想要做的事情来说已经足够了。
假设:
1) 您正在实施 MVVM,并且
2) 您的主“shell”窗口有一个视图模型和 Window,“子窗口”有一个视图模型和 UserControl。
无论如何,在主窗口的视图模型中,您需要为子视图的视图模型设置一个属性,如下所示:
private object currentView;
public object CurrentView
{
get{ return this.currentView;}
set
{
this.currentView = value;
RaisePropertyChanged("CurrentView"); //assumes you've implemented an MVVM pattern with a method to notify the view when a property has changed like the link above
}
然后在 XAML 中,为每个子视图添加数据模板:
这就是说,“如果此视图中的某些内容绑定了一个值为 WindowAViewModel 的属性,则在其位置显示 WindowAView。”
然后您将 ContentControl 绑定到 CurrentView 属性:
<ContentControl Content="{Binding CurrentView}"/>
最后,在您的主窗口视图模型代码中,当您想要切换到 A 或 B 视图时,您只需执行以下操作:
this.CurrentView = new WindowAViewModel(); //along with whatever initialization needs to occur
由于该属性设置为在更改时通知,它会通知视图 CurrentView 中有新内容,并且 DataTemplates 告诉主窗口要为新内容呈现什么。