Обычно я делаю это одним из двух способов:
Если перед входом в приложение требуется одноразовое окно входа, я добавлю его в метод OnStartup()
объекта Application
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 рисовать LoginViewModel
с LoginView
), и он будет подписываться на получение сообщений типа SuccessfulLogin
.Как только LoginViewModel
передает сообщение SuccessfulLogin
, ShellViewModel
закроет LoginViewModel
и заменит его на ApplicationViewModel
.Вы можете увидеть пример этого в моей статье о Навигация с MVVM