2012-11-13 22 views
8

Mam przycisk w aplikacji. Chcę, aby robił różne rzeczy w zależności od tego, czy go stuknę (wstrzymam animację), czy też dwukrotnie dotknę (ponownie uruchomię animację)Zdarzenie w systemie Windows 8/XAML Double Tap jest zawsze poprzedzone kliknięciem

jednak po dwukrotnym dotknięciu wydaje się, że najpierw uruchamia się stuknięcie, a potem dotknij dwukrotnie szybko po sobie. Czy istnieje sposób obejścia tego? Czy jest to znany problem, czy też popełniam błąd debiutanta?

Edytuj: Dla osób pytających używam zdarzeń Tapped i DoubleTapped.

+1

jakiś kod byłby dobry przykład używasz DoubleTapped() lub MouseDoubleClicked(); Zastanawiając się, dlaczego po prostu nie dotkniesz animacji jednym kliknięciem, wydaje się bardziej przyjazny dla użytkownika/intuicyjny. –

+0

Jest to zegar, a pojedyncze dotknięcie zatrzymuje zegar, a dwukrotne dotknięcie powoduje jego całkowite wyzerowanie. – roryok

+0

Dlaczego więc nie chcesz, aby pojedyncze dotknięcie zatrzymywało timer, a jeśli użytkownik kliknie raz jeszcze, a zegar zostanie zatrzymany, pozwól, aby timer działał dalej? tzn. włączać timer za pomocą jednego kliknięcia. –

Odpowiedz

4

Możesz rozważyć zezwolenie na wykonanie obu tych czynności. Pomyśl o tym, klikając dwukrotnie folder w oknach. Użytkownicy będą przyzwyczajać się do tego, co dzieje się przy pierwszym kliknięciu (podświetleniu folderu) i będą oczekiwać podwójnego kliknięcia, aby podświetlić, a następnie nawigować.

Podsumowując, wydaje się, że jest to kwestia konstrukcyjna, a nie techniczna.

+2

możesz mieć rację. Być może uda mi się go złapać logicznie. Właśnie się zastanawiałem, czy używam złych zdarzeń. – roryok

+0

Tak, udało mi się go rozwiązać dzięki lepszemu projektowi logiki. Dzięki. – roryok

+0

Ah, bez problemu :) –

16

Daj trochę pauzy na jednej karcie. Jeśli istnieje podwójna zakładka występuje wtedy pojedyncze zdarzenie zakładka wyeliminowane

bool singleTap; 
    private async void control_Tapped_1(object sender, TappedRoutedEventArgs e) 
    { 
     this.singleTap = true; 
     await Task.Delay(200); 
     if (this.singleTap) 
     { 
       // Single tab Method . 
     } 
    } 

    private void control_DoubleTapped_1(object sender, DoubleTappedRoutedEventArgs e) 
    { 
     this.singleTap = false; 

     // Double tab Method 
    } 
+0

Osobiście czuję, że to najlepszy sposób! –

0
[System.Runtime.InteropServices.DllImport("user32.dll")] 
static extern uint GetDoubleClickTime(); 
    bool _singleTapped = false; 

     //Tapped event handler 
     private async void control_Tapped(object sender, TappedRoutedEventArgs e) 
     { 
     _singleTapped = true; 
      //var x = GetDoubleClickTime(); 
      //GetDoubleClickTime() gets the maximum number of milliseconds that can elapse between a first click and a second click 
      await Task.Delay(TimeSpan.FromMilliseconds(GetDoubleClickTime())); 

      if (!_singleTapped) 
      { return; } 
      //SingleTapped code 
     } 

     //DoubleTapped event handler 
     private async void control_DoubleTapped(object sender, DoubleTappedRoutedEventArgs e) 
     { 
      _singleTapped = false; 
      //DoubleTapped code 
     }