Frage

Ich schreibe eine Anwendung (c # + WPF), in der alle modalen Stil Dialoge als UserControl auf einem durchlässigen Gitter implementiert werden, um die Haupt Window abdeckt. Dies bedeutet, dass es nur eine Window ist und es unterhält das Look and Feel aller Firmen-Anwendungen.

ein MessageBox Um zu zeigen, die Syntax ist wie folgt:

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

Wie Sie sehen können, ist nicht nur der Ablauf der Ausführung tatsächlich invertiert, aber sein schrecklich ausführlicher Vergleich zur klassischen .NET-Version:

MessageBox.Show("hello world");
// the rest of the function

Was ich wirklich stehe auf eine Art und Weise von base.ShowMessageBox nicht zurückkehren, bis der Dialog geschlossen Ereignis durch sie angehoben worden, aber ich kann nicht sehen, wie es möglich ist, dies zu warten, ohne den GUI-Thread zu hängen und somit den Benutzer zu verhindern jemals auf OK klicken. Ich bin bewusst, dass ich einen Delegaten Funktion als Parameter an die ShowMessageBox Funktion übernehmen kann, welche Art von der Umkehrung der Ausführung verhindert, aber immer noch bewirkt, dass einige verrückte Syntax / Einrücken.

Bin ich etwas fehlt offensichtlich oder ist es eine standardisierte Möglichkeit, dies zu tun?

War es hilfreich?

Lösung

Sie können einen Blick auf dieser Artikel über Codeproject und nehmen möchten < a href = "http://msdn.microsoft.com/en-us/library/aa969773.aspx#Creating_a_Modal_Custom_Dialog_Box" rel = "noreferrer"> diese Artikel auf MSDN. Der erste Artikel führt Sie durch manuell eine Blockierung modalen Dialog erstellen, und der zweite Artikel beschreibt, wie benutzerdefinierte Dialoge erstellen.

Andere Tipps

Die Art und Weise, dies zu tun ist durch eine DispatcherFrame Objekt.

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

Sie können Ihre Funktion in einem Iterator machen, die eine IEnumerator<CustomMessageBox> zurückgibt, dann schreiben Sie es wie folgt aus:

//some code
yield return new CustomMessageBox("hello world");
//some more code

Sie würden dann eine Wrapper-Funktion schreiben, die die Aufzählungs nehmen und rufen MoveNext in dem yield return Handler (die alle von der Funktion bis zur nächsten DialogClosed ausgeführt werden).

Beachten Sie, dass die Wrapper-Funktion nicht ein blockierenden Aufruf sein würde.

eine weitere Nachrichtenschleife im Nachrichtenfeld Klasse einrichten. So etwas wie:

public DialogResult ShowModal()
{
  this.Show();

  while (!this.isDisposed)
  {
    Application.DoEvents();
  } 

   return dialogResult;
}

Wenn Sie bei Windows.Form in Reflector aussehen wird sehen, dass es so etwas wie dies tut ..

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top