2010-01-18 13 views
19

puedo coger un solo clic en un TextBlock como esto:¿Cómo puedo ver los eventos de un solo clic y doble clic en WPF FrameworkElement?

private void TextBlock_MouseDown(object sender, MouseButtonEventArgs e) 
{ 
    MessageBox.Show("you single-clicked"); 
} 

puedo coger un doble clic en un TextBlock como esto:

private void TextBlock_MouseDown(object sender, MouseButtonEventArgs e) 
{ 
    if (e.LeftButton == MouseButtonState.Pressed) 
    { 
     if (e.ClickCount == 2) 
     { 
      MessageBox.Show("you double-clicked"); 
     } 
    } 
} 

Pero, ¿cómo hacer Los encuentro a ambos en un solo TextBlock y diferencio entre los dos?

+3

¿Cómo diferenciará _user_ entre ellos? –

Respuesta

3

Si necesita detectar la diferencia, le sugiero que utilice un control como Label que hace el trabajo por usted:

label.MouseDown += delegate(object sender, MouseEventArgs e) 
{ 
    if (e.ClickCount == 1) 
    { 
     // single click 
    } 
}; 

label.MouseDoubleClick += delegate 
{ 
    // double click 
}; 

EDIT: Mi consejo fue seguido de la documentación en MSDN:

La clase de control define los eventos PreviewMouseDoubleClick y MouseDoubleClick, pero no correspondientes eventos de un solo clic. Para ver si el usuario ha hecho clic en el control de vez, manejar el evento MouseDown (o uno de sus homólogos) y comprobación de si la propiedad ClickCount valor es 1.

Sin embargo, esto le dará una notificación de un solo clic, incluso si el usuario hace un solo clic.

+0

+1 por sugerencia de usar la etiqueta, no me di cuenta de que heredó Control a diferencia de TextBlock, pero en realidad en mi aplicación recibo un FrameworkElement, así que necesito alguna solución sin usar Control. –

+0

"Sin embargo, al hacerlo, recibirá una notificación con un solo clic, incluso si el usuario hace un solo clic". - ¿Quiere decir que le da un solo clic, incluso si el usuario * hace doble clic, ¿verdad? –

+1

Esto no funciona en absoluto. Seguirá recibiendo MouseDown con un doble clic y e.ClickCount será igual a 1. –

13

Necesita activar el evento después de que la secuencia de clics termine ... ¿cuándo es eso? Sugiero usar un temporizador. El evento MouseDown lo reiniciaría y aumentaría el número de clics. Cuando el intervalo del temporizador transcurre, realiza la llamada para evaluar el conteo de clics.

private System.Timers.Timer ClickTimer; 
    private int ClickCounter; 

    public MyView() 
    { 
     ClickTimer = new Timer(300); 
     ClickTimer.Elapsed += new ElapsedEventHandler(EvaluateClicks); 
     InitializeComponent(); 
    } 

    private void TextBlock_MouseDown(object sender, MouseButtonEventArgs e) 
    { 
     ClickTimer.Stop(); 
     ClickCounter++; 
     ClickTimer.Start(); 
    } 

    private void EvaluateClicks(object source, ElapsedEventArgs e) 
    { 
     ClickTimer.Stop(); 
     // Evaluate ClickCounter here 
     ClickCounter = 0; 
    } 

¡Salud!

+2

Gracias realmente ayudó saber cómo otros resolvieron esto. –

+0

Entonces hago un clic izquierdo seguido de un clic rápido con el botón derecho ... –

+0

@ kelton52, traté de mostrar cómo funciona. Utilice el evento 'MouseLeftButtonDown' o cualquier otro que se ajuste a sus necesidades. – Natxo

2

Debe usar un temporizador para diferenciar entre los dos. Agregue un temporizador a su formulario en la GUI (lo más fácil es que maneje automáticamente la eliminación, etc.). En mi ejemplo, el temporizador se llama clickTimer.

private bool mSingleClick; 

private void TextBlock_MouseUp(object sender, MouseButtonEventArgs e) 
{ 

    if (e.Button == MouseButtons.Left) 
    { 
     if (e.ClickCount < 2) 
     { 
      mSingleClick = true; 
      clickTimer.Interval = System.Windows.Forms.SystemInformation.DoubleClickTime; 
      clickTimer.Start(); 
     } 
     else if (e.ClickCount == 2) 
     { 
      clickTimer.Stop(); 
      mSingleClick = false; 
      MessageBox.Show("you double-clicked"); 
     } 
    } 
} 

private void clickTimer_Tick(object sender, EventArgs e) 
{ 
    if (mSingleClick) 
    { 
     clickTimer.Stop(); 
     mSingleClick = false; 
     MessageBox.Show("you single-clicked"); 
    } 
} 
1

Puede hacerlo en MouseUp en lugar de MouseDown. De esta forma, puede solicitar a la propiedad ClickCount el número total de clics y decidir qué hacer desde ese punto.

1

lo hice de esta manera y funciona perfectamente

If e.Clicks = 2 Then 
      doubleClickTimer.Stop() 
     ElseIf e.Clicks = 1 Then 
      doubleClickTimer.Enabled = True 
      doubleClickTimer.Interval = 1000 
      doubleClickTimer.Start() 


     End If 


Private Sub doubleClickTimer_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles doubleClickTimer.Tick 

     OpenWebPage("abc") 
     doubleClickTimer.Stop() 
    End Sub 
2

usted simplemente puede usar MouseDown evento y contar haga clic en el número, así:

if (e.ChangedButton == MouseButton.Left && e.ClickCount == 2) 
{ 
    // your code here 
} 
+1

Mucho más simple que las otras respuestas. – rolls

0

Es mi solución de trabajo :)

#region message label click -------------------------------------------------------------------------- 
private Timer messageLabelClickTimer = null; 

private void messageLabel_MouseUp(object sender, MouseButtonEventArgs e) 
{ 
    Debug.Print(e.ChangedButton.ToString() + "/Left:" + e.LeftButton.ToString() + " Right:" + e.RightButton.ToString() + " click: " + e.ClickCount.ToString()); 
    // in MouseUp (e.ClickCount == 2) don't work!! Always 1 comes. 
    // in MouseDown is set e.ClickCount succesfully (but I don't know should I fire one clicked event or wait second click) 

    if (e.ChangedButton == MouseButton.Left) 
    { 
    if (messageLabelClickTimer == null) 
    { 
     messageLabelClickTimer = new Timer(); 
     messageLabelClickTimer.Interval = 300; 
     messageLabelClickTimer.Elapsed += new ElapsedEventHandler(messageLabelClickTimer_Tick); 
    } 

    if (! messageLabelClickTimer.Enabled)             
    { // Equal: (e.ClickCount == 1) 
     messageLabelClickTimer.Start(); 
    } 
    else 
    { // Equal: (e.ClickCount == 2) 
     messageLabelClickTimer.Stop(); 

     var player = new SoundPlayer(ExtraResource.bip_3short);    // Double clicked signal 
     player.Play(); 
    } 
    } 
} 

private void messageLabelClickTimer_Tick(object sender, EventArgs e) 
{ // single-clicked 
    messageLabelClickTimer.Stop(); 

    var player = new SoundPlayer(ExtraResource.bip_1short);     // Single clicked signal 
    player.Play(); 
}  
#endregion 
Cuestiones relacionadas