none
Gestion du double click sur un data grid en application tactile (au doigt) RRS feed

  • 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

    vendredi 30 novembre 2012 09:53

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
    jeudi 6 décembre 2012 11:00
  • 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


    Aurel BERA, Microsoft
    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

    • Marqué comme réponse Aurel Bera jeudi 6 décembre 2012 11:23
    mardi 4 décembre 2012 14:07

Toutes les réponses