Какой шаблон использовать в приложении WPF dekstop для окна входа в систему и основного окна приложения? - PullRequest
0 голосов
/ 16 сентября 2010

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

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

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

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

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

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

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

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

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

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

Ответы [ 2 ]

1 голос
/ 16 сентября 2010

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

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

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

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

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

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

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


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

0 голосов
/ 16 сентября 2010

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...