Какой шаблон используется в настольном приложении WPF для окна входа в систему и главного окна приложения?

Во-первых, мы в C#, WPF, настольном приложении (может быть .NET 3.5).

Мне нужно показать окно входа в систему при запуске приложения, если вход в систему выполнен успешно, скрыть окно входа и показать главное окно приложения. Кроме того, при закрытии главного окна снова должно появиться окно входа в систему. Если окно входа закрыто, приложение закрывается.

Бонус, чтобы усложнить задачу: когда установлен флажок «Запомнить пользователя», окно входа в систему пропускается, и пользователь входит в систему автоматически, отображая главное окно сразу. (пожалуйста, не думайте о том, как хранится параметр, предположим, что вы просто знаете его и имеете значение в переменной).

Что должно быть точкой запуска приложения (означает, какое окно считается в свойстве app.xaml StartupUri)?

Как бы вы решили архитектуру? Лучший способ использовать событие App_Startup и показать какое-то окно с этой точки?

Какой тип App.ShutdownMode вы бы использовали? И как это будет работать? Вы можете использовать «OneLastWindowClose», «OnMainWindowClose» или «OnExplicitShutdown». Каков ваш выбор и почему?

В общем, меня интересует, «что вызывает что, что такое «корень» приложения, что вызывает закрытие приложения».

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

Спасибо за ваш вклад.

P.S.: Я использую инфраструктуру MVVM, что делает ее немного более запутанной, но смысл остается. Я также использую Ninject в качестве IoC, но эта проблема, конечно, остается. Я не упомянул эту информацию, чтобы сделать вопрос как можно более ясным. Я также должен обрабатывать исключения (связь с сервером или базой данных во время входа в систему может завершиться неудачно), и, чтобы сделать это действительно интересным, я должен показать интерактивную «заставку», указывающую, что делает приложение (загрузка, связь с сервером, автологин). Но, пожалуйста, держитесь подальше от этих требований на данный момент, мы можем обсудить их позже.


person Pz.    schedule 16.09.2010    source источник


Ответы (2)


Я собираюсь повторить ваши вопросы, как я их понимаю, вы можете поправить меня, где я что-то упустил. Кроме того, я новичок во всем, что касается M-V-VM, так что прислушайтесь к моему совету с долей скептицизма. Лучший известный мне способ учиться — это выбрасывать свои идеи и просить их исправить.

Вы хотите знать вещи 1) Где должна существовать логика, чтобы решить, где показывать вход в систему или главное окно 2) Какой режим выключения использовать 3) Что такое корень приложения

1) Я считаю, что решение показать логин или автоматический вход в систему является бизнес-логикой, поэтому должно жить в модели вашей структуры M-V-VM. Как только эта логика реализована, представление может отображать любое требуемое окно, запрашивая Модель.

Я предполагаю, что ваше приложение имеет файлы App.xaml и App.cs, которые запускаются при выполнении приложения. Вы можете переопределить OnStartup в App.cs и отобразить любое окно, которое необходимо, на основе результатов бизнес-логики (которые получены при использовании некоторого объекта в вашей модели).

2) Для модели выключения я бы, вероятно, выбрал OnLastWindowClose, но я понятия не имею, сколько окон использует ваше приложение. Я предполагаю только два, которые вы упомянули (логин и основной).

3) Что такое корень приложения? Я бы сказал, что ваша модель на самом деле является корнем приложения, поскольку она содержит все важные вещи (представление — это пользовательский интерфейс для модели, модель представления — это состояние для представления). Итак, когда дело доходит до того, что является корнем или сущностью вашего приложения, я бы сказал, что это некоторый набор объектов в вашей модели.

Что вызывает что? Все будет зависеть от того, чего вы пытаетесь достичь. В общем, я избегаю, чтобы модель представления знала что-либо о представлении. И представление, и модель представления могут знать о модели. В некоторых случаях вы захотите использовать Ninject в качестве диспетчера служб, чтобы внедрить представление в модель представления (не заставляя модель представления зависеть от представления).


Совершенно другим подходом было бы полное отсутствие окна входа в систему и отображение метода входа в главное окно. Вам по-прежнему понадобится некоторый объект модели, чтобы сообщить вам, когда отображать приглашение для входа в систему, но вам не придется беспокоиться о жонглировании окнами. Честно говоря, я бы, наверное, пошел по этому пути. WPF предоставляет нам множество интересных и привлекательных способов выполнить эту задачу.

person Ed Gonzalez    schedule 16.09.2010

Объект Application является корнем любого проекта WPF. Вы правы в том, что вы можете обработать событие App_Startup - в зависимости от того, что вам нужно делать при запуске, конечно.

В зависимости от того, нужна ли вам более сложная структура навигации или приложение будет навсегда ограничено описанным вами сценарием, вы можете пойти разными путями.

Что я делаю в приложениях, над которыми работаю, так это создаю объект Navigator, который обрабатывает навигацию как между разными окнами, так и внутри окон, затем я просто вызываю Navigator.Navigate(new MyViewModel(), NavMode.ReplaceWindow);, который закрывает предыдущее «главное» окно (если оно открыто) и отображает новый, установив содержимое в экземпляр моей ViewModel. Затем ViewModel отображается с использованием правильных шаблонов. Я также могу использовать NavMode.ReplaceUserControl, который заменяет содержимое текущего «главного» окна, или NavMode.OpenModalWindow, который отображает модальный диалог. Мой ShutdownMode установлен на OnLastWindowClose, так как я всегда могу вызвать App.Shutdown(), если я хочу закрыться независимо от открытых окон.

Конечно, когда вы заменяете окна, вам необходимо создать экземпляр (не показать, просто создать экземпляр) нового окна перед закрытием старого, чтобы избежать закрытия приложения, потому что у вас больше нет окон.

Вы могли бы сделать что-то подобное, но это просто идея, и она заточена специально под мои требования.

person Alex Paven    schedule 16.09.2010