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