Pergunta

Eu gostaria de ser capaz de capturar os eventos DoubleClick ou MouseDoubleClick partir de um botão winforms padrão de rádio, mas eles parecem ser escondido e não trabalhar. No momento eu tenho um código como este:

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

Existe uma maneira mais simples e mais limpa de fazê-lo?

Edit: Para o fundo, eu concordo com o post de Raymond Chen aqui que a capacidade de duplo clique sobre um botão de rádio (se esses são os única controles no diálogo) faz com que o diálogo apenas um pouco mais fácil de usar para as pessoas que sabem sobre isso.

Em Vista usando Task Diálogos (ver este página diretriz Microsoft ou desta página MSDN especificamente sobre a API diálogo Tarefa) seria a solução óbvia, mas não temos o luxo de que.

Foi útil?

Solução

Com base na sua sugestão original eu fiz uma solução sem a necessidade de subclasse o radiobuton usando a reflexão:

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;

Agora, o evento de clique duplo para o radiobutton é acionado. BTW: A sugestão de Nate usando e.Clicks não funciona. Em meus testes e.Clicks sempre foi um, não importa o quão rápido ou muitas vezes eu cliquei no botão de opção.

Outras dicas

Você poderia fazer algo parecido com isto:

myRadioButton.MouseClick += new MouseEventHandler(myRadioButton_MouseClick);

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

Você pode ou não pode também querer verificar que e.Button == MouseButtons.Left

Com base na resposta @MSW, eu fiz essa classe de extensão:

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

Qual é, então, super fácil de configurar e re-uso:

radioButton.AllowDoubleClick((a, b) => myDoubleClickAction());

Desculpe, não têm a reputação de comentário sobre o assunto. Que medidas você está tentando ter o clique-duplo apresentar para o usuário? Eu acho que usando um duplo-clique pode ser confuso porque é diferente do modelo mental geral que um usuário tem de um botão de rádio (IE único clique, selecione uma opção de um conjunto)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top