2009-06-30 8 views
9

Me gustaría poder ver los eventos de DoubleClick o MouseDoubleClick desde un botón de opción estándar de winforms, pero parecen estar ocultos y no funcionan. Por el momento tengo un código como este:¿Cómo obtengo un evento de DoubleClick en un botón de radio .NET?

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

¿Hay una manera más simple y más clara de hacerlo?

Editar: Para el fondo, estoy de acuerdo con el poste de Raymond Chen here que la capacidad de hacer doble clic en un botón de opción (si esas son las sólo controles del cuadro de diálogo) hace que el diálogo sólo un poquito más fácil de usar para personas que lo saben

En Vista usando cuadros de diálogo de tareas (ver this Microsoft guideline page o this MSDN page specifically about the Task Dialog API) sería la solución obvia, pero no tenemos el lujo de eso.

Respuesta

10

Basado en su sugerencia original I hecho una solución sin la necesidad de subclase el radiobuton utilizando la reflexión:

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; 

Ahora el evento de doble clic para el botón de radio se dispara. BTW: La sugerencia de Nate al usar e.Clicks no funciona. En mis pruebas, e.Clicks siempre fue 1, no importa qué tan rápido o con frecuencia hice clic en el botón de radio.

3

Se podría hacer algo como esto:

myRadioButton.MouseClick += new MouseEventHandler(myRadioButton_MouseClick); 

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

Usted puede o no puede que también desee comprobar que e.Button == MouseButtons.Left

+0

que estoy aceptando éste, porque aunque creo que mi propia solución es más simple para mi caso, donde voy a usar el mismo control muchas veces, si alguien solo quería uno o dos, el tuyo es mucho más simple. – Ant

+2

Esto no parece estar funcionando en .NET 3.5 ya que los clics == 2 nunca sucede. – Wernight

+0

Esto tampoco ocurre en .NET 4.0, así que estoy cambiando la respuesta aceptada a la basada en la reflexión por MSW. – Ant

0

Lo sentimos, no tienen la reputación de comentar en este. ¿Qué acción está tratando de hacer que el doble clic realice para el usuario? Creo que usar un doble clic puede ser confuso porque es diferente del modelo mental general que un usuario tiene de un botón de radio (IE solo clic, seleccione una opción de un conjunto)

+0

Buen punto. Actualizaré la pregunta – Ant

+0

Ah, ya veo. Está utilizando el doble clic como acceso directo para seleccionar + siguiente. Eso tiene sentido. Creo que el código que presentó es la forma más limpia de hacerlo. Parece que esta es la funcionalidad que MS intentó enterrar intencionalmente para el botón de radio. – Ehz

+0

Eso es lo que pensé :(Gracias por los comentarios. – Ant

1

Basado en respuesta @MSW, he hecho esta clase de extensión:

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

Qué es entonces muy fácil de configurar y reutilización:

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