Есть ли эквивалент 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;
}