2009-06-13 123 views
2

使用Windows窗體或WPF我可以通過調用的ShowDialog打開一個對話框窗口。我如何使用Gtk#來做到這一點?是否有與Gtk#Windows等價的Form.Showdialog?

我嘗試了使該窗口模式,但儘管它阻止用戶與呼叫窗口交互它不會等待用戶勾住ShowAll後運行的代碼之前關閉對話框()。

回答

10

代替使用Gtk.Window的,使用Gtk.Dialog,然後調用dialog.Run()。這將返回一個整數值,對應於用戶用來關閉對話框的按鈕的ID。

例如

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#小部件不GTK#destroy()方法是 - 歷史設計的事故,保持向後兼容性。但是,如果使用自定義對話框子類,則可以重寫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`時,一個具有前*`base.Dispose`調用`Destroy` *很重要 – 2014-12-24 17:22:40

0

我試圖創建一個更復雜的對話,一個沒有窗戶 - 這是與嵌套在一個滾動視圖完成樹形搜索對話框,並與輸入或逃避關閉。

下面是我已經想通你放在一起手動模式對話框的機制:

  • 定義,表示它是否完成沒有你的對話框上的屬性。我打電話給我的ModalResult,其值NoneOKCancel枚舉。

  • 確保您有得心應手的對話框的父窗口(如下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。