ZetCode

GTK#中的事件

最后修改于 2023 年 10 月 18 日

在本 GTK# 编程教程中,我们将讨论事件。

GTK# 库是一个事件驱动系统。所有 GUI 应用程序都对事件做出反应。应用程序启动一个主循环,该循环不断检查新生成的事件。如果没有事件,应用程序将等待并且什么也不做。事件主要由应用程序的用户生成。但它们也可以通过其他方式生成,例如互联网连接、窗口管理器或计时器。

简单事件示例

下一个例子展示了我们如何对两个基本事件做出反应。

quitbutton.cs
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/

移动窗口

下一个例子展示了我们如何响应窗口的移动事件。我们在标题栏中显示窗口左上角的当前位置。

move.cs
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 坐标设置为窗口的标题。

Move event
图:移动事件

EnterNotifyEvent

当我们用鼠标指针进入小部件的区域时,会发出 EnterNotifyEvent

enter.cs
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));

我们获取按钮小部件并修改其背景颜色。

断开事件处理程序

我们可以从事件中断开处理程序方法。下一个代码示例演示了这种情况。

disconnect.cs
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;
}

这些行根据复选框小部件的状态连接或断开事件处理程序。

Disconnect
图:断开连接

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