c# - ¿Cómo puedo detectar los eventos de un solo clic y de doble clic en WPF FrameworkElement?
event-handling double-click (7)
Puedo capturar un solo clic en un TextBlock como este:
private void TextBlock_MouseDown(object sender, MouseButtonEventArgs e)
{
MessageBox.Show("you single-clicked");
}
Puedo atrapar un doble clic en un TextBlock como este:
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 los capturo a los dos en un solo TextBlock y diferencio entre los dos?
Debe activar el evento después de que la secuencia de clics haya terminado ... ¿cuándo es eso? Sugiero usar un temporizador. El evento MouseDown lo restablecería y aumentaría el número de clics. Cuando transcurre el intervalo del temporizador, realiza la llamada para evaluar el recuento 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;
}
¡Aclamaciones!
Debe utilizar un temporizador para diferenciar entre los dos. Agregue un temporizador a su formulario en la GUI (más fácil de esa manera, se manejará automáticamente, 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");
}
}
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
Lo hice así 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
Podrías hacerlo en MouseUp en lugar de MouseDown. De esa manera, puede solicitar a la propiedad ClickCount
el número total de clics y decidir qué hacer a partir de ese punto.
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 siguiendo de la documentación en MSDN:
La clase de Control define los eventos PreviewMouseDoubleClick y MouseDoubleClick, pero no los eventos correspondientes de un solo clic. Para ver si el usuario ha hecho clic en el control una vez, maneje el evento MouseDown (o uno de sus homólogos) y verifique si el valor de la propiedad ClickCount es 1.
Sin embargo, al hacerlo, recibirá una notificación de un solo clic, incluso si el usuario hace un solo clic.
Simplemente puedes usar el evento MouseDown
y contar el número de clics, como este:
if (e.ChangedButton == MouseButton.Left && e.ClickCount == 2)
{
// your code here
}