Есть ли эквивалент Form.Showdialog для Gtk# Windows?

Используя Windows Forms или WPF, я могу открыть диалоговое окно, вызвав ShowDialog. Как я могу сделать это с помощью Gtk#?

Я попытался просто сделать Window модальным, но, хотя он не позволяет пользователю взаимодействовать с вызывающим окном, он не ждет, пока пользователь закроет диалоговое окно, прежде чем запускать код после ShowAll().

3 ответа

Решение

Вместо использования Gtk.Window, используйте Gtk.Dialog, затем вызовите dialog.Run (). Это возвращает целочисленное значение, соответствующее идентификатору кнопки, которую пользователь использовал для закрытия диалога.

например

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

Обратите внимание, что удаление () виджета в GTK# не уничтожает () его в GTK# - историческая ошибка проектирования, сохраненная для обратной совместимости. Однако, если вы используете пользовательский диалоговый подкласс, вы можете переопределить Dispose, чтобы также уничтожить диалог. Если вы также добавите дочерние виджеты и вызов ShowAll() в конструкторе, вы можете написать более приятный код, подобный этому:

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

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

Конечно, вы могли бы пойти дальше и написать эквивалент ShowDialog.

Я пытаюсь создать более сложное диалоговое окно, в котором нет окон - это диалоговое окно поиска с представлением дерева завершений, вложенным в представление прокрутки и закрываемое с помощью Enter или Escape.

Вот как я понял, что вы собрали механику модального диалога вручную:

  • Определите свойство в вашем диалоговом окне, которое указывает, завершено ли оно или нет. Я звоню ModalResult, перечисление со значениями None, OK а также Cancel,

  • Убедитесь, что у вас есть родительское окно диалога (dialogParent ниже)

Образец кода:

// 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
 }

Однако обратите внимание на эту ошибку в Ubuntu с наложенными полосами прокрутки. Я не использую их, и мое приложение для личного пользования, но YMMV.

Я реализовал следующий метод на моем Gtk.Dialog:

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;
}
Другие вопросы по тегам