2012-04-10 20 views
15

私のWPFアプリケーションでは、時々System.Windows.MessageBoxになっています。それが最初に表示されるとき、私の望むように、それは私の主なアプリケーションウィンドウの上に示されます。私はそれが常にメインウィンドウの上に残るように強制することができる方法はありますか?私が抱えている問題は、MessageBoxが表示されたときに、メインのアプリケーションウィンドウをクリックして前面に移動させることができます。つまり、MessageBoxが表示されなくなります。この場合、ユーザーはそれがそこにあることを認識しないかもしれないし、それを忘れてしまい、メインアプリケーションが凍っているように見えるかもしれません。MessageBoxを.net/WPFのアプリケーションウィンドウの上に表示するようにします

これについて多くのスレッドを読んだことがありますが、問題は解決していません。

MessageBoxを置いているスレッドがUIスレッドではない可能性があることを付け加えておきます。 ありがとう Tom

答えて

37

MessageBox.Showのウィンドウを「所有者」とし、ウィンドウを渡すバージョンを使用してください。

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

UIスレッドの試みで、あなたの可能性がない場合:

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); 
    })); 
} 

次のことができます。
1. InvokeMessageBoxが却下されるまで、あなたのスレッドをブロックしたり、
2. BeginInvoke場合、あなたの中にスレッドコードは引き続き実行されますが、UIスレッドは終了するまでMessageBoxでブロックされます)。

+0

メッセージボックスを入れてスレッドがUIスレッド(メインウィンドウを所有しているすなわちないスレッド)されていない場合はこれを行うの他の方法はありますか? –

+0

ああ、インフォメーションの質問に情報が含まれているはずです。 – Ricibob

+0

MessageBoxコードをUIスレッドにディスパッチしようとしましたか? – Ricibob

0

"public partial class MainWindow : Window"の中に次のコードを挿入してください。 InvokeはUIスレッド内でコードを実行します。

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

これは、メッセージウィンドウをアプリケーションウィンドウの上に置く簡単な方法です。

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

関連する問題