Как я могу отловить события как одного, так и двойного щелчка в WPF FrameworkElement? - PullRequest
20 голосов
/ 18 января 2010

Я могу поймать один щелчок в 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 и различить между ними?

Ответы [ 7 ]

13 голосов
/ 18 января 2010

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

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

Ура! * * 1004

3 голосов
/ 18 января 2010

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

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

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

РЕДАКТИРОВАТЬ: Мой совет следовал из документации на MSDN:

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

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

2 голосов
/ 07 апреля 2014

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

if (e.ChangedButton == MouseButton.Left && e.ClickCount == 2)
{
    // your code here
}
2 голосов
/ 22 июня 2011

Вы должны использовать таймер, чтобы различать их. Добавьте таймер к вашей форме в графическом интерфейсе (самый простой способ - он автоматически обработает удаление и т. Д.). В моем примере таймер называется 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 голос
/ 22 августа 2012

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

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
1 голос
/ 25 июня 2011

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

0 голосов
/ 25 февраля 2015

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

    #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
...