2

我最近开始使用 Vala 编程语言开发 Gtk+ 3.x。我曾经使用 C# 和 Visual Studio 来完成相同的任务,但后来转向了 Linux。

如何在对话框中询问一个简单的确定/取消问题?在 C# 中,使用 MessageBox.Show() 非常简单。然而,Gtk 似乎非常复杂,而且我所做的每一次谷歌搜索都让我陷入了关于对话框和事件处理程序的技术废话。

是否只有一个简单的功能,所以我可以执行以下操作:

bool result = MessageBox.AskQuestion("Do you want to save?");

谢谢,

巴里·史密斯

4

2 回答 2

4

实际上,通过反复试验发现它......

public bool show_question(string message, Gtk.Window window, MessageType mt)
{
    Gtk.MessageDialog m = new Gtk.MessageDialog(window, DialogFlags.MODAL, mt, ButtonsType.OK_CANCEL, message);
    Gtk.ResponseType result = (ResponseType)m.run ();
    m.close ();
    if (result == Gtk.ResponseType.OK)
    {
        return true;
    }
    else
    {
        return false;
    }
}
于 2013-10-06T10:46:03.473 回答
3

稍微改进的版本:

public bool show_question(string primary_markup,
                          string? secondary_markup = null,
                          Gtk.Window? parent = null,
                          Gtk.MessageType message_type = Gtk.MessageType.QUESTION)
{
    var m = new Gtk.MessageDialog.with_markup(parent,
                                              Gtk.DialogFlags.MODAL,
                                              message_type,
                                              Gtk.ButtonsType.OK_CANCEL,
                                              primary_markup);
    m.format_secondary_markup(secondary_markup);
    var result = (Gtk.ResponseType) m.run();
    m.destroy();
    return (result == Gtk.ResponseType.OK);
}

这个新版本利用了 Vala 的默认参数,所以在最简单的情况下你可以调用show_question("Is this OK?");. 此外,您现在还可以使用Pango Markup生成更好看的对话框,例如:

show_question("<b><big>Overwrite File?</big></b>",
              "<small>The file <i>\"%s\"</i> will be overwritten if you proceed</small>".printf(my_filename),
              parent_window,
              Gtk.MessageType.WARNING);

然而值得注意的是,在 GTK 中,像这样使用简单的“OK/CANCEL”响应通常是不受欢迎的。相反,建议使用包含与相关动作相关的动词的按钮标签;所以在上面的例子中,“取消”和“覆盖”会是更好的选择(当然,默认为取消)。这对程序员来说需要一点但更多的工作,但提供了更好的用户体验。

于 2013-10-07T05:35:51.367 回答