ShowDialogの機能をエミュレート
-
11-09-2019 - |
質問
私は、すべてのモーダルスタイルのダイアログがメインUserControl
をカバーする半透明のグリッドの上にWindow
として実装されているアプリケーション(C#の+ WPF)を書いています。これは、そこに一つだけWindow
があり、それはすべての企業アプリケーションのルックアンドフィールを維持意味ます。
MessageBox
を表示するには、構文は次のとおりです。
CustomMessageBox b = new CustomMessageBox("hello world");
c.DialogClosed += ()=>
{
// the rest of the function
}
// this raises an event listened for by the main window view model,
// displaying the message box and greying out the rest of the program.
base.ShowMessageBox(b);
あなたが見ることができるようには、だけでなく、実際には逆実行の流れであるが、その恐ろしく冗長な古典的な.NETバージョンに比べます:
MessageBox.Show("hello world");
// the rest of the function
私が本当に探していますと、ダイアログクローズイベントは、それによって提起されるまでbase.ShowMessageBox
から戻らないための方法ですが、私はGUIのスレッドをぶら下げので、ユーザーを妨げることなく、このために待つことが可能であるかを確認カントこれまで[OK]をクリックします。私は一種の実行の反転を防止ShowMessageBox
関数へのパラメータとしてデリゲート関数を取ることができます承知していますが、それでもいくつかのクレイジーな構文/インデントが発生します。
私は何かを明らかに不足しているか、これを行うための標準的な方法はありますかな?
解決
あなたはでCodeProjectの上でこのの記事を見てみるとする場合があります< href = "http://msdn.microsoft.com/en-us/library/aa969773.aspx#Creating_a_Modal_Custom_Dialog_Box" のrel = "noreferrer"> MSDNでこのの記事。最初の記事は、手動でブロックするモーダルダイアログを作成する手順を説明します、第二の記事では、カスタムダイアログを作成する方法を示します。
他のヒント
これを行う方法は、 DispatcherFrameを使用することですの対象ます。
var frame = new DispatcherFrame();
CustomMessageBox b = new CustomMessageBox("hello world");
c.DialogClosed += ()=>
{
frame.Continue = false; // stops the frame
}
// this raises an event listened for by the main window view model,
// displaying the message box and greying out the rest of the program.
base.ShowMessageBox(b);
// This will "block" execution of the current dispatcher frame
// and run our frame until the dialog is closed.
Dispatcher.PushFrame(frame);
あなたはIEnumerator<CustomMessageBox>
を返すイテレータにあなたの関数を作ることができ、その後、このようにそれを記述します:
//some code
yield return new CustomMessageBox("hello world");
//some more code
これで、MoveNext
ハンドラに(次のyield return
までの機能のすべてを実行します)DialogClosed
を列挙子を取得して呼び出すラッパー関数を記述します。
ラッパー関数は、ブロッキング呼び出しではないことに注意してください。
メッセージボックスクラス内の別のメッセージループを設定します。ような何かます:
public DialogResult ShowModal()
{
this.Show();
while (!this.isDisposed)
{
Application.DoEvents();
}
return dialogResult;
}
あなたはリフレクターでWindows.Formを見れば、あなたはそれがこのような何かをして表示されます..