单声道gtk.RadioButton点击事件两次射击

时间:2012-05-25 13:47:12

标签: c# mono gtk#

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”。

1 个答案:

答案 0 :(得分:3)

你的期望是错误的。您应该连接到Toggled信号,并检查按钮是激活还是取消激活:

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

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