Meilleur auteur de réponses
Gestion du double click sur un data grid en application tactile (au doigt)

Question
-
Bonjour,
Je code une appli sur C# framework 4 en WPF, pour tablette tactile windows 7.
Je n'arrive pas à faire fonctionner l'évènement double click en mode tactile. il marche bien avec la souris, mais sur une tablette tactile en touchant l'écran avec le doigt et en tapant deux fois sur une ligne du datagrid, l'évènement double click n'est pas déclenché.
Evènement : MouseDoubleClick : (marche à la souris mais pas au doigt)
private void dataGrid1_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
/* code*/
}auriez vous une piste ?
merci
Réponses
-
Super cela marche bien !!
Merci de votre rapidité et de la solution apportée.
la correction avec substract :
bool tapsAreCloseInDistance = Point.Subtract(currentTapPosition, _lastTapLocation).Length < 40;
le code complet que j'ai un peu modifié pour l'adapter :
private readonly Stopwatch _doubleTapStopwatch = new Stopwatch(); private Point _lastTapLocation;
private bool IsDoubleTap(TouchEventArgs e) { Point currentTapPosition = e.GetTouchPoint(this).Position; bool tapsAreCloseInDistance = Point.Subtract(currentTapPosition, _lastTapLocation).Length < 30; _lastTapLocation = currentTapPosition; TimeSpan elapsed = _doubleTapStopwatch.Elapsed; _doubleTapStopwatch.Restart(); bool tapsAreCloseInTime = (elapsed != TimeSpan.Zero && elapsed < TimeSpan.FromSeconds(0.7)); return tapsAreCloseInDistance && tapsAreCloseInTime; } private void dataGridReserves_TouchDown(object sender, TouchEventArgs e) { if (IsDoubleTap(e)) dataGrid1_MouseDoubleClick(sender, null); }
- Marqué comme réponse Aurel Bera jeudi 6 décembre 2012 11:23
-
J’ai avance sur le problème. DoubleTap peut être implémentée avec un StopWatch :
http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.aspx
comme ça :
private readonly Stopwatch _doubleTapStopwatch = new Stopwatch(); private Point _lastTapLocation; public event EventHandler DoubleTouchDown; protected virtual void OnDoubleTouchDown() { if (DoubleTouchDown != null) DoubleTouchDown(this, EventArgs.Empty); } private bool IsDoubleTap(TouchEventArgs e) { Point currentTapPosition = e.GetTouchPoint(this).Position; bool tapsAreCloseInDistance = currentTapPosition.GetDistanceTo(_lastTapLocation) < 40; _lastTapLocation = currentTapPosition; TimeSpan elapsed = _doubleTapStopwatch.Elapsed; _doubleTapStopwatch.Restart(); bool tapsAreCloseInTime = (elapsed != TimeSpan.Zero && elapsed < TimeSpan.FromSeconds(0.7)); return tapsAreCloseInDistance && tapsAreCloseInTime; } private void OnPreviewTouchDown(object sender, TouchEventArgs e) { if (IsDoubleTap(e)) OnDoubleTouchDown(); }
Aurel
- Marqué comme réponse Aurel Bera jeudi 6 décembre 2012 11:23
Toutes les réponses
-
Bonjour
Prenez quelques minutes pour lire ca :
http://social.msdn.microsoft.com/Forums/en/wpf/thread/23920beb-ad4e-45e5-8f01-a9280db1a20c
Pour la traduction vous pouvez utiliser http://www.bing.com/translator/
Cordialement,
- Proposé comme réponse Ould MouradEditor lundi 3 décembre 2012 16:16
- Non proposé comme réponse XingBull jeudi 6 décembre 2012 11:04
-
Bonjour,
Est-ce que vous avez testé les solutions proposées ? Merci de partager avec nous les résultats, afin que d'autres personnes avec le même problème puissent profiter de cette solution.
Cordialement,
Aurel
-
Bonjour,
merci de votre réponse.
Je ne connaissais pas la gestion des gestures ça me permet d'avancer. Mais le TwoFingersTap n'est pas intuitif pour l'utilisateur cela ne correspond pas à un double clic.
Exemple :
je veux que l'utilisateur clique sur une ligne d'un datagrid et s'il fait un double clic cela ouvre une popup avec des informations supplémentaire concernant cette ligne.
Cela marche bien avec l'evènement MouseDoubleClick. Par contre le gesture TwoFingersTap est différent.
Il se produit dès qu'un utilisateur touche le datagrid avec deux doigts.
Exemple si l'utilisateur sélectionne la ligne 8 puis appuie a deux doigts sur la ligne 2 cela ouvre la popup concernant la ligne 8.
Sans parler du fait que pour des utilisateurs non formés personne ne trouvera qu'il faut mettre deux doigts simultanés pour faire un double clic.
Je ne comprends pas que microsoft n'a pas géré la fonction DoubleTap cela me semble pourtant très utile. Ils ont bien géré le clic droit avec un tap long. Le double clic semble aussi utile mais aucun moyen de le faire en tactile.
-
Conformément à ce qui est écrit ici
http://msdn.microsoft.com/fr-fr/library/system.windows.input.systemgesture.aspx
on a :
TwoFingerTap
Mappe à un double-clic de souris.
Avez-vous essayez et ça ne marche pas comme il faut ?
Cordialement,
- Modifié Aurel Bera mardi 4 décembre 2012 13:50
-
J’ai avance sur le problème. DoubleTap peut être implémentée avec un StopWatch :
http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.aspx
comme ça :
private readonly Stopwatch _doubleTapStopwatch = new Stopwatch(); private Point _lastTapLocation; public event EventHandler DoubleTouchDown; protected virtual void OnDoubleTouchDown() { if (DoubleTouchDown != null) DoubleTouchDown(this, EventArgs.Empty); } private bool IsDoubleTap(TouchEventArgs e) { Point currentTapPosition = e.GetTouchPoint(this).Position; bool tapsAreCloseInDistance = currentTapPosition.GetDistanceTo(_lastTapLocation) < 40; _lastTapLocation = currentTapPosition; TimeSpan elapsed = _doubleTapStopwatch.Elapsed; _doubleTapStopwatch.Restart(); bool tapsAreCloseInTime = (elapsed != TimeSpan.Zero && elapsed < TimeSpan.FromSeconds(0.7)); return tapsAreCloseInDistance && tapsAreCloseInTime; } private void OnPreviewTouchDown(object sender, TouchEventArgs e) { if (IsDoubleTap(e)) OnDoubleTouchDown(); }
Aurel
- Marqué comme réponse Aurel Bera jeudi 6 décembre 2012 11:23
-
-
Bonjour
Un petit retour SVP?
Merci
-
Bonjour,
merci de votre réponse ! et désolé du retard.
il doit me manquer un using ou une référence car sur la ligne :
bool tapsAreCloseInDistance = currentTapPosition.GetDistanceTo(_lastTapLocation) < 40;
j'ai l'erreur suivante :
Erreur 23 'System.Windows.Point' ne contient pas une définition pour 'GetDistanceTo' et aucune méthode d'extension 'GetDistanceTo' acceptant un premier argument de type 'System.Windows.Point' n'a été trouvée (une directive using ou une référence d'assembly est-elle manquante ?)
j'ai essayé d'ajouter la référence "System.Device" et le "using System.Device.Location;" mais j'ai toujours l'erreur.
- Modifié XingBull jeudi 6 décembre 2012 10:32
-
Bonjour
En place de GetDistanceTo utilisez Substract.
Ça donne un object de type Vecteur et vous avez besoin de la Length (comparer si la distance entre les deux clicks n’est pas trop grand).
http://msdn.microsoft.com/en-us/library/system.windows.vector.length.aspx
Cordialement,
-
Super cela marche bien !!
Merci de votre rapidité et de la solution apportée.
la correction avec substract :
bool tapsAreCloseInDistance = Point.Subtract(currentTapPosition, _lastTapLocation).Length < 40;
le code complet que j'ai un peu modifié pour l'adapter :
private readonly Stopwatch _doubleTapStopwatch = new Stopwatch(); private Point _lastTapLocation;
private bool IsDoubleTap(TouchEventArgs e) { Point currentTapPosition = e.GetTouchPoint(this).Position; bool tapsAreCloseInDistance = Point.Subtract(currentTapPosition, _lastTapLocation).Length < 30; _lastTapLocation = currentTapPosition; TimeSpan elapsed = _doubleTapStopwatch.Elapsed; _doubleTapStopwatch.Restart(); bool tapsAreCloseInTime = (elapsed != TimeSpan.Zero && elapsed < TimeSpan.FromSeconds(0.7)); return tapsAreCloseInDistance && tapsAreCloseInTime; } private void dataGridReserves_TouchDown(object sender, TouchEventArgs e) { if (IsDoubleTap(e)) dataGrid1_MouseDoubleClick(sender, null); }
- Marqué comme réponse Aurel Bera jeudi 6 décembre 2012 11:23