WPF:Проблема с одним щелчком кнопки + двойным щелчком

StackOverflow https://stackoverflow.com/questions/971459

  •  13-09-2019
  •  | 
  •  

Вопрос

Мне приходится обрабатывать как одиночный щелчок, так и двойной щелчок кнопки в приложении WPF с разной реакцией.К сожалению, при двойном нажатии WPF запускает событие two click и событие double click, поэтому с этой ситуацией сложно справиться.

Он пытался решить это с помощью таймера, но безуспешно...Я надеюсь, вы сможете мне помочь.

Давайте посмотрим на код:

private void delayedBtnClick(object statInfo)
{
    if (doubleClickTimer != null)
        doubleClickTimer.Dispose();
    doubleClickTimer = null;

    this.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal, new VoidDelegate(delegate()
    {
        // ... DO THE SINGLE CLICK ACTION
    }));
}

private void btn_Click(object sender, RoutedEventArgs e)
{
    if (doubleClickTimer == null)
        doubleClickTimer = new Timer(delayedBtnClick, null, System.Windows.Forms.SystemInformation.DoubleClickTime, Timeout.Infinite);
        }
    }
}

private void btnNext_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
    if (doubleClickTimer != null)
        doubleClickTimer.Change(Timeout.Infinite, Timeout.Infinite);    // disable it - I've tried it with and without this line
        doubleClickTimer.Dispose();
    doubleClickTimer = null;

    //.... DO THE DOUBLE CLICK ACTION
}

Проблема в том, что "ДЕЙСТВИЕ с ОДНИМ ЩЕЛЧКОМ МЫШИ" вызывается после "ДЕЙСТВИЯ с ДВОЙНЫМ ЩЕЛЧКОМ МЫШИ" при doubleclick.Странно, что я установилdoubleClickTimer обнулить при двойном щелчке, но в delayedBtnClick это правда : О

Я уже пытался использовать более длительное время, флаг bool и блокировку...

У вас есть какие-нибудь идеи?

Лучший!

Это было полезно?

Решение

Если вы установите RoutedEvent's e.Handled Для true после обработки MouseDoubleClick событие, то оно не будет вызывать Click Событие во второй раз после MouseDoubleClick.

Там есть недавнее сообщение который затрагивает различное поведение для SingleClick и DoubleClick что может быть полезно.

Однако, если вы уверены, что хотите отдельного поведения и хотите / должны заблокировать первое Click так же , как и второй Click, вы можете использовать DispatcherTimer таким, каким был ты.

private static DispatcherTimer myClickWaitTimer = 
    new DispatcherTimer(
        new TimeSpan(0, 0, 0, 1), 
        DispatcherPriority.Background, 
        mouseWaitTimer_Tick, 
        Dispatcher.CurrentDispatcher);

private void Button_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
    // Stop the timer from ticking.
    myClickWaitTimer.Stop();

    Trace.WriteLine("Double Click");
    e.Handled = true;
}

private void Button_Click(object sender, RoutedEventArgs e)
{
    myClickWaitTimer.Start();
}

private static void mouseWaitTimer_Tick(object sender, EventArgs e)
{
    myClickWaitTimer.Stop();

    // Handle Single Click Actions
    Trace.WriteLine("Single Click");
}

Другие советы

Вы могли бы попробовать это:

Button.MouseLeftButtonDown += Button_MouseLeftButtonDown;

private void Button_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    e.Handled = true;

    if (e.ClickCount > 1)
    {
        // Do double-click code
    }

    else
    {
        // Do single-click code
    }
}

При необходимости вы могли бы потребовать щелчка мышью и подождать, пока мышь не поднимется, чтобы выполнить действие.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top