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”。
答案 0 :(得分:3)
你的期望是错误的。您应该连接到Toggled
信号,并检查按钮是激活还是取消激活:
void HandleToggled(object sender, EventArgs e)
{
if(sender.Active)
{
Console.WriteLine("rbt1.Toggled");
}
}
在您的情况下,激活或取消激活按钮时会调用Clicked
信号。单击已停用的按钮可激活它,并取消激活另一个按钮,因此会调用两个信号。在两种情况下也会调用Toggled
信号。我不太确定区别是什么,如果按钮的状态以编程方式更改,则可能无法保证调用Clicked
。