2013-08-22 2 views
3

WPF 및 하나의 단추에 응용 프로그램이 있습니다. 이 buttun에서 코드를 구현하는 click 이벤트가 필요하지만 마우스로 두 번 클릭 할 때 click 이벤트의 코드가 아닌 다른 코드를 실행해야합니다.더블 클릭을 원할 때 클릭을 피하는 방법은 무엇입니까?

문제는 click 이벤트의 코드는 항상 실행되며 doulbe 클릭을 수행 할 때 click 이벤트의 실행을 피할 수있는 방법이 있는지 여부는 알 수 없습니다.

MVVM 패턴을 따르고 있으며 MVVM 표시등을 사용하여 이벤트를 명령으로 변환합니다.

감사합니다.

+1

버튼에 'OnMouseDoubleClick' 이벤트가 없습니까? –

+0

예 내 버튼에는 클릭 이벤트와 마우스 두 번 클릭 이벤트의 두 가지 이벤트가 있습니다. –

+1

그래서'OnMouseDoubleClick' 이벤트에서 실행하고자하는 코드를 작성하지 않으시겠습니까? –

답변

2

MouseDoubleClick 이벤트를 처리 한 후 RoutedEvent의 e.Handled를 True로 설정하면 두 번째 클릭 이벤트가 발생하는 것을 차단합니다. 먼저 클릭 이벤트 동작을 차단하려면

, 당신은 타이머를 사용할 수 있습니다

클릭 이벤트에
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"); 
} 
+0

하지만 첫 번째 클릭 이벤트가 발생하지 않습니까? 왜냐하면 문제는 더블 클릭의 첫 번째 클릭을 할 때 응용 프로그램이 두 번 클릭할지 여부를 알지 못하기 때문에 클릭 이벤트가 발생한다는 것입니다. –

+0

이 솔루션은 디스패처를 인스턴스화 할 때 디스패처가 실행 중이므로 내 뷰 모델을 인스턴스화 할 때 실행됩니다. Dispatcher를 정지 상태로 인스턴스화하는 방법이 있습니까? –

+0

변수 클래스의 선언 대신보기 모델의 생성자에서 디스패처를 만들고 inmediatly Dispatcher가 뷰 모델 생성시 실행되지 않도록 중지하면 어떻게됩니까? –

3

, 당신은 예를 들어,있는 EventArgs의 클릭 수와 용량을 확인 할 수 있습니다;

private void RightClickDown(object sender, MouseButtonEventArgs e) 
    { 
     if (e.ClickCount == 1) 
     { 
      //do single click work here. 
     } 
     if (e.ClickCount == 2) 
     { 
      //do double click work. 
     } 
    } 

즉, 원하는 경우 싱글 클릭과 더블 클릭을 수동으로 구분할 수 있습니다.

+0

나는이 방법을 시도했다. 문제는 이벤트가 발생하면 MouseLeftDown의 PreviewMouseLeftDown 이벤트 instad를 사용해야하기 때문에 미리보기를 사용하면이 코드가 작동하지 않는다고 생각합니다. MouseLeftDown 이벤트를 사용하면 해고되지 않습니다. –

+1

두 번 누르기가 감지되지만 첫 번째 클릭을 항상 감지하므로 한 번의 클릭으로 코드가 실행됩니다. 나중에 두 번째 클릭이 있으면 두 번 클릭 코드가 실행됩니다. –

2

Here은 클릭 수와 두 번 클릭 수를 구별하는 좋은 방법입니다. 그리고 그것을 달성 할 수있는 방법에 대한 2 가지 예를 보여줍니다.

0

이 솔루션은 다른 두 솔루션의 혼합입니다. 나는 양쪽 모두에게 받아 들인 해결책을 줄 수는 없다. 미안하다.

두 이벤트 (클릭 및 이중 클릭) 대신에 PreviewMouseLeftButtonDown을 사용하여 단일 클릭 또는 두 번 클릭이 작동하는시기를 제어하는 ​​경우

그래서 나는이 코드를 사용하여 문제를 해결 :

이 첫 번째 방법은 마우스로 클릭을 제어 할 수 있습니다.

private void MouseLeftButtonDownCommand(MouseButtonEventArgs e) 
     { 

      if (e.ClickCount == 1) 
      { 
       _dtMouseClick.Start(); 
      } 

      else if(e.ClickCount > 1) 
      { 
       _dtMouseClick.Stop(); 

       //the code of the double click 
      } 
     } 

이 메소드는 DispatcherTimer에 링크되는 메소드로 두 번째 클릭으로 중지되지 않으면 실행됩니다.

private void MouseClick_Tick(object sender, System.EventArgs e) 
     { 
      _dtrMouseClick.Stop(); 

      //code of the single click     
     } 

dispatcherTimer는 뷰 모델

_dtBotonBuscarMouseClick = 
       new System.Windows.Threading.DispatcherTimer(
       new TimeSpan(0, 0, 0, 0, 250), 
       System.Windows.Threading.DispatcherPriority.Background, 
       MouseClick_Tick, 
       System.Windows.Threading.Dispatcher.CurrentDispatcher); 
      _dtMouseClick.Stop(); 

간격은 사용자가 두 번 클릭해야하는 시간 간격이입니다은 250ms이다의 생성자에서 만드는 것입니다.

이 솔루션에서는 dispatcherTimer, stop() 메서드를 중지하는 데 같은 방법을 사용하지만 두 가지 이벤트 (click 및 mouseDoubleClick)를 사용하면 어떤 이유로 DispatcherTimer가 두 번 클릭으로 중지되지 않고 if 솔루션이 작동하는 MouseLeftButtonDown 이벤트를 사용합니다.

관련 문제