2011-08-02 4 views
1

Je développe une application tactile WPF4 qui utilise des contrôles Microsoft Surface. Je voudrais attraper l'événement MouseDoubleClick sur un ScatterViewItem. L'événement se déclenche lorsque j'utilise la souris, mais lorsque j'utilise mon doigt, l'événement n'est jamais déclenché. Pourquoi ?MouseDoubleClick & Touch sur un ScatterViewItem

Merci beaucoup.

MISE À JOUR:

J'ai finalement écrit ce code pour reproduire un simple double tap avec l'événement TouchLeave sur une rect limitée (16px largeur & hauteur) et 500 ms pour le temps nécessaire entre les 2 événements TouchLeave. Ce code n'est pas optimisé, mais cela fonctionne, si vous avez une remarque, ne pas hésiter :)

private bool _doubleHasTimeAndPos = false; 

private TimeSpan? _doubleTouchTime = null; 
private Point? _doubleTouchPoint = null;  

private void ScatterViewItem_TouchLeave(object sender, TouchEventArgs e) 
    { 
     if (!this._doubleHasTimeAndPos) 
     { 
      this._doubleTouchTime = DateTime.Now.TimeOfDay; 
      this._doubleTouchPoint = e.GetTouchPoint(this.scatterView).Position; 

      this._doubleHasTimeAndPos = true; 
     } 
     else 
     { 
      if (DateTime.Now.TimeOfDay.Subtract(this._doubleTouchTime.Value).TotalMilliseconds <= 500) 
      { 
       Point touchPoint = e.GetTouchPoint(this.scatterView).Position; 

       double xDelta = Math.Abs(this._doubleTouchPoint.Value.X - touchPoint.X); 
       double yDelta = Math.Abs(this._doubleTouchPoint.Value.Y - touchPoint.Y); 

       if (xDelta <= 16 && yDelta <= 16) 
       { 
        // DOUBLE TAP here ! 
       } 
      } 

      this._doubleTouchTime = null; 
      this._doubleTouchPoint = null; 

      this._doubleHasTimeAndPos = false; 
     } 
    } 
+0

1) vous ne devriez pas faire cela - voir ma réponse ci-dessous. 2) vous devriez utiliser TouchUp au lieu de TouchLeave. Le congé est levé dans plusieurs circonstances autres que le fait de lever le doigt. 3) pour comparer les coordonnées entre les événements tactiles, vous devez utiliser les coordonnées relatives à l'écran plutôt que le scatterview. le scatterview ou même la fenêtre dans laquelle il se trouve pourrait se déplacer entre les événements. Ceci est une source commune de bugs difficiles à diagnostiquer –

+0

merci pour votre remarque, mais l'événement TouchDown/TouchUp ne semble jamais être soulevé sur mon ScatterViewItem ... Je ne sais pas pourquoi ... – Nico

Répondre

0

Juste une supposition en raison du manque d'infrastructures tactile pour tester ce code ...

WPF recommande en utilisant l'événement attaché Mouse.MouseDown pour tout UIElement, puis en utilisant ((MouseButtonEventArgs) e.ClickCount) pour vérifier la valeur 2 en double-cliquant.

 <ScatterViewItem Mouse.MouseDown="MouseButtonEventHandler" ... /> 

Et puis

 private void MouseButtonDownHandler(object sender, MouseButtonEventArgs e) 
    { 
      if (e.ClickCount == 2) 
      { 
        //// Its a double click... should work for touch. 
      } 
    } 

Laissez-moi savoir si cela fonctionne ....

+0

Ne fonctionne pas, l'événement est jamais élevé ... :(en fait, je pense qu'il n'y a aucun événement de souris qui fonctionnent avec le toucher sur un ScatterViewItem ... J'ai essayé ceci: Mouse.AddMouseDownHandler (myScatterItem, new MouseButtonEventHandler (TestMouseDown)); myScatterItem.MouseDown + = blablabla ... – Nico

+0

My Bad! Ceci est clairement un événement lié au toucher et ne fonctionnera pas de la même manière que le double-clic de la souris.Un seul moyen de supposer un double tap est de gérer un événement TouchDown et avoir un comportement attaché garder la différence entre deux touchdowns suivants sur le même élément (auquel le comportement est attaché) à proximité comme h alf une seconde différence .... –

0

Au niveau de l'API, les événements tactiles ne génère pas d'événements double clic.

En outre, les directives de conception de Surface UI de Microsoft (avertissement: j'ai aidé à les écrire) déconseillent réellement le concept de «double tap». Le toucher vise à donner à l'utilisateur un moyen plus naturel d'interagir avec la technologie sans qu'il soit nécessaire de tranformer, de documenter ou de mémoriser des fonctionnalités «cachées». Le double-clic n'est pas une interaction que les humains font dans le monde physique et ce n'est pas quelque chose pour lequel il y a des affordances visuelles. Par conséquent, il n'est pas approprié d'utiliser dans des applications logicielles. Apple est d'accord avec cette philosophie, btw - vous ne verrez pas d'interactions à double-pression sur l'iPhone ou l'iPad.

+0

Je suis avec vous en ce qui concerne les doubles taps comme pas l'action de sélection primaire pour les écrans tactiles, mais ayant dit que les iPhones \ iPads supportent les doubles taps pour le zoom. Cela peut donc être une option pour l'action de l'utilisateur. –

Questions connexes