2009-06-13 3 views
2

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

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

ответ

10

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

+0

Важно отметить, что при переопределении 'Dispose' в пользовательском диалоговом окне нужно называть' Destroy' * перед * 'base.Dispose' –

0

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

Примечание Однако this Ubuntu bug with overlay scrollbars. Я не использую их, и мое приложение предназначено для личного использования, но YMMV.

Смежные вопросы