Как получить событие DoubleClick в радиокнопке .NET?

Я хотел бы иметь возможность перехватывать события DoubleClick или MouseDoubleClick с помощью стандартной кнопки-переключателя winforms, но они, похоже, скрыты и не работают. На данный момент у меня есть такой код:

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 );
        }
    }
}

Есть ли более простой и чистый способ сделать это?

Изменить: для справки, я согласен с постом Раймонда ЧенаВот что возможность двойного щелчка на переключателе (если этоonly элементы управления в диалоговом окне) делает диалоговое окно немного проще для людей, которые знают об этом.

В Vista, используя диалоги задач (см.эта страница руководства Microsoft или жеэта страница MSDN специально об API диалога задач) было бы очевидным решением, но мы не можем позволить себе такую роскошь.

Ответы на вопрос(4)

у меня нет репутации, чтобы комментировать это. Какое действие вы пытаетесь выполнить двойным щелчком для пользователя? Я думаю, что использование двойного щелчка может сбивать с толку, потому что оно отличается от общей ментальной модели, которую пользователь использует для радиокнопки (один клик в IE, выберите один вариант из набора)

 Ant01 июл. 2009 г., 12:34
Хорошая точка зрения. Я обновлю вопрос
 Ehz01 июл. 2009 г., 17:45
Ах я вижу. Вы используете двойной щелчок в качестве ярлыка для выбора + далее. В этом есть смысл. Я думаю, что код, который вы представили, является самым чистым способом добиться этого. Похоже, что это функциональность, которую MS пыталась преднамеренно похоронить для радиопереключателя.
 Ant02 июл. 2009 г., 10:40
Вот что я понял :( Спасибо за отзыв.

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());
Решение Вопроса

я принял решение без необходимости подкласса радиобутона с использованием отражения:

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 не работает. В моих тестах e.Clicks всегда был равен 1, независимо от того, как быстро или часто я нажимал кнопку радио.

myRadioButton.MouseClick += new MouseEventHandler(myRadioButton_MouseClick);

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

Вы также можете или не хотите проверять, что e.Button == MouseButtons.Left

 Ant03 июл. 2009 г., 16:10
Я принимаю это, потому что, хотя я думаю, что мое собственное решение проще для моего случая, когда я собираюсь использовать один и тот же элемент управления много раз, если кто-то просто хотел один или два, то ваше намного проще.
 Wernight08 мар. 2011 г., 16:09
Похоже, что это не работает на .NET 3.5, поскольку кликов == 2 никогда не происходит.
 Ant13 мая 2013 г., 16:02
Этого не происходит и в .NET 4.0, поэтому я переключаю принятый ответ на основанный на размышлениях ответ MSW.

Ваш ответ на вопрос