Вместо использования 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();
Обратите внимание, что Dispose() ИНГ виджет в GTK # не Destroy() его в 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.
Важно отметить, что при переопределении 'Dispose' в пользовательском диалоговом окне нужно называть' Destroy' * перед * 'base.Dispose' –