Существует ли эквивалент Form.Showdialog для Gtk # Windows? - PullRequest
2 голосов
/ 13 июня 2009

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

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

Ответы [ 3 ]

10 голосов
/ 16 июня 2009

Вместо использования 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.

0 голосов
/ 31 августа 2018

Я реализовал следующий метод на моем 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;
}
0 голосов
/ 09 сентября 2013

Я пытаюсь создать более сложное диалоговое окно, в котором нет окон - это диалоговое окно поиска с представлением дерева завершений, вложенным в представление прокрутки и закрываемое с помощью 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.

...