对于Gtk #Windows,是否有Form.Showdialog等价物?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了对于Gtk #Windows,是否有Form.Showdialog等价物?相关的知识,希望对你有一定的参考价值。
使用Windows窗体或WPF我可以通过调用ShowDialog打开一个对话窗口。我怎么能用Gtk#做到这一点?
我尝试制作Window模式,但是虽然它阻止用户与调用窗口进行交互,但它不会等待用户在ShowAll()之后运行代码之前关闭对话框。
而不是使用Gtk.Window,使用Gtk.Dialog,然后调用dialog.Run()。这将返回一个整数值,该值对应于用户用于关闭对话框的按钮的ID。
EG
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#中使用Dispose()移动窗口小部件并不会在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。
我正在尝试创建一个更复杂的对话框,一个没有窗口的对话框 - 它是一个嵌套在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。
我在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;
}
以上是关于对于Gtk #Windows,是否有Form.Showdialog等价物?的主要内容,如果未能解决你的问题,请参考以下文章
为 Microsoft 商店打包适用于 Windows 的 Gtk3 应用程序
如何在 Windows 操作系统中使用 GtkSocket?
对于 Gtk3 / Gnome Shell 主题/扩展开发,都有哪些好的工具(如果有的话)? [关闭]