2015-10-26 17 views
6

Tôi có một ứng dụng WPF với nhiều Windows không liên quan, nghĩa là luôn có một MainWindow và nhiều tùy chọn khác không có chủ sở hữu. Nếu các cửa sổ này được nhóm trong thanh tác vụ, cửa sổ sẽ cung cấp hành động "Đóng tất cả Windows" trong menu ngữ cảnh của thanh tác vụ. Nếu được bấm, mỗi Cửa sổ ứng dụng của tôi sẽ nhận lệnh đóng riêng lẻ theo thứ tự mà tôi không thể kiểm soát.Ghi đè lên xử lý lệnh trên thanh tác vụ "Đóng tất cả Windows"

Sự cố: Một số cửa sổ của tôi có thể hỏi trước khi đóng, nếu có thể hủy các thay đổi đang chờ xử lý. Điều này là khó chịu và khó hiểu nếu có nhiều người trong số đó.

Điều tôi muốn là: Nếu MainWindow được yêu cầu đóng, tôi muốn nhắc lại một lần, nếu được. Nếu có, tất cả các cửa sổ sẽ đóng cửa âm thầm, nếu không thì vẫn mở. Nhưng MainWindow của tôi không phải là đầu tiên, để xử lý thủ tục đóng.

Tôi đã phát hiện ra rằng tôi có thể cần phải kiểm tra Windows Message Loop của MainWindow của tôi cho một số WM_SYSCOMMAND với wparam SC_CLOSE. (xem How can I distinguish between "Close All Windows" and "Close" individual windows in MFC with Windows 7?)

Nhưng làm thế nào tôi có thể đánh giá điều này, trước khi tôi thực hiện đóng cửa thường lệ cho bất kỳ cửa sổ nào khác? ComponentDispatcher.ThreadPreprocessMessage trong mainwindow của tôi đến quá muộn, nó cháy sau khi một số cửa sổ khác đã bắt đầu quy trình đóng.

Câu hỏi này được bằng cách nào đó liên quan đến cái này: Odd form closing behavior when using taskbar's Close All Windows

Trả lời

2

Cá nhân, tôi sẽ chỉ để lại những thứ như họ đang có. Tôi có thể thấy làm thế nào có một số nhắc nhở để lưu/hủy bỏ thay đổi có thể gây phiền nhiễu, nhưng nó không có vẻ khó hiểu với tôi. Và trong khi gây phiền nhiễu, nó có vẻ như một sự khó chịu nhỏ, và thẳng thắn mà có thể dạy cho người dùng không sử dụng tùy chọn "Đóng tất cả cửa sổ" khi họ đã để lại một loạt các cửa sổ mở. Điều đó nói & hellip;


Khi câu hỏi bạn đã tìm thấy chỉ ra, không có cách tích hợp để phân biệt "Đóng tất cả cửa sổ" từ lệnh "Đóng cửa sổ" thông thường. Hệ thống chỉ đơn giản là gửi tin nhắn đến các cửa sổ theo thứ tự.

Trong MFC (tức là ngữ cảnh của câu hỏi khác), bạn có thể gọi AfxGetCurrentMessage() để truy xuất thông tin về những gì thực sự xúi giục thông báo SC_CLOSE. Nếu đó là đầu vào của người dùng đã được dịch sang lệnh đóng, sẽ có một số loại đầu vào của người dùng (bàn phím, chuột, v.v.) làm thông báo hiện tại. Nếu không, bạn sẽ chỉ thấy chính mình là WM_SYSCOMMAND.

Nhưng bạn không thể áp dụng cùng một cách tiếp cận trong WPF, vì WPF không cung cấp phương thức GetCurrentMessage() hoặc phương thức tương đương (theo như tôi biết). Truy cập duy nhất vào các tin nhắn cửa sổ bạn nhận được là ghi đè phương thức Control.WndProc() và vào thời điểm bạn nhận được lệnh đóng, thông báo cửa sổ gần đây nhất sẽ luôn là SC_CLOSE.

Dường như với tôi rằng tốt nhất bạn có thể làm là sử dụng WndProc() override để theo dõi tin nhắn gửi đến, do đó bạn có thể đặt một lá cờ khi thông điệp phi cận lệnh đi vào.

Sau đó, khi bạn nhận được lệnh đóng và hiển thị lời nhắc người dùng, bạn có thể kiểm tra cờ đó. Nếu được đặt đúng, bạn có thể bỏ qua lời nhắc và chỉ sử dụng bất kỳ người dùng nào được chọn gần đây nhất. Vì bạn đang xóa cờ bất kỳ khi nào các thông báo không đóng lệnh xuất hiện, lệnh đóng đầu tiên nhận được sẽ luôn hiển thị lời nhắc.


Một giải pháp thay thế khác sẽ được tự động đóng trước tất cả các cửa sổ còn lại. Ở đây bạn vẫn có lời nhắc có một số tùy chọn "áp dụng cho tất cả cửa sổ khác" cho người dùng, nhưng thay vì cài đặt chỉ dựa vào cờ, bạn thực sự có thể đóng tất cả các cửa sổ khác một cách rõ ràng.


Không có lý tưởng nào trong số này là lý tưởng, từ góc độ giao diện người dùng. Vấn đề chính là khi người dùng cố gắng đóng chỉ một cửa sổ duy nhất. Trong phương pháp đầu tiên, người dùng sẽ thấy tùy chọn "áp dụng cho tất cả cửa sổ khác" trong lời nhắc ngay cả khi không có bất kỳ cửa sổ nào khác để đóng. Cách tiếp cận thứ hai là tự tin hơn một chút, nhưng thêm một tính năng mà bạn có thể hoặc không muốn: người dùng có thể đóng tất cả các cửa sổ trong chương trình bất cứ khi nào họ đóng chỉ một cửa sổ.

Không phải hành vi nào trong số này là hành vi giao diện người dùng Windows chuẩn. I E. trong việc cố gắng tiết kiệm cho người dùng một số khó chịu (và nhầm lẫn, mặc dù như tôi đã nói, tôi không thấy phần đó là trường hợp), bạn giới thiệu những gì chính nó có thể có khả năng gây nhầm lẫn cho người dùng.

Vì nó liên quan đến mã hóa công việc bổ sung và có thể chỉ trao đổi một kết quả gây khó chịu/khó hiểu cho người khác, giải pháp tốt nhất có thể đơn giản là không cố giải quyết vấn đề.

Các vấn đề liên quan