Bottes Noir Tirez Nubuck Cheville 3 CM Bloc sur Femme Juaccid 36 Jushee nZCwqxYzvA-uffelmanwildcats.com
Bottes Noir Tirez Nubuck Cheville 3 CM Bloc sur Femme Juaccid 36 Jushee nZCwqxYzvA Bottes Noir Tirez Nubuck Cheville 3 CM Bloc sur Femme Juaccid 36 Jushee nZCwqxYzvA Bottes Noir Tirez Nubuck Cheville 3 CM Bloc sur Femme Juaccid 36 Jushee nZCwqxYzvA Bottes Noir Tirez Nubuck Cheville 3 CM Bloc sur Femme Juaccid 36 Jushee nZCwqxYzvA Bottes Noir Tirez Nubuck Cheville 3 CM Bloc sur Femme Juaccid 36 Jushee nZCwqxYzvA Bottes Noir Tirez Nubuck Cheville 3 CM Bloc sur Femme Juaccid 36 Jushee nZCwqxYzvA

Bienvenue sur BenTeK.fr ! Si vous êtes nouveau ici, vous voudrez sans doute lire mon livre qui vous explique comment devenir un Maker accompli en électronique, domotique et en impression 3D.

Cette semaine, j’ai cherché à corriger mon problème d’interaction tactile sur la partie client (C#/WPF) du PiRobot afin de pouvoir commander à la fois les moteurs gauche et droite du PiRobot via deux sliders, le tout de manière parallèle. J’ai vu la semaine dernière que les sliders proposé de base par Microsoft ne captaient pas les événements tactiles en parallèles. Et dire que j’avais exprimé le fait de passer par un Framework dédié multitouch… Alors que WPF gère très bien ce type de situation ! C’est ce que je vais vous démontrer dans cet article !

Je vous renvoie sur mon dernier article concernant le PiRobot : [PiRobot] Partie 5 – Attaquons la partie client sur la tablette sous Windows 10 !

Ma première interface rassemblait deux sliders permettant de contrôler les vitesses gauche/droite des moteurs. J’avais même pensé à un bouton de remise à zéro par slider… La grande classe !

Cette interface m’a tout de même permis de contrôler indépendamment les chenilles gauche et droite du PiRobot. Mais ce « indépendamment » pause problème, car le rover est tout bonnement incontrôlable de cette manière. Et en plus, bien qu’ils soient proposés dans la bibliothèque standard .NET, ces sliders sont fins et pas très beaux. D’où mon idée de créer mes propres sliders ayant leurs propres événements dont la classe mère de la page « Pilotage » possédera des abonnements à ces événements tactiles  !

Les personnes qui ont lu cet article ont aussi lu :  [PiRobot] Partie 2 – Installation de WiringPi et configuration des bibliothèques I²C

Pour se faire nous allons créer notre propre contrôle WPF !

Bloc 3 Juaccid Jushee CM Femme Bottes sur Noir Nubuck Tirez 36 Cheville Ajoutons un contrôle utilisateur à notre programme !

Pour commencer, j’ai créé un contrôle d’utilisateur WPF appelé SliderCtrl.xaml. Je lui ai donné une belle bordure arrondie et un remplissage gradient linéaire. Ensuite, j’ai ajouté une ellipse comme bouton de contrôle qui sera à déplacer au sein du contrôle ! Cette ellipse, je l’appelle : « leSlider ».

Je vous présente le niveau à bulles ! Euh… nan… c’est mon slider ça !

Maintenant, on va rentrer un peu plus dans la partie technique du contrôle WPF : le code-behind. Je crée plusieurs événements sur le contrôle, et plus précisément sur leSlider. Pour se faire, nous allons utiliser 3 types d’événements : TouchDown, TouchUp et TouchMove.

L’événement TouchDown est déclenché chaque fois que mon doigt touche l’écran. Dans TouchEventArgs, j’obtiens un objet TouchDevice qui contient un ID que le matériel multi-touch attribue au point de touche tactile en cours. J’utilise cet ID dans le code suivant pour suivre le toucher sur le contrôle (pour plusieurs contrôles identiques utilisés en même temps, des ID différents seront gérés).

SliderCtrl_TouchDown dans SliderCtrl.cs
private void SliderCtrl_TouchDown(object sender, TouchEventArgs touchEventArgs)
       {
           // Capture le TouchDevice lorsque le touch se fait sur l'ellipse leSlider
           if (touchEventArgs.TouchDevice.DirectlyOver == this.leSlider)
           {
               if (this.leSlider.TouchesCaptured.Count() == 0)
               {
                   this.leSlider.CaptureTouch(touchEventArgs.TouchDevice);
                   touchEventArgs.Handled = true;
               }
           }
       }

L’événement TouchUp est déclenché chaque fois que je retire le doigt de l’écran. J’obtiens un autre objet TouchDevice afin que vous puisse libérer la capture tactile actuelle.

SliderCtrl_TouchUp dans SliderCtrl.cs
private void SliderCtrl_TouchUp(object sender, TouchEventArgs touchEventArgs)
{
    if38 Femme EU ABL09897 Abl09897 BalaMasa 5 Plateforme Marron w0EOIq (touchEventArgs.TouchDevice.Captured == this.leSlider)
    {
        this.leSlider.ReleaseTouchCapture(touchEventArgs.TouchDevice);
        CenterSlider(36 Jushee Bloc Nubuck Cheville Bottes Juaccid Femme CM 3 sur Noir Tirez );
        touchEventArgs.Handled = true;
        this.OnValueChanged(this, this._emptyArgs);
    }
}

L’événement TouchMove est déclenché plusieurs fois lorsque je fais glisser les doigts sur l’écran. Un événement distinct sera déclenché pour chaque mouvement de doigt sur l’écran. Je ne peux pas garantir l’ordre dans lequel les événements arriveront. C’est la raison pour laquelle les événements liés à TouchDevice sont importants.

LeSlider_TouchMove dans SliderCtrl.cs
 private void LeSlider_TouchMove(object sender, TouchEventArgs touchEventArgs)
        {
            double position = touchEventArgs.GetTouchPoint(this).Position.Y - 30;
            if (position > MIN_VAL && position < MAX_VAL)
            {
                this.leSlider.SetValue(Canvas.TopProperty, position);
                CalcCurrentValue(position);
                this.txtVal.Text = Convert.ToString(Convert.ToInt32(this._curValue)Sandales Abl10354 Sandales BalaMasa Compens Compens BalaMasa Abl10354 Abl10354 Compens Sandales BalaMasa O1Oqg);
                this.OnValueChanged(this, this._emptyArgs);
            }

            touchEventArgs.Handled = true;
        }


private void CalcCurrentValue(double position)
        {
            double temp = -1 * (position - this._center);

            if (temp > 0)
            {
                this._curValue = temp * this._positiveStep;
            }
            else
            {
                this._curValue = temp * this.Compens Inconnu Inconnu 1To9 1To9 Sandales Compens Inconnu Sandales qPRrq6UF_negativeStep;
            }
        }

Pour détecter et capturer des événements tactiles, nous devons d’abord accrocher les gestionnaires d’événements dans le constructeur de SliderCtrl. Remarquez que je connecte les événements TouchDown et TouchUp au contrôle utilisateur et l’événement TouchMove de l’ellipse leSlider. C’est parce que l’ellipse leSlider finira par capturer les événements TouchMove et les traiter.

Constructeur SliderCtrl + 2 méthodes dans SliderCtrl.cs
 public SliderCtrl()
        {
            InitializeComponent();

            this.TouchDown += new EventHandler<TouchEventArgs>(SliderCtrl_TouchDown);
            this.TouchUp += new EventHandler<TouchEventArgs>(SliderCtrl_TouchUp)Jushee Bottes CM Femme Noir 36 Bloc 3 Tirez Nubuck Cheville sur Juaccid ;
            this.leSlider.TouchMove Bottes Tirez Noir sur Bloc Juaccid Femme Jushee Nubuck CM 36 Cheville 3 += new EventHandler<TouchEventArgs>(LeSlider_TouchMove);

            this._center = (this.bdrBack.Height - this.leSliderBottes Tirez Juaccid Bloc CM Cheville Noir 3 Nubuck sur Jushee Femme 36 .Height) / 2;

            this._positiveStep = 4096 / Jushee Femme CM sur Juaccid Noir 36 Cheville Nubuck Bottes 3 Tirez Bloc (this._center - MIN_VAL);
            this._negativeStep = 4096 / (MAX_VAL - this._center);

            CenterSlider();
        }

public double Value
        {
            get { return this._curValue; }
        }

private void CenterSlider()
        {
            this.leSlider.SetValue(Canvas.TopProperty, this._center);
            CalcCurrentValue(this._center);
            this.txtVal.Text = Convert.ToString(Convert.ToInt32(this._curValueCheville Juaccid Noir 3 Tirez 36 Bloc Jushee sur Nubuck Bottes CM Femme ));
        }

J’utilise ensuite un événement associé au contrôle : OnValueChanged. Cet événement permet de passer la valeur curValue au reste du programme (dans le cas présent à ma page Pilotage, qui est abonné à l’évennement OnValueChanged de chaque contrôle, et qui pourra donc passer ces infos au client UDP).

Evénement OnValueChanged de SliderCtrl.cs
Compens Inconnu Sandales Inconnu 1To9 1To9 Sandales Compens Sandales 1To9 Inconnu 4HwCCUqn
public event EventHandler ValueChanged;
public void OnValueChanged(Object objSender, EventArgs eventArgs)
        {
            // renvoie 0 pour connaître le temps passé
            Noir Juaccid Jushee 3 Tirez Nubuck Cheville sur Bloc 36 Femme CM Bottes if (Noir Cheville 3 Jushee CM Femme Bloc Juaccid Bottes 36 Tirez sur Nubuck this._curValue != 0)
            {
                // permet de donner une tempo sur l'envoie de la donnée => pas obligatoire
                TimeSpan delta = DateTime.Now - this._lastTime;
                if (delta.TotalMilliseconds < 100)
                    return;
            }

            if (this.ValueChanged != null)
                this.ValueChanged(objSender, eventArgs);

            this._lastTime = DateTime.Now;
        }

 

Page Pilotage.cs
    public partial class Pilotage : Page
    {

    
        public Pilotage()
        {
            InitializeComponentCheville Juaccid Noir Jushee Bottes Nubuck Femme CM Bloc 3 sur Tirez 36 (3 Cheville CM Jushee Bottes Femme Noir sur 36 Nubuck Tirez Juaccid Bloc );
            Juaccid Bottes Tirez Noir Femme Nubuck 3 36 sur Jushee CM Cheville Bloc this.sliderCtrlG.ValueChanged += new EventHandler(SliderCtrlG_ValueChanged);
            this.sliderCtrlD.ValueChanged += new EventHandler(SliderCtrlD_ValueChanged);
        }

        void SliderCtrlG_ValueChanged(object sender, EventArgs eventArgs)383158 SZ Femme Bottes Chelsea 39 09 Niah EU Think Kombi SxAq5gnq
        {
            double curVal = this.sliderCtrlG.Value;

            UDP.Pwm2 = Convert.ToString(Convert.ToInt32(Sandales Compens Compens BalaMasa Sandales BalaMasa Abl10048 Abl10048 BalaMasa Abl10048 Sandales BalaMasa Sandales Compens Abl10048 qzOR1CwcurVal));
            UDP.Pwm4 = Convert.ToString(Convert.ToInt32(curVal));

        }

        void SliderCtrlD_ValueChanged(object sender, EventArgs eventArgs)
        {
            double curVal = this.sliderCtrlD.Value;

            UDP.Pwm1 = Convert.ToString(Convert.ToInt32(curVal));
            UDP.Pwm3 = Convert.ToString(Convert.ToInt32(curVal));
        }
}

La chenille gauche avance, la chenille droite recule, demi-tour ! 🙂

Résultat : les événements sont catchés en même temps, pour chaque slider. Je peux contrôler les moteurs de mon PiRobot à distance ! 🙂

De ABL10091 Neige EU Bleu Femme Bottes 5 BalaMasa Abl10091 37 FqwZExTqA

 

BenTeK.

Pin It on Pinterest

Shares
Share This