Подтвердить что ты не робот

Как я могу поймать события с одним щелчком мыши и двойным щелчком мыши в WPF FrameworkElement?

Я могу поймать один клик в TextBlock следующим образом:

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

Я могу поймать двойной щелчок в TextBlock следующим образом:

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

Но как я их поймаю на одном TextBlock и различаю между ними?

4b9b3361

Ответ 1

Вам нужно запустить событие после завершения последовательности кликов... когда это? Я предлагаю использовать таймер. Событие MouseDown будет reset и увеличит количество кликов. Когда интервал таймера истекает, он заставляет вызов оценивать количество кликов.

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

Ура!

Ответ 2

Если вам нужно определить разницу, я предлагаю вам использовать такой элемент управления, как Label, который выполняет вашу работу:

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

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

ИЗМЕНИТЬ: Мой совет был приведен в документации по MSDN:

Класс Control определяет PreviewMouseDoubleClick и События MouseDoubleClick, но не соответствующие события с одним щелчком мыши. к см., если пользователь нажал один раз, обрабатывать MouseDown событие (или один из его аналогов) и проверьте, является ли свойство ClickCount значение равно 1.

Однако при этом вы получите уведомление по одному клику, даже если пользователь будет одним кликом.

Ответ 3

Вы должны использовать таймер для разграничения между ними. Добавьте таймер в свою форму в графическом интерфейсе (проще всего - он автоматически обработает распоряжение и т.д.). В моем примере таймер называется 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");
    }
}

Ответ 4

Вы просто можете использовать MouseDown событие и количество кликов, например:

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

Ответ 5

Вы можете сделать это на MouseUp вместо MouseDown. Таким образом вы можете задать свойство ClickCount для общего количества кликов и решить, что делать с этой точки.

Ответ 6

Я сделал это так, и он отлично работает

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

Ответ 7

Это мое рабочее решение:)

    #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