如何在视图中切换视图
本文关键字:视图 | 更新日期: 2023-09-27 18:26:07
我正在制作一个使用MVVM轻框架的WPF应用程序。
我想做的是在视图中创建一个登录表单,当用户在该视图中按下按钮时,它会为附加的ViewModel启动LoginCommand。从那里,我要么想启动一个新窗口来容纳应用程序的其余部分,要么简单地从同一窗口切换视图。
目前我有它,所以有一个名为MainView的视图,它内部有一个绑定到View1的内容控件。然而,要切换到View2,我需要将此按钮放在MainView上,而不是放在它所属的View1中。
有什么建议吗?
通常我会用两种方式之一:
如果登录窗口是启动应用程序前所需的一次性内容,我将把它放在Application
对象的OnStartup()
方法中
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
// Login
var login = new LoginDialog();
var loginVm = new LoginViewModel();
login.DataContext = loginVm;
login.ShowDialog();
if (!login.DialogResult.GetValueOrDefault())
{
// Error is handled in login class, not here
Environment.Exit(0);
}
// If login is successful, show main application
var app = new ShellView();
var appModel = new ShellViewModel();
app.DataContext = viewModel;
app.Show();
}
我通常的另一种方法是通过ShellViewModel
或ApplicationViewModel
来处理我的所有窗口管理。此方法使用DataTemplates
来定义每个屏幕,并使用ContentControl
作为ShellView
或ApplicationView
中当前屏幕的占位符。
我通常将其与某种事件系统相结合,如Microsoft Prism的EventAggregator
,这样它就可以侦听特定类型的消息,如OpenWindow
或CloseWindow
消息。如果你感兴趣,我有一篇关于ViewModels之间通信的博客文章,它应该能让你更好地了解事件系统的样子。
例如,我的ShellViewModel
可能从显示LoginViewModel
开始(DataTemplate
用于告诉WPF用LoginView
绘制LoginViewModel
),并且它将订阅接收类型为SuccessfulLogin
的消息。一旦LoginViewModel
广播SuccessfulLogin
消息,ShellViewModel
将关闭LoginViewModel
并用ApplicationViewModel
替换它。您可以在我关于MVVM 导航的文章中看到一个例子
将视图放在Page
元素中,在MainWindow
中创建一个Frame,并将其源指向第一个页面。
从那时起,您可以使用框架的NavigationService
将框架导航到另一个视图,就像web浏览器一样。