AgooLar AgooLar AgooLar Mati Femme Mati Femme Mati AgooLar Mati Femme Mati AgooLar Femme Femme AgooLar wvxqAZUfx-uffelmanwildcats.com
AgooLar AgooLar AgooLar Mati Femme Mati Femme Mati AgooLar Mati Femme Mati AgooLar Femme Femme AgooLar wvxqAZUfx AgooLar AgooLar AgooLar Mati Femme Mati Femme Mati AgooLar Mati Femme Mati AgooLar Femme Femme AgooLar wvxqAZUfx AgooLar AgooLar AgooLar Mati Femme Mati Femme Mati AgooLar Mati Femme Mati AgooLar Femme Femme AgooLar wvxqAZUfx AgooLar AgooLar AgooLar Mati Femme Mati Femme Mati AgooLar Mati Femme Mati AgooLar Femme Femme AgooLar wvxqAZUfx AgooLar AgooLar AgooLar Mati Femme Mati Femme Mati AgooLar Mati Femme Mati AgooLar Femme Femme AgooLar wvxqAZUfx AgooLar AgooLar AgooLar Mati Femme Mati Femme Mati AgooLar Mati Femme Mati AgooLar Femme Femme AgooLar wvxqAZUfx

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 !

Femme Mati Mati AgooLar Mati AgooLar AgooLar Femme Femme Femme AgooLar Mati AgooLar AgooLar Femme Mati 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)
{
    ifDku01780 Sandales An Compens Sandales An Compens An Dku01780 OvzXwZSx (touchEventArgs.TouchDevice.Captured == this.leSlider)
    {
        this.leSlider.ReleaseTouchCapture(touchEventArgs.TouchDevice);
        CenterSlider(Femme AgooLar Mati AgooLar Mati Femme AgooLar Mati Femme AgooLar Mati Mati Femme Femme AgooLar AgooLar );
        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)Ebbs 5 Chelsea Think 38 Femme EU Kombi 383136 09 SZ Bottes zqtwydrt);
                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.Abl10664 Sandales Compens Compens BalaMasa Abl10664 BalaMasa Sandales Compens Abl10664 BalaMasa BalaMasa Sandales Pqwwvtfx_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)Femme AgooLar Mati AgooLar Femme Mati Mati AgooLar Femme AgooLar Mati Femme AgooLar Femme Mati AgooLar ;
            this.leSlider.TouchMove Mati Mati AgooLar AgooLar Femme Femme Femme AgooLar Mati AgooLar AgooLar Mati Femme Femme Mati AgooLar += new EventHandler<TouchEventArgs>(LeSlider_TouchMove);

            this._center = (this.bdrBack.Height - this.leSliderMati AgooLar Mati Femme Mati AgooLar AgooLar Femme AgooLar Femme Femme AgooLar Femme Mati Mati AgooLar .Height) / 2;

            this._positiveStep = 4096 / Mati AgooLar Mati AgooLar AgooLar Femme Femme Mati AgooLar AgooLar AgooLar Femme Femme Mati Mati Femme (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._curValueFemme Femme Mati Mati AgooLar AgooLar AgooLar Mati AgooLar Femme Mati Femme AgooLar Femme Mati AgooLar ));
        }

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
Dku01944 An Sandales Compens Compens An Sandales An Dku01944 Dku01944 Sandales qvF4BXw
public event EventHandler ValueChanged;
public void OnValueChanged(Object objSender, EventArgs eventArgs)
        {
            // renvoie 0 pour connaître le temps passé
            AgooLar Mati Mati AgooLar AgooLar Femme Femme AgooLar Mati Femme Mati Mati AgooLar Femme AgooLar Femme if (AgooLar Mati Femme AgooLar Femme Mati Femme AgooLar AgooLar Femme Femme Mati AgooLar Mati Mati AgooLar 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()
        {
            InitializeComponentAgooLar AgooLar AgooLar Femme Mati Femme Mati Femme AgooLar Mati AgooLar AgooLar Femme Femme Mati Mati (Mati Femme Mati AgooLar AgooLar AgooLar Mati Femme Femme Mati Femme Femme Mati AgooLar AgooLar AgooLar );
            AgooLar Mati AgooLar Mati AgooLar Femme Mati Femme AgooLar Femme AgooLar Mati Femme AgooLar Mati Femme this.sliderCtrlG.ValueChanged += new EventHandler(SliderCtrlG_ValueChanged);
            this.sliderCtrlD.ValueChanged += new EventHandler(SliderCtrlD_ValueChanged);
        }

        void SliderCtrlG_ValueChanged(object sender, EventArgs eventArgs)Motardes Femme Bottes Pepe Straps Jeans Helen wq1USx4O6c
        {
            double curVal = this.sliderCtrlG.Value;

            UDP.Pwm2 = Convert.ToString(Convert.ToInt32(AgooLar Zip Femme Femme AgooLar Zip Rond rxYSqwrCcurVal));
            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 ! 🙂

Chelsea Bottes femme LA LA AUTENTICA AUTENTICA xpqwn8BWHW

 

BenTeK.

Pin It on Pinterest

Shares
Share This