2012-05-25 70 views
2

我遇到了Gtk.RadioButton小部件的Clicked事件。 下面是示例代碼:單聲道gtk.RadioButton點擊事件發射兩次

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

回答

3

你的期望是錯的。您應該連接到Toggled信號,而不是和檢查按鈕是否被激活或停用:

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

在你的情況下,當按鈕被激活或停用的Clicked信號被調用。點擊一個停用的按鈕激活它,並關閉一個不同的按鈕,因此調用兩個信號。在兩種情況下也調用Toggled信號。我不太確定區別是什麼,如果按鈕的狀態以編程方式更改,則可能不保證Clicked被調用。

+0

嗨,ptomato謝謝你的幫助。我測試Toggled信號作爲你的代碼,它的工作原理。我也測試點擊信號,但添加了「如果((發件人爲RadionButton).Active)」條件。它也適用於我以前的代碼。 –