Mono Gtk#: ButtonPressEvent无法工作

4
我想创建一个简单的应用程序,其中需要添加一些按钮按下事件。但是,当我尝试将处理程序添加到任何小部件(除了按钮)的事件时,它就不起作用。
当我在窗口的任何地方单击时,它没有打印任何内容。我该怎么办?我已经遵循(或尝试遵循)了这个简易教程:http://mono-project.com/GtkSharpBeginnersGuide 以下是我的代码:
public partial class MainWindow : Gtk.Window
{   
    public MainWindow (): base (Gtk.WindowType.Toplevel)
    {
        ButtonPressEvent += new ButtonPressEventHandler(ButtonPressHandler);
        ButtonPressEvent += delegate {Console.WriteLine("test 1");};

        SetDefaultSize(50, 50);
        SetPosition(WindowPosition.Center);
        DeleteEvent += new DeleteEventHandler(OnDeleteEvent);

        VBox vbox = new VBox(false, 2);

        MenuBar mb = new MenuBar();
        Menu filemenu = new Menu();
        MenuItem file = new MenuItem("Soubor");
        file.Submenu = filemenu;
        mb.Append(file);

        vbox.PackStart(mb, false, false, 0);

        GuiBoard board = new GuiBoard(3, 3, true);
        board.Board = new Board(5, 7);

        vbox.PackStart(new Entry(), false, false, 0);
        vbox.PackEnd(board, true, true, 0);

        Add(vbox);
        ShowAll();
    }

    protected void OnDeleteEvent (object sender, DeleteEventArgs a)
    {
        Application.Quit ();
    }

    protected void ButtonPressHandler(object obj, ButtonPressEventArgs args)
    {
        Console.WriteLine("test!");
    }
}

感谢您的预先帮助。

"not work" 这种表述并不能让我们了解你遇到的问题。是编译错误吗?运行时异常?它们具体是什么呢?你是否已经通过谷歌搜索该错误来了解它出现的原因?还是,这是一种未预料到的行为?那么究竟发生了什么?你期望看到什么结果?你已经尝试过哪些方法来解决这个问题了呢?请详细描述。 - tnw
我写道:“当我单击窗口中的任何位置时,它不会打印任何内容。”(对于拼写错误表示抱歉)。因此,没有编译错误,程序正常运行且没有任何异常。它只是绘制GUI,但当我单击某个地方时,不会打印任何内容,这就是我的问题。 - Firzen
3个回答

3
问题在于GTK默认情况下不会报告事件(来自鼠标或其他事件,除了某些小部件比如Gtk.Button)。你可以通过设置适当的掩码来启用事件报告的功能:Events属性。
Events |= Gdk.EventMask.ButtonPressMask | Gdk.EventMask.ButtonReleaseMask;

在窗口上设置这个属性就足以使得当用户点击窗口背景时调用按钮按下事件处理程序。如果您有其他小部件,请设置它们的Events属性,并相应地连接您的处理程序。


1
这对我有用:
AddEvents((int) (Gdk.EventMask.ButtonPressMask | Gdk.EventMask.ButtonReleaseMask));

0

Gtk无法获取您正在使用的ButtonPressEvent事件。 为此,您可以使用[Glib.ConnectBefore]来使用ButtonPressEvent事件。 这对我起作用了。

例如:

[GLib.ConnectBefore]
protected void ButtonPressHandler(object obj, ButtonPressEventArgs args)
{
   Console.WriteLine("test!");
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接