Какъв модел се използва в настолното приложение WPF за прозорец за влизане и основен прозорец на приложението?

На първо място, ние сме в C#, WPF, десктоп приложение (може да бъде .NET 3.5).

Трябва да покажа прозорец за влизане при стартиране на приложението, ако влизането е успешно, скриване на прозореца за влизане и показване на главния прозорец на приложението. Освен това, когато главният прозорец е затворен, трябва отново да видите прозорец за влизане. Ако прозорецът за влизане е затворен, приложението се затваря.

Бонус за по-трудно: когато е отметната опцията „Запомни потребителя“, прозорецът за влизане се пропуска и потребителят влиза автоматично, показвайки незабавно главния прозорец. (моля, не мислете как се съхранява опцията, приемете, че просто я знаете и имате стойността в променлива).

Какво трябва да бъде началната точка на приложението (означава кой прозорец се счита за свойството StartupUri на app.xaml)?

Как бихте решили архитектурата? Най-добрият начин ли е да използвате събитието App_Startup и да покажете някакъв прозорец от тази точка?

Какъв тип App.ShutdownMode бихте използвали? И как ще работи това? Можете да използвате „OneLastWindowClose“, „OnMainWindowClose“ или „OnExplicitShutdown“. Какъв е вашият избор и защо?

Като цяло ме интересува "какво извиква какво, какво е 'root' на приложението, какво предизвиква затваряне на приложението".

Вече имам решение за моя проблем, което работи, но ме интересува дали някой от вас се е сблъсквал с този проблем и как го е решил? С удоволствие ще споделя моя подход, но не искам да ограничавам вашите идеи на първо място.

Благодаря ви за вашия принос.

P.S.: Използвам MVVM framework, което го прави малко по-объркано, но смисълът остава. Аз също използвам Ninject като IoC, но този проблем все още, разбира се, остава. Не споменах тази информация, за да направя въпроса възможно най-ясен. Също така трябва да обработвам изключения (комуникацията със сървъра или db по време на влизане може да се провали) и за да го направя наистина интересно, трябва да покажа интерактивен 'splashwindow', показващ какво прави приложението (зареждане, комуникация със сървъра, автоматично влизане). Но моля, стойте далеч от тези изисквания в момента, можем да ги обсъдим по-късно.


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


Отговори (2)


Ще повторя въпросите ви така, както ги разбирам, вие можете да ме поправите, когато пропускам нещо. Освен това съм доста нов в цялата работа с M-V-VM, така че приемете съвета ми с резерв. Най-добрият начин, по който знам как да уча, е да изхвърля идеите си и да ги коригирам.

Искате да знаете неща 1) Къде трябва да съществува логиката, за да решите къде да се покаже входът или главният прозорец 2) Кой режим на изключване да използвате 3) Какво е root на приложението

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