2012-04-10 27 views
15

Trong ứng dụng WPF của tôi, đôi khi tôi lên một số System.Windows.MessageBox. Khi nó được hiển thị ban đầu, nó được hiển thị trên đầu cửa sổ ứng dụng chính của tôi, như tôi muốn. Có cách nào mà tôi có thể ép buộc LUÔN luôn ở trên cùng của cửa sổ chính không? Vấn đề tôi gặp phải là khi hiển thị MessageBox, người dùng có thể nhấp vào cửa sổ ứng dụng chính và đưa nó lên phía trước, nghĩa là MessageBox sẽ bị ẩn khỏi chế độ xem. Trong trường hợp này người dùng có thể không nhận ra nó ở đó, hoặc quên nó, và với họ, ứng dụng chính dường như đã bị đóng băng.Buộc MessageBox ở trên cùng của cửa sổ ứng dụng .net/WPF

Tôi đã đọc một số chủ đề về vấn đề này, nhưng không có chủ đề nào giải quyết được sự cố cho tôi.

Tôi phải thêm rằng chuỗi đưa lên MessageBox có thể không phải là chuỗi giao diện người dùng. Cảm ơn Tom

Trả lời

37

Sử dụng phiên bản MessageBox.Show có cửa sổ "chủ sở hữu" và chuyển cửa sổ của bạn.

MessageBox.Show(Application.Current.MainWindow, "Im always on top - of the main window"); 

Nếu bạn có thể không phải trên thread UI thử:

string msg="Hello!"; 
if (Application.Current.Dispatcher.CheckAccess()) { 
    MessageBox.Show(Application.Current.MainWindow, msg); 
} 
else { 
    Application.Current.Dispatcher.Invoke(DispatcherPriority.Normal, new Action(()=>{ 
     MessageBox.Show(Application.Current.MainWindow, msg); 
    })); 
} 

Bạn có thể:
1. Invoke để chặn chủ đề của bạn cho đến khi MessageBox được sa thải hoặc
2. BeginInvoke trong trường hợp của bạn mà mã chuỗi sẽ tiếp tục thực thi nhưng chuỗi giao diện người dùng sẽ chặn trên MessageBox cho đến khi được loại bỏ).

+0

Có cách nào khác để làm điều này nếu thread đưa lên MessageBox KHÔNG thread UI (tức là không phải là chủ đề sở hữu MainWindow)? –

+0

Bây giờ, thông tin đó đã có trong câu hỏi đầu tiên - tôi khuyên bạn nên thêm ngay bây giờ! – Ricibob

+0

Bạn đã thử Gửi mã MessageBox đến chuỗi giao diện người dùng chưa? – Ricibob

0

Bên trong "public partial class MainWindow : Window" của bạn, hãy đặt mã sau đây. Vì vậy, Invoke sẽ chạy mã của bạn bên trong thread UI.

void ShowErrorMessage(ERROR err) 
{ 
    this.Dispatcher.Invoke((Action)(() => 
    { 
     MessageBox.Show(err.description, err.code.ToString(), MessageBoxButton.OK, MessageBoxImage.Error); 
    })); 
} 
1

Đây là cách nhanh chóng để đặt Hộp thư lên trên cửa sổ ứng dụng.

MessageBox.Show(this ,"Output text"));

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