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ボタンがアクティブまたは非アクティブになったときにシグナルが呼び出されます。非アクティブ化されたボタンをクリックすると、そのボタンがアクティブ化され、別のボタンが非アクティブ化されるため、2つのシグナルが呼び出されます。どちらの場合も、Toggledシグナルは呼び出されます。違いはよくわかりませんClicked。プログラムでボタンの状態を変更した場合、呼び出される保証がない可能性があります。

于 2012-05-25T17:58:42.213 に答える