2010-01-09 32 views
6

Làm thế nào tôi có thể bắt buộc ShowDialog quay lại từ một chuỗi nền?WPF - Force ShowDialog để trả lại

Tôi có một ứng dụng WPF được xây dựng trên nền tảng C++/CLR đang lắng nghe các thông điệp được gửi bởi khung công tác. Một thông điệp đặc biệt quan trọng đến mức tôi cần phải đóng tất cả các cửa sổ hiện tại. Tuy nhiên, nếu phương thức Dialog (được tạo bởi ShowDialog từ cửa sổ chính của tôi) đang hoạt động và đang chờ người dùng nhập, cửa sổ sẽ không đóng vì nó đang đợi ShowDialog trả lại. Làm thế nào tôi có thể buộc các phương thức Dialog để đóng và thư giãn thực hiện mã?

Tôi đã thử đặt DialogResult hoặc gọi số Close tuy nhiên điều đó dường như không hoạt động.

Edit: Các Dialog được tạo ra bởi cửa sổ chính của tôi mà hy vọng một giá trị trả về, như vậy: (bên trong một xử lý sự kiện nhấp chuột trong MainWindow):

Window modalDialog = new Window(); 
bool ret = (bool)modalDialog.ShowDialog(); 
if (ret == true) 
{ 
// do stuff 
} 
else 
{ 
// do some other stuff 
} 

Khi khung gửi một thông điệp (sắp tới trong trên một chủ đề khác với chuỗi giao diện người dùng), tôi gọi MainWindow.Close(). Hộp thoại phương thức được đóng tại thời điểm này, tuy nhiên mã kiểm tra giá trị trả lại của Dialog (sau ShowDialog) vẫn còn trên ngăn xếp. Bằng cách nào đó điều này buộc cửa sổ chính không biến mất.

Trả lời

3

Khi hộp thoại nhận được thông báo WM_CLOSE, nó đặt cờ khiến cho ShowDialog trở lại sau WM_CLOSE và bất kỳ thư nào có chứa đã được xử lý hoàn toàn. Vì vậy, nếu bạn đang thực hiện một số Dispatcher.Invoke() vào chủ đề của mình để gọi MainWindow.Close(), ShowDialog() sẽ không trả lại cho đến sau khi Dispatcher.Invoke() hoàn tất.

Vì vậy, giải pháp đơn giản là trả lại từ Dispatcher.Invoke() để nhận được ShowDialog() để trả lại. Nếu cần xử lý thêm, hãy thực hiện ngay Dispatcher.Invoke() sau đó.

Nếu bạn đang thực hiện chuyển đổi luồng theo cách khác hơn Dispatcher.Invoke() hoặc nếu ShowDialog() không trả lại sau khi cuộc gọi Dispatcher.Invoke() trả về, bạn có thể phải đăng một số mã xung quanh cuộc gọi Window.Close() của bạn để chúng tôi có thể thấy những gì bạn đang thực sự làm.

1

Bạn không thể buộc ShowDialog quay trở lại nhưng bạn có thể để cửa sổ nghe một sự kiện do khung của bạn gửi có thể yêu cầu đóng. Trong ví dụ dưới đây, sự kiện Progress có cờ "Xong", đóng cửa sổ khi hoàn tất.

SomeGenerator IG = Manager.SomeGenerator(); 
SomeWindow PP = new SomeWindow(); 
IG.ProgressEvent += PP.ProgressEvent; 
IG.ExecuteAsync();    
PP.ShowDialog(); 
+0

Tôi đã chỉnh sửa câu hỏi ban đầu của mình để cho biết rằng ShowDialog được mong đợi trả lại giá trị và cửa sổ cha được cho là xử lý với giá trị ... – Hypherion

0

Tôi nhận ra bây giờ tôi không thể bắt buộc ShowDialog quay lại và tiếp tục thực hiện bất cứ khi nào tôi muốn. Trình xử lý sự kiện cho yêu cầu mà tôi nhận được từ khung công tác cần đi ra ngoài ngữ cảnh để ngăn xếp cuộc gọi có thể được mở và hộp thoại phương thức có thể xử lý thông báo Đóng.

Tôi đã kết thúc thiết lập cờ boolean, yêu cầu các phương thức đóng lại, sau đó trở về từ trình xử lý sự kiện khung của tôi. Chỉ vào thời điểm này sẽ trở lại ShowDialog và tôi có thể kiểm tra cờ tôi đặt và tiếp tục với hành động được yêu cầu.

+0

Có vẻ như câu trả lời của tôi đúng và giúp bạn giải quyết vấn đề của mình . Nếu bạn đồng ý, bạn nên đánh dấu "đúng" cho khách truy cập trong tương lai. –

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