GTK#中的事件
最后修改于 2023 年 10 月 18 日
在本 GTK# 编程教程中,我们将讨论事件。
GTK# 库是一个事件驱动系统。所有 GUI 应用程序都对事件做出反应。应用程序启动一个主循环,该循环不断检查新生成的事件。如果没有事件,应用程序将等待并且什么也不做。事件主要由应用程序的用户生成。但它们也可以通过其他方式生成,例如互联网连接、窗口管理器或计时器。
简单事件示例
下一个例子展示了我们如何对两个基本事件做出反应。
using Gtk; using System; class SharpApp : Window { public SharpApp() : base ("Button") { SetDefaultSize(250, 200); SetPosition(WindowPosition.Center); DeleteEvent += delegate { Application.Quit(); }; Fixed fix = new Fixed(); Button quit = new Button("Quit"); quit.Clicked += OnClick; quit.SetSizeRequest(80, 35); fix.Put(quit, 50, 50); Add(fix); ShowAll(); } void OnClick(object sender, EventArgs args) { Application.Quit(); } public static void Main() { Application.Init(); new SharpApp(); Application.Run(); } }
在我们的代码示例中,我们对两个事件做出反应:Delete 事件和 Clicked 事件。
当我们关闭窗口时,会触发删除事件。默认情况下,当我们点击标题栏中的关闭按钮时,应用程序不会退出。
DeleteEvent += delegate { Application.Quit(); };
当我们使用 delegate
关键字时,我们可以在行内编写代码来响应这个特定的事件。
quit.Clicked += OnClick;
在这里,我们指定使用 OnClick
方法响应 Clicked
事件。
void OnClick(object sender, EventArgs args) { Application.Quit(); }
这是 OnClick
方法。它接受两个参数。第一个参数是触发此事件的对象。在我们的例子中,它是退出按钮。第二个参数为我们提供了关于事件的各种附加信息。事件参数始终取决于事件的类型。每个方法的签名都可以在 GTK# 库的参考手册中找到。 http://www.go-mono.com/docs/
移动窗口
下一个例子展示了我们如何响应窗口的移动事件。我们在标题栏中显示窗口左上角的当前位置。
using Gtk; using System; class SharpApp : Window { public SharpApp() : base("") { SetDefaultSize(250, 150); SetPosition(WindowPosition.Center); DeleteEvent += delegate { Application.Quit(); }; Show(); } protected override bool OnConfigureEvent(Gdk.EventConfigure args) { base.OnConfigureEvent(args); Title = args.X + ", " + args.Y; return true; } public static void Main() { Application.Init(); new SharpApp(); Application.Run(); } }
在前面的示例中,我们将委托或方法插入到事件中。在 GTK# 中,许多事件已经有处理方法。在这种情况下,我们可以重写该方法。我们的代码示例就是这种情况。
protected override bool OnConfigureEvent(Gdk.EventConfigure args) { base.OnConfigureEvent(args); Title = args.X + ", " + args.Y; return true; }
在这里,我们重写了预定义的 OnConfigureEvent
方法。当我们调整小部件的大小或移动小部件时,会触发 Configure 事件。请注意,该方法的第一行调用了默认方法。如果没有这一行,程序将无法正确运行。下一行将窗口的 x、y 坐标设置为窗口的标题。

EnterNotifyEvent
当我们用鼠标指针进入小部件的区域时,会发出 EnterNotifyEvent
。
using Gtk; using System; class SharpApp : Window { public SharpApp() : base("Enter") { SetDefaultSize(200, 150); SetPosition(WindowPosition.Center); DeleteEvent += delegate { Application.Quit(); }; Button button = new Button("Button"); button.EnterNotifyEvent += OnEnter; Fixed fix = new Fixed(); fix.Put(button, 20, 20); Add(fix); ShowAll(); } void OnEnter(object sender, EnterNotifyEventArgs args) { Button button = (Button) sender; button.ModifyBg(StateType.Prelight, new Gdk.Color(220, 220, 220)); } public static void Main() { Application.Init(); new SharpApp(); Application.Run(); } }
一旦我们将鼠标指针悬停在按钮小部件上,我们就会更改其背景颜色。
button.EnterNotifyEvent += OnEnter;
我们将 OnEnter
方法插入到 EnterNotifyEvent
。
Button button = (Button) sender; button.ModifyBg(StateType.Prelight, new Gdk.Color(220, 220, 220));
我们获取按钮小部件并修改其背景颜色。
断开事件处理程序
我们可以从事件中断开处理程序方法。下一个代码示例演示了这种情况。
using Gtk; using System; class SharpApp : Window { Button button; public SharpApp() : base("Disconnect") { SetDefaultSize(250, 150); SetPosition(WindowPosition.Center); DeleteEvent += delegate { Application.Quit(); }; button = new Button("Button"); CheckButton cb = new CheckButton("connect"); cb.Toggled += OnToggled; Fixed fix = new Fixed(); fix.Put(button, 30, 50); fix.Put(cb, 130, 50); Add(fix); ShowAll(); } void OnClick(object sender, EventArgs args) { Console.WriteLine("Click"); } void OnToggled(object sender, EventArgs args) { CheckButton cb = (CheckButton) sender; if (cb.Active) { button.Clicked += OnClick; } else { button.Clicked -= OnClick; } } public static void Main() { Application.Init(); new SharpApp(); Application.Run(); } }
在代码示例中,我们有一个按钮和一个复选框。当单击按钮并且复选框处于活动状态时,我们在控制台中显示“Click”文本。复选框连接或断开处理程序方法与按钮的 Clicked
事件。
CheckButton cb = new CheckButton("connect"); cb.Toggled += OnToggled;
我们有一个复选框。这个小部件有一个 Toggled
事件。我们将 OnToggled
方法插入到此事件。
CheckButton cb = (CheckButton) sender; if (cb.Active) { button.Clicked += OnClick; } else { button.Clicked -= OnClick; }
这些行根据复选框小部件的状态连接或断开事件处理程序。

本章介绍了 GTK# 中的事件。