Как получить событие 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 );
        }
    }
}

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

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

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


person Ant    schedule 30.06.2009    source источник


Ответы (4)


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

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

person MSW    schedule 03.09.2010

Вы можете сделать что-то вроде этого:

myRadioButton.MouseClick += new MouseEventHandler(myRadioButton_MouseClick);

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

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

person Nate    schedule 30.06.2009
comment
Я принимаю этот, потому что, хотя я думаю, что мое собственное решение проще для моего случая, когда я буду использовать один и тот же элемент управления много раз, если кто-то просто хочет один или два, то ваше решение намного проще. - person Ant; 03.07.2009
comment
Похоже, это не работает в .NET 3.5, так как Clicks == 2 никогда не происходит. - person Wernight; 08.03.2011
comment
Этого не происходит и в .NET 4.0, поэтому я переключаю принятый ответ MSW на ответ, основанный на отражении. - person Ant; 13.05.2013

Основываясь на ответе @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());
person noelicus    schedule 28.01.2016

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

person Ehz    schedule 01.07.2009
comment
Ах я вижу. Вы используете двойной щелчок в качестве ярлыка для выбора + далее. В этом есть смысл. Я думаю, что код, который вы представили, является самым чистым способом сделать это. Похоже, это функциональность, которую MS пыталась намеренно похоронить для радиокнопки. - person Ehz; 01.07.2009
comment
Я так и думал :( Спасибо за отзыв. - person Ant; 02.07.2009