Frage

Mit Windows -Formularen oder WPF kann ich ein Dialogfenster öffnen, indem ich ShowDialog aufruft. Wie kann ich das mit GTK#tun?

Ich habe versucht, das Fenster modal zu modal zu machen, aber obwohl er verhindert, dass der Benutzer mit dem aufgerufenen Fenster interagiert, wartet er nicht darauf, dass der Benutzer den Dialogfeld schließt, bevor der Code nach ShowAll () ausgeführt wird.

War es hilfreich?

Lösung

Verwenden Sie anstatt einen GTK.Window zu verwenden Gtk.dialog, Rufen Sie dann dialog.run () auf. Dies gibt einen Ganzzahlwert zurück, der der ID der Schaltfläche entspricht, mit der der Benutzer den Dialog geschlossen hat.

z.B

Dialog dialog = null;
ResponseType response = ResponseType.None;

try {
    dialog = new Dialog (
        "Dialog Title",
        parentWindow,
        DialogFlags.DestroyWithParent | DialogFlags.Modal,
        "Overwrite file", ResponseType.Yes,
       "Cancel", ResponseType.No
    );
    dialog.VBox.Add (new Label ("Dialog contents"));
    dialog.ShowAll ();

    response = (ResponseType) dialog.Run ();
} finally {
    if (dialog != null)
        dialog.Destroy ();
}

if (response == ResponseType.Yes)
    OverwriteFile ();

Beachten Sie, dass entsetzt () ein Widget in GTK# nicht zerstört () in GTK#-ein historischer Designunfall, der für die Rückwärtskompatibilität erhalten bleibt. Wenn Sie jedoch eine benutzerdefinierte Dialog -Unterklasse verwenden, können Sie die Absage überschreiben, um auch den Dialog zu zerstören. Wenn Sie auch die untergeordneten Widgets und den Aufruf von ShowAll () im Konstruktor hinzufügen, können Sie einen netter Code wie folgt schreiben:

ResponseType response = ResponseType.None;
using (var dlg = new YesNoDialog ("Title", "Question", "Yes Button", "No Button"))
    response = (ResponseType) dialog.Run ();

if (response == ResponseType.Yes)
        OverwriteFile ();

Natürlich könnten Sie einen Schritt weiter gehen und ein Äquivalent von Showdialog schreiben.

Andere Tipps

Ich versuche, ein komplexeres Dialog zu erstellen, das keine Windows hat. Es handelt sich um ein Suchdialog mit einem in einem Scrollview verschachtelten Fertigstellungs -Treeview und ist mit Eingabetaste oder Flucht geschlossen.

So habe ich gedacht, dass Sie die Mechanik eines modalen Dialogs manuell zusammenstellen:

  • Definieren Sie eine Eigenschaft in Ihrem Dialogfeld, die angibt, ob sie abgeschlossen ist oder nicht. Ich rufe meine an ModalResult, eine Aufzählung mit Werten None, OK und Cancel.

  • Stellen Sie sicher, dass Sie das übergeordnete Fenster des Dialogs zur Hand haben (dialogParent unter)

Beispielcode:

// assuming Dispose properly written per @mhutch
using (window = new MyDialogWindow()) 
{
    window.TransientFor = dialogParent;
    window.Modal = true;
    window.Show();
    while (window.ModalResult == ModalResult.None)
        Application.RunIteration(true);
    // now switch on value of modal result
 }

Beachten Sie jedoch Dieser Ubuntu -Fehler mit Overlay -Scrollbars. Ich benutze sie nicht und meine App ist für den persönlichen Gebrauch, aber ymmv.

Ich habe die folgende Methode in meinem GTK.Dialog implementiert:

public ResponseType ShowDialog()
{
  List<ResponseType> responseTypes = new List<ResponseType>
  {
    // list all the ResponseTypes that you have buttons for
    // or that you call this.Respond(...) with
    ResponseType.Ok,
    ResponseType.Cancel
  };

  this.Modal = true;

  // start with any ResponseType that isn't contained in responseTypes
  ResponseType response = ResponseType.None;

  while (!responseTypes.Contains(response))
  {
    response = (ResponseType)this.Run();
  }
  this.Destroy();
  return response;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top