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# 中的事件。