使用Windows窗體或WPF我可以通過調用的ShowDialog打開一個對話框窗口。我如何使用Gtk#來做到這一點?是否有與Gtk#Windows等價的Form.Showdialog?
我嘗試了使該窗口模式,但儘管它阻止用戶與呼叫窗口交互它不會等待用戶勾住ShowAll後運行的代碼之前關閉對話框()。
使用Windows窗體或WPF我可以通過調用的ShowDialog打開一個對話框窗口。我如何使用Gtk#來做到這一點?是否有與Gtk#Windows等價的Form.Showdialog?
我嘗試了使該窗口模式,但儘管它阻止用戶與呼叫窗口交互它不會等待用戶勾住ShowAll後運行的代碼之前關閉對話框()。
代替使用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的等效。
我試圖創建一個更復雜的對話,一個沒有窗戶 - 這是與嵌套在一個滾動視圖完成樹形搜索對話框,並與輸入或逃避關閉。
下面是我已經想通你放在一起手動模式對話框的機制:
定義,表示它是否完成沒有你的對話框上的屬性。我打電話給我的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。
需要注意的是在自定義對話框覆蓋`Dispose`時,一個具有前*`base.Dispose`調用`Destroy` *很重要 – 2014-12-24 17:22:40