Как я могу контролировать поток окон в приложении WPF, используя Caliburn Micro - PullRequest
3 голосов
/ 27 апреля 2011

Я только что начал реализовывать свое приложение WPF с помощью фреймворка Caliburn Micro (это мой первый раз с ним).

Я настроил класс AppBootstrapper и все работает (отображается мое главное окно),но теперь я хотел бы добиться более сложного поведения моего приложения.В начале я хотел бы показать только Заставка (он загрузит некоторые данные из сервиса).После этого я хочу показать только окно LogIn , и если пользователь входит в систему, мое окно Main должно отображаться.

Говоря другим словом, я бы хотелдобиться такого вида потока окна:

Экран-заставка -> Окно входа в систему -> Главное окно

Я пытался реализовать что-то вроде ShellController, которое получилось бы из Conductor<IScreen>.Collection.OneActive или Conductor<IScreen>, но я не знаю, как это сделать без View for the Shell (это должен быть только контроллер для всего приложения).

Моя другая идея - переопределить метод DisplayRootView в AppBootstrapper и тамиспользуйте IWindowManager, чтобы показать окна.Это хороший подход?

Буду очень признателен за любую помощь или предложения.

Ответы [ 5 ]

8 голосов
/ 27 апреля 2011

Да переопределяет DisplayRootView и использует IWindowManager для отображения различных экранов / моделей просмотра.

Примерно так:

var windowManager = IoC.Get<IWindowManager>();
windowManger.ShowDialog(IoC.Get<SplashScreenViewModel>());
if(windowManger.ShowDialog(IoC.Get<LoginViewModel>()))
{
   windowManger.ShowWindow(IoC.Get<ShellViewModel>());
}
7 голосов
/ 07 июля 2011

В Caliburn Micro v1.1 метод DisplayRootViewFor() был изменен на статический.Рекомендуемый подход теперь состоит в том, чтобы переопределить метод OnStartup() в вашем Bootstrapper, чтобы показать требуемые заставки или экраны входа в систему.

6 голосов
/ 25 мая 2011

Чтобы избежать выхода из приложения после вызова TryClose() в LoginViewModel, попробуйте это: В вашем App.xaml установите ShutdownMode="OnExplicitShutdown" и вызовите Application.Shutdown(); в конце DisplayRootView.

3 голосов
/ 27 апреля 2011

Да, вы правы в отношении DisplayRootView.Я рекомендую вам переопределить этот метод и реализовать там свое поведение.Вы можете использовать IWindowManager напрямую, чтобы показать окна.Если ваша логика важна, вы, возможно, захотите абстрагировать ее в простой контроллер, который может организовать события запуска.

0 голосов
/ 29 апреля 2011

Я пытаюсь завершить тот же рабочий процесс, что и исходный плакат, однако, когда я вызываю TryClose в LoginViewModel, чтобы закрыть диалоговое окно, это, похоже, приводит к закрытию приложения, закрывая оболочку, как только она открывается.

Каков подходящий метод, чтобы закрыть LoginDialog, чтобы позволить приложению продолжать работу по желанию?

...