2011-12-02 10 views
5

Poszukuję "najlepszej praktyki" (jeśli jest nawet najlepsza) do czystego zamykania aplikacji WPF, która używa MEF i PRISM4. Ostatecznie, szukam jakiejś "Zamkniętej usługi", która zarządzałaby wszystkimi zdarzeniami/dowództwami od Shell do dowolnego viewmodelu (lub innych subskrybentów), który chciałby zweryfikować, czy można zamknąć aplikację. Czy agregator zdarzeń jest najczystszym sposobem? Inne opinie/opcje?Zgrabne zamknięcie aplikacji za pomocą WPF PRISM 4

Idealnie byłoby mieć przycisk na moim ToolbarView w moim ToolbarRegion (1 z 2 regionów w moim Shell). Ten przycisk wywołałby polecenie na moim ToolbarViewModel (odwołując się do polecenia na moim ToolbarControler), co z kolei spowodowałoby 2 rzeczy (chyba?) ... Najpierw powiadom wszystkich subskrybentów, że jest to czas zamknięcia i pozwól, aby któryś z nich anulował zamknięcie i ... po drugie, jeśli żadna nie anuluje, jakoś powiadomi powłokę, by się zamknęła. Tryb zamykania mojej aplikacji jest ustawiony na "ShutdownMode.OnMainWindowClose", więc jeśli Shell się zamknie, powinienem wszystko ustawić.

Czy ktoś może mi w tym pomóc?

Odpowiedz

3

jestem rozwijająca dużych aplikacji przy użyciu tej samej rzeczy: MEF i PrismV4

obsłużyć zamknięcie to nieco inaczej:
in the Shell, jest „Narzędzia” Region, wyłączanie za to jest obsługiwane dokładnie w Shell, na zamknięciu.
W przypadku wszystkiego, co zostało wstrzyknięte w innym regionie, którym jest tabControl, przesyłam zawartość jako IDisposable i zamykam każdą kartę po kolei. (Właściwie to nie jest to tabcontrol, to komponent lawinowy, ale tak naprawdę to samo).
Oczywiście, będziesz musiał wdrożyć IDisposable na każdej klasie, która ma referencje itp., Ale trudno jest myśleć o "czystym sposobie wyłączania" bez odpowiedniego interfejsu? =)

Teraz, o EventAggregatorze: możesz wpaść w kłopoty, ponieważ nie ma sprzężenia: możesz wywołać przez to słabe wydarzenie, ale nie możesz czekać, aż obiekty wykonają swoją pracę po tym.
A potem nie można było wykonać mechanizmu, który anulowałby wyłączenie.

W przypadku chcesz, aby różne widoki, aby móc zrezygnować z wyłączenia, proponuję stworzyć interfejs z jednej metody w nim:

public interface IShutdownAware 
{ 
    bool CanShutdown(); 
} 

Następnie tuż przed wywołaniem wyrzucać, zadzwoń CanShutdown(); gdyby wszystkie zwracają wartość true, kontynuuj usuwanie, w przeciwnym razie anuluj proces zamykania.

+0

Podoba mi się ta metoda, ale wciąż mam pytanie. Jak monitorujesz swoje aktywne widoki (lub wyświetlasz modele)? Jaką kolekcję robisz, by wywołać funkcję "CanShutdown()"? Czy korzystasz z aplikacji IRegionManager i wypytujesz aktywne widoki? – Thelonias

+1

Skoro robisz to w Powłoce, możesz po prostu zapytać o zawartość różnych elementów układu, które masz w Powłoce, i iterować nad nimi. Prawdopodobnie jest to możliwe również dzięki IRegionManager, spróbuj zobaczyć, co najlepiej działa w twoim scenariuszu. –

Powiązane problemy