10

標準のwinformsラジオボタンからDoubleClickまたはMouseDoubleClickイベントをキャッチできるようにしたいのですが、それらは非表示になっていて機能していないようです。現在、私は次のようなコードを持っています:

public class RadioButtonWithDoubleClick : RadioButton
{
    public RadioButtonWithDoubleClick()
        : base()
    {
        this.SetStyle( ControlStyles.StandardClick | ControlStyles.StandardDoubleClick, true );
    }

    [EditorBrowsable( EditorBrowsableState.Always ), Browsable( true )]
    public new event MouseEventHandler MouseDoubleClick;
    protected override void OnMouseDoubleClick( MouseEventArgs e )
    {
        MouseEventHandler temp = MouseDoubleClick;
        if( temp != null ) {
            temp( this, e );
        }
    }
}

それを行うためのより簡単でクリーンな方法はありますか?

編集:背景として、私はここでのレイモンド・チェンの投稿に同意します。ラジオボタンをダブルクリックする機能(ダイアログの唯一のコントロールである場合)により、ダイアログを知っている人にとってはほんの少しだけ使いやすくなります。

Vistaでは、タスクダイアログ(特にタスクダイアログAPIについてはこのMicrosoftガイドラインページまたはこのMSDNページを参照)を使用することは明らかな解決策ですが、そのような贅沢はありません。

4

4 に答える 4

11

あなたの最初の提案に基づいて、私は反射を使用してラジオブトンをサブクラス化する必要なしに解決策を作りました:

MethodInfo m = typeof(RadioButton).GetMethod("SetStyle", BindingFlags.Instance | BindingFlags.NonPublic);
if (m != null)
{
    m.Invoke(radioButton1, new object[] { ControlStyles.StandardClick | ControlStyles.StandardDoubleClick, true });
}
radioButton1.MouseDoubleClick += radioButton1_MouseDoubleClick;

これで、ラジオボタンのダブルクリックイベントが発生します。ところで:e.Clicksを使用したNateの提案は機能しません。私のテストでは、ラジオボタンをクリックした速度や頻度に関係なく、e.Clicksは常に1でした。

于 2010-09-03T13:55:26.560 に答える
3

あなたはこのようなことをすることができます:

myRadioButton.MouseClick += new MouseEventHandler(myRadioButton_MouseClick);

void myRadioButton_MouseClick(object sender, MouseEventArgs e)
{
    if (e.Clicks == 2)
    {
         // Do something
    }
}

e.Button==MouseButtons.Leftを確認することもできます。

于 2009-06-30T17:34:42.993 に答える
1

@MSWの回答に基づいて、この拡張クラスを作成しました。

static class RadioButtonEx
{
    public static void AllowDoubleClick(this RadioButton rb, MouseEventHandler MouseDoubleClick)
    {
        //
        // Allow double clicking of radios
        System.Reflection.MethodInfo m = typeof(RadioButton).GetMethod("SetStyle", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
        if (m != null)
            m.Invoke(rb, new object[] { ControlStyles.StandardClick | ControlStyles.StandardDoubleClick, true });

        rb.MouseDoubleClick += MouseDoubleClick;
    }
}

これにより、セットアップと再利用が非常に簡単になります。

radioButton.AllowDoubleClick((a, b) => myDoubleClickAction());
于 2016-01-28T09:33:05.443 に答える
0

申し訳ありませんが、これについてコメントする評判はありません。ユーザーに対してダブルクリックを実行させるためにどのようなアクションを実行しようとしていますか?ダブルクリックを使用すると、ユーザーがラジオボタンを使用する一般的なメンタルモデル(つまり、シングルクリック、セットから1つのオプションを選択)とは異なるため、混乱する可能性があると思います。

于 2009-07-01T03:09:39.107 に答える