IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Rotation d'une Flèche selon la valeur d'un Slider [Débutant]


Sujet :

C#

  1. #1
    Membre du Club
    Homme Profil pro
    Stagiaire THALES
    Inscrit en
    Avril 2015
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Stagiaire THALES
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2015
    Messages : 24
    Points : 48
    Points
    48
    Par défaut Rotation d'une Flèche selon la valeur d'un Slider
    Bonjour tout le monde,

    J'ai un petit soucis de syntaxe en C# sur une certaine action que je voudrais réaliser :
    Je dispose d'un Slider borné de la manière suivante : [-150;150], et d'une flèche qui pointe vers le haut (initialement) dont la hauteur ("Height") varie selon la valeur du Slider.
    J'aimerai que quand le Slider est dans l'intervalle [-150;0], la flèche pointe vers le bas et que sa hauteur ("Height") varie selon la valeur absolue du Slider.

    Pour la rotation j'ai écrit ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    private void slider_ValueChanged(object sender, System.Windows.Routed.PropertyChangedEventArgs<double> e)
    {
      if(e.NewValue < 0)
      {
        RotateTransform myRotation = new RotateTransform(180,0,0);
        this.FLECHE.RenderTransform = myRotation;
      }
     
    }
    Ce code me donne bien la rotation attendue, seulement si je n'ajoute rien ça fait un peu n'importe quoi quand je pars dans les négatif...
    Disons que je n'obtiens pas ce que je recherche.

    J'ai donc pensé à inclure dans le if quelque chose me permettant d'y remédier, seulement rien n'a fonctionné :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FLECHE.Height = -e.NewValue;
    Mais cela ne fonctionne pas, auriez vous des idées svp ?

  2. #2
    Membre expert Avatar de jopopmk
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    1 856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 1 856
    Points : 3 570
    Points
    3 570
    Par défaut
    Salut,

    je comprends pas bien la demande.
    Ton Slider fait varier la hauteur de ta flèche ou la fait tourner ?
    Et pourquoi vouloir faire une valeur absolue de ta valeur (qui correspond à un angle si on parle de rotation), y'a aucun mal à ce qu'il le soit.

    Perso j'ai fait ce test dans l'event et j'ai une rotation convaincante (entre -150 et +150 degrés en rotation horaire) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RotateTransform rt = new RotateTransform(e.NewValue, btn1.Width /2, btn1.Height /2);
    (je rotate un Button mais on se fout un peu de l'objet, et mon centre de rotation est le centre dudit objet [width et height doivent être renseignés dans le XAML])
    Plus je connais de langages, plus j'aime le C.

  3. #3
    Membre du Club
    Homme Profil pro
    Stagiaire THALES
    Inscrit en
    Avril 2015
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Stagiaire THALES
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2015
    Messages : 24
    Points : 48
    Points
    48
    Par défaut
    Salut !

    En fait on s'est mal compris, la flèche effectue une Rotation qu'a un seul moment : quand la valeur du Slider < 0 ! (Elle en effectuera une autre lorsqu'on passera des négatif au positif)

    Sur [0;150], Height prend la valeur du Slider, c'est à dire la flèche grandit plus ou moins (en pointant vers le haut)
    Mais sur [-150;0], il faut que la flèche grandisse plus ou moins, mais vers le bas ! (Voila pourquoi j'effectue une rotation quand le Slider vaut 0, de 180°)

    Seulement une fois la rotation effectué, il faut que la valeur de la hauteur soit égale à l'opposé de la valeur du Slider. En effet, Height ne peut pas être égale à un nombre négatif... (Sinon je n'aurais pas eu besoin de rotation )
    En gros, Positif = Flèche vers le haut / Négatif = Flèche vers le bas


    Voila pourquoi je voulais mettre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    private void slider_ValueChanged(object sender, System.Windows.Routed.PropertyChangedEventArgs<double> e)
    {
      if(e.NewValue < 0)
      {
          RotateTransform myRotation = new RotateTransform(180,0,0);
          this.FLECHE.RenderTransform = myRotation;
          FLECHE.Height = -e.NewValue;                                      //MAIS CETTE LIGNE NE FONCTIONNE PAS !
      }
     
    }
    PS : Il faut aussi que si je repasse en positif, la flèche effectue une rotation de 180° (Seulement si elle était au préalable dirigé vers le bas, c'est a dire, que le Slider avait une valeur négative)
    Mais je pense qu'une fois que je saurais le faire dans un sens, je saurais le faire dans l'autre !

  4. #4
    Membre expert Avatar de jopopmk
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    1 856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 1 856
    Points : 3 570
    Points
    3 570
    Par défaut
    D'accord je comprends mieux

    Alors pour la hauteur rien de plus simple et deux possibilités.
    Celle à laquelle tu aurais pu penser tout seul (avec un opérateur ternaire pour se la péter) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    this.btn1.Height = (e.NewValue < 0)? -e.NewValue : e.NewValue;
    // equivalent à :
    // if (e.NewValue < 0) this.btn1.Height = -e.NewValue;
    // else this.btn1.Height = e.NewValue;
    Celle qui fait appelle à la fonction Abs de Math (valeur absolue) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this.btn1.Height = Math.Abs(e.NewValue);
    Pour la rotation on échappera pas au if (toujours avec le ternaire) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    RotateTransform rt = new RotateTransform((e.NewValue > 0) ? 0 : 180);
    this.btn1.RenderTransform = rt;
    La meilleure solution serait donc à mon avis de faire un vrai if plutôt qu'un Abs/ternaire (ou ternaire/ternaire) ça économise un test conditionnel.
    Tu aurais donc un truc comac :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    RotateTransform rt = null;
    if (e.NewValue < 0) {
        this.btn1.Height = -e.NewValue;
        rt = new RotateTransform(180);
    } else {
        this.btn1.Height = e.NewValue;
        rt = new RotateTransform(0);
    }
    this.btn1.RenderTransform = rt;
    edit : pense à mettre le centre de rotation si tu veux pas que ça tourne autour du coin en haut à gauche.
    Plus je connais de langages, plus j'aime le C.

  5. #5
    Membre du Club
    Homme Profil pro
    Stagiaire THALES
    Inscrit en
    Avril 2015
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Stagiaire THALES
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2015
    Messages : 24
    Points : 48
    Points
    48
    Par défaut
    Re,

    Eh bien c'est que que j'avais fait en gros, (Sauf que j'avais pas prévu le retour), au niveau de la flèche ça marché bien, le soucis était ailleurs !
    Tu as essayer le code ?
    Moi quand je descendais avec le curseur de mon Slider dans les valeurs négatives (vers la gauche), dès que je passais en dessous de 0, le curseur se mettait à remonter ! Alors que pourtant ma souris bougée vers les négatifs. (Je sais pas trop si ce que je dis est clair, à vrai dire je trouve ça hyper bizarre ! )
    La je viens de tester avec ton code, et ça me fait exactement la même chose... Un peu comme si ce n'était pas seulement la valeur de Height qui changée de signe, mais aussi celle du Slider !

    PS : Je tiens quand même à te remercier de ta présence sur tous mes postes !

  6. #6
    Membre expert Avatar de jopopmk
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    1 856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 1 856
    Points : 3 570
    Points
    3 570
    Par défaut
    Oui le code a été testé.
    Pour ton problème je vois deux possibilités :
    - dans ton code tu fais un slider.Value = Math.Abs(e.NewValue) (ou équivalent), ça correspond au comportement que tu mentionnes,
    - il y a un vieux binding qui traîne dans ton XAML.
    Plus je connais de langages, plus j'aime le C.

  7. #7
    Membre du Club
    Homme Profil pro
    Stagiaire THALES
    Inscrit en
    Avril 2015
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Stagiaire THALES
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2015
    Messages : 24
    Points : 48
    Points
    48
    Par défaut
    Citation Envoyé par jopopmk Voir le message
    - il y a un vieux binding qui traîne dans ton XAML.
    Aaaaah saloperie de Binding... J'ai pété un boulon cette après-midi juste à cause de ça... ?
    Comme j'ai essayé plein de solutions j'ai du oublier de l'enlever quand je suis passé en C#...

    Bon bah merci l'ami, encore une fois !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Rendre inactive une combobox selon la valeur choisie dans une 1er combobox
    Par The Molo dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 14/12/2007, 13h34
  2. Afficher Une Liste Selon La Valeur D'une Cellule
    Par Kevin_18 dans le forum Excel
    Réponses: 10
    Dernier message: 02/07/2007, 19h22
  3. trier une hashtable selon les valeurs
    Par Raylemon dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 20/06/2007, 11h44
  4. Réponses: 4
    Dernier message: 23/04/2007, 14h01
  5. Réponses: 5
    Dernier message: 28/08/2006, 18h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo