質問

私は、すべてのモーダルスタイルのダイアログがメイン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を見れば、あなたはそれがこのような何かをして表示されます..

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top