2011-12-02 52 views
5

Tôi đang tìm một "thực hành tốt nhất" (nếu có tốt nhất) để tắt một ứng dụng WPF có sử dụng MEF và PRISM4. Cuối cùng, tôi đang tìm một loại "Close Service" sẽ quản lý tất cả các sự kiện/chỉ huy từ Shell cho bất kỳ viewmodel nào (hoặc các thuê bao khác) muốn xác minh OK là đóng ứng dụng. Trình tổng hợp sự kiện là cách sạch nhất? Các ý kiến ​​/ lựa chọn khác?Tắt ứng dụng duyên dáng bằng WPF PRISM 4

Lý tưởng nhất, tôi muốn có một nút trên ToolbarView trong ToolbarRegion của tôi (1 trong 2 vùng trong Shell của tôi). Nút này sẽ gọi một lệnh trên ToolbarViewModel của tôi (tham khảo một lệnh trên ToolbarControler của tôi) mà lần lượt sẽ làm 2 điều (tôi nghĩ?) ... Đầu tiên, thông báo cho tất cả các thuê bao rằng nó đóng cửa thời gian và cho phép bất kỳ người trong số họ hủy đóng và ... thứ hai, nếu không hủy, bằng cách nào đó thông báo cho trình bao đóng lại. Chế độ tắt máy của ứng dụng của tôi được đặt thành "ShutdownMode.OnMainWindowClose" vì vậy nếu Shell đóng, tôi sẽ được đặt tất cả.

Ai đó có thể giúp tôi với điều này không?

Trả lời

3

Tôi developping một ứng dụng lớn sử dụng những thứ giống nhau: MEF và PrismV4

tôi xử lý tắt máy nó một chút khác nhau:
in the Shell, có một "Tools" Region, tắt máy cho điều đó được xử lý ngay trong Shell, trong sự kiện gần.
Sau đó, đối với tất cả mọi thứ được tiêm trong khu vực khác, đó là một tabcontrol, tôi đúc nội dung như IDisposable, và đóng từng tab một. (Trên thực tế, nó không phải là một tabcontrol, nó là một thành phần avalondock, nhưng nó là cùng một điều thực sự).
Tất nhiên, bạn sẽ phải triển khai IDisposable trên mọi lớp có tham chiếu v.v. để vứt bỏ, nhưng thật khó để nghĩ ra một "cách tắt gọn gàng" mà không định nghĩa giao diện đó đúng không? =)

Bây giờ, về EventAggregator: bạn có thể gặp rắc rối, vì không có khớp nối: bạn có thể bắn một sự kiện yếu qua nó, nhưng bạn không thể đợi đối tượng làm công việc của họ sau đó.
Và sau đó, bạn không thể thực hiện một cơ chế để hủy bỏ việc tắt máy.

Trong trường hợp bạn muốn quan điểm khác nhau của bạn để có thể hủy bỏ việc tắt máy, tôi đề nghị bạn tạo ra một giao diện với một phương pháp duy nhất trong nó:

public interface IShutdownAware 
{ 
    bool CanShutdown(); 
} 

Sau đó, ngay trước khi bạn gọi vứt bỏ, gọi CanShutdown(); nếu họ tất cả trở lại đúng, tiến hành xử lý, nếu không, hủy bỏ quá trình tắt máy.

+0

Tôi thích phương pháp này, nhưng tôi vẫn còn câu hỏi. Làm thế nào để bạn theo dõi các chế độ xem đang hoạt động của bạn (hoặc xem các mô hình)? Bộ sưu tập nào bạn lặp lại để gọi "CanShutdown()"? Bạn có sử dụng IRegionManager và truy vấn chế độ xem đang kích hoạt không? – Thelonias

+1

Vì bạn làm điều đó trong Shell, bạn có thể chỉ cần truy vấn nội dung của các phần tử bố cục khác nhau mà bạn có trong Shell và lặp qua chúng. Nó có thể có thể với IRegionManager là tốt, hãy thử và xem những gì làm việc tốt nhất trong kịch bản của bạn. –