对于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,一个值为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。

另一答案

我在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 主题/扩展开发,都有哪些好的工具(如果有的话)? [关闭]

mono gtk# - hello world部署到windows

GTK+ Toggle动作

如何在 Windows 上分发 GTK+ 应用程序?