2

我对Gtk.RadioButton小部件的Clicked事件有疑问。这是示例代码:

using System;
using Gtk;

public partial class MainWindow: Gtk.Window
{   
    public MainWindow (): base (Gtk.WindowType.Toplevel)
    {
        Build ();
        RadioButton rbt1 = new RadioButton (null, "rbt1");
        RadioButton rbt2 = new RadioButton (rbt1, "rbt2");
        RadioButton rbt3 = new RadioButton (rbt1, "rbt3");
        VBox vbx1 = new VBox ();
        vbx1.PackStart (rbt1, false, false, 0);
        vbx1.PackStart (rbt2, false, false, 0);
        vbx1.PackStart (rbt3, false, false, 0);
        this.Add (vbx1);
        this.ShowAll ();
        rbt1.Clicked+= HandleClicked;
    rbt2.Clicked+= HandleClicked1;
    rbt3.Clicked+= HandleClicked2;
    }

    void HandleClicked2 (object sender, EventArgs e)
    {
        Console.WriteLine ("rbt3.Clicked");
    }

    void HandleClicked1 (object sender, EventArgs e)
    {
        Console.WriteLine ("rbt2.Clicked");
    }

    void HandleClicked (object sender, EventArgs e)
    {
        Console.WriteLine ("rbt1.Clicked");
    }
 }

问题是:

当我单击 rbt2 时,输出为:

rbt1.Clicked
rbt2.Clicked

当我单击 rbt3 时,输出为:

rbt2.Clicked
rbt3.Clicked

当我单击 rbt1 时,输出为:

rbt3.Clicked
rbt1.Clicked

但我期望的是,当我单击 rbt* 时,唯一的输出是“rbt*.Clicked”。

4

1 回答 1

3

你的期望是错误的。您应该改为连接到Toggled信号并检查按钮是否被激活或停用:

void HandleToggled(object sender, EventArgs e)
{
    if(sender.Active)
    {
        Console.WriteLine("rbt1.Toggled");
    }
}

在您的情况下,Clicked当按钮被激活或停用时会调用该信号。单击停用的按钮会激活它,并停用不同的按钮,因此会调用两个信号。在这Toggled两种情况下也会调用信号。我不太确定有什么区别,Clicked如果按钮的状态以编程方式更改,则可能无法保证调用它。

于 2012-05-25T17:58:42.213 回答