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

Windows Presentation Foundation Discussion :

Storyboard : Impossible de modifier la propriété après lancement de l'animation


Sujet :

Windows Presentation Foundation

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Avril 2007
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 32
    Par défaut Storyboard : Impossible de modifier la propriété après lancement de l'animation
    Bonjour à tous,

    Je débute dans les animations en wpf

    Voici une version simplifié de mon code:


    ' Duration
    Dim duration As New Duration(TimeSpan.FromMilliseconds(600))
    ' Storyboard
    Dim OStoryboard as New Storyboard
    OStoryboard.Duration = duration
    ' Animation
    Dim anim as new DoubleAnimation
    anim.Duration = duration
    ' Storyboard property
    Storyboard.SetTargetName(anim, "Button1")
    Storyboard.SetTargetProperty(anim, New PropertyPath(Canvas.TopProperty))
    Dim btnCourant As UIElement = Canvas1.Children(i - 1)
    anim.To = Canvas.GetTop(Button1) + 90
    ' Ajout de l'animation au storyboard
    OStoryboard.Children.Add(anim)
    ' Lance l'animation
    OStoryboard.Begin(Button1)
    ' Changement de la valeur
    Canvas.SetTop(Button1, 0)


    En gros j'ai un boutton dans un canvas et je deplace le bouton vers le bas.
    Sa sa marche!

    Mon problème est sur la dernière ligne : je dit à mon bouton de prendre 0 pour valeur de top dan le canvas. Mais sa ne fonctionne pas !
    J'ai essayé de faire avant l'animation sa marche trés bien. Mais du moment que l'animation est "begin" rien à faire impossible de changer la valeur de la propriété !

    Je ne comprend pas pourquoi. Merci de votre aide

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 210
    Par défaut
    En fait l'animation et la ligne de code sont exécuté en même temps. Du coup une solution est de passer par une deuxième animation qui commence quand la première est terminée. Voici le bout de code a ajouté (le code vb est peut-être erroné )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    ' Duration
    Dim duration As New Duration(TimeSpan.FromMilliseconds(600))
    ' Storyboard
    Dim OStoryboard as New Storyboard
    OStoryboard.Duration = duration
    
    ' Animation
    Dim anim as new DoubleAnimation
    anim.Duration = duration
    ' Storyboard property
    Storyboard.SetTargetName(anim, "Button1")
    Storyboard.SetTargetProperty(anim, New PropertyPath(Canvas.TopProperty))
    Dim btnCourant As UIElement = Canvas1.Children(i - 1)
    anim.To = Canvas.GetTop(Button1) + 90
    ' Ajout de l'animation au storyboard
    OStoryboard.Children.Add(anim)
    
    ' Animation
    Dim anim2 as new DoubleAnimation
    anim2.BeginTime = TimeSpan.FromMilliseconds( 600 )
    anim2.Duration = New Duration(TimeSpan.FromMilliseconds(0.001))
    ' Storyboard property
    Storyboard.SetTargetName(anim2, "Button1")
    Storyboard.SetTargetProperty(anim2, New PropertyPath(Canvas.TopProperty))
    anim2.To = 0
    ' Ajout de l'animation au storyboard
    OStoryboard.Children.Add(anim2)
    
    ' Lance l'animation
    OStoryboard.Begin(Button1)

  3. #3
    Membre averti
    Inscrit en
    Avril 2007
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 32
    Par défaut
    Merci pour cette réponse qui ma fait réalisé qu'il me suffisait de faire une animation avec une durée plus courte pour que sa se passe de manière invisible.

    Donc c'est ok pour cette partie :-)

    Cependant ! le code ci-dessus est une version simplifié de se que souhaite réellement faire (Pour pas encombré les esprits et le forum).

    Un second problème se pose à moi, c'est pourquoi je vais rentrer dans les détails et vous montrer une plus vrai et plus grande partie du code.

    Le BUT :

    Faire un menu déroulant vertical tel que celui à droite sur la photo suivante:




    Le COMMENT:

    Pour les tests je me sert de 7 boutons aligné verticalement. Je créer une animation pour chacun d'entre eux pour les déplacer vers le bas. (Pour l'instant je ne fonctionne que dans un sens). Puis une autre animation qui fait remonter celui tout en bas.


    L' INTERFACE :




    Le CODE :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    
     Dim BtnToutDown As Integer = 7
    
        Private Sub BtnDown_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles BtnDown.Click
    
            ' Storyboard
            Dim DownStoryboard As New Storyboard
            DownStoryboard.Duration = New Duration(TimeSpan.FromMilliseconds(400))
    
            ' Créer les 7 animations et les ajoute au storyboard
            Dim TabAnimation(7) As DoubleAnimation
            For i As Integer = 1 To 7
                ' Créer les animation qui doivent descendre
                TabAnimation(i) = New DoubleAnimation
                TabAnimation(i).Duration = New Duration(TimeSpan.FromMilliseconds(400))
                Storyboard.SetTargetName(TabAnimation(i), "Button" & i)
                Storyboard.SetTargetProperty(TabAnimation(i), New PropertyPath(Canvas.TopProperty))
                TabAnimation(i).To = Canvas.GetTop(Canvas1.Children(i - 1)) + 90
                DownStoryboard.Children.Add(TabAnimation(i))
            Next
    
            ' Créer L'animation qui remet le dernier control en place
            Dim AnimReplace As New DoubleAnimation
            AnimReplace.BeginTime = TimeSpan.FromMilliseconds(400)
            AnimReplace.Duration = New Duration(TimeSpan.FromMilliseconds(0.00001))
            Storyboard.SetTargetName(AnimReplace, "Button" & BtnToutDown)
            Storyboard.SetTargetProperty(AnimReplace, New PropertyPath(Canvas.TopProperty))
            AnimReplace.To = 10
            DownStoryboard.Children.Add(AnimReplace)
    
            ' Mise à jour du bouton tout en bas
            If BtnToutDown = 1 Then
                BtnToutDown = 7
            Else
                BtnToutDown -= 1
            End If
    
            ' Lance le storyboard
            DownStoryboard.Begin(Button1)
    
        End Sub
    Le PROBLEME :

    Bahh le problème il est tout bête : Quand on click lentement sa fonctionne très bien (J'ai même codé le up tous fonctionne à merveille). Mais quand on click trop rapidement le storyboard n'as pas encore fini sa course, et la c'est le drame, tous par en live, certain bouton disparaisse, bref sa fait n'importe quoi !


    Donc si quelqu'un peu m'aider je le supplie à genou de le faire. (sur un forum c'est pas trop difficile).


    Svp, sans vouloir trop en demander, évitez les réponses genre "Cherche des sources avec blend en wpf" à moins que vous en ayez une, car j'ai déjàs cherché pendant une semaine sans résultat et c'est pour sa que je le code moi même.

    Le nombre de source wpf est très pauvre sur le net, sachez que si le code complet vous intéresse je le mettrais à disposition, si je m'en sort bien sur :-)

    Merci

  4. #4
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Par défaut
    Sur le BtnDown_Click, tu changes la propriété Enabled de ton contrôle et tu la met à False.

    Ensuite, sur l'event Completed de ton Storyboard DownStoryboard, tu remet à la propriété à True.

    Ainsi, l'utilisateur ne peut cliquer qu'une fois

  5. #5
    Membre averti
    Inscrit en
    Avril 2007
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 32
    Par défaut
    Déjàs merci d'avoir répondu, et de s'être intéréssé a mon projet.

    Je trouve l'idée génial.

    Mais je pense qu'un élément manque à ma description :

    Il ne s'agit là que l'aspect graphique du projet sur lequel je grefferais ensuite une collection de données. Sachant que la collection doit pouvoir contenir entre 1000 et 2000 Items. Donc si je suis au premier et que je doit aller au 1000 ième, je peut commencer tôt le matin :-)

    Aussi plus concrètement il s'agit d'une application qui sera contrôlé uniquement par des touches. Donc l'événement sera sur les touche flêche bas et flêche haut.

    Pour la petite histoire : pas de souris car le logiciel tourne dans une borne d'arcade, ou le joystick et bouton feront office de touche de clavier.

    Je pense alors qu'il est surement possible d'aller plus loin en manipulant la vitesse de défilement. Mais je ne vois pas trop comment: comment savoir si le bouton est continuellement enfoncé ? comment faire cela de manière progressive (Plus sa fait de temps que l'on appui plus la vitesse est grande) ?

    Merci

  6. #6
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Par défaut
    Citation Envoyé par bolandfranck Voir le message
    comment savoir si le bouton est continuellement enfoncé ?
    Tu peux p-e regarder si la propriété IsFocused est à True ?

Discussions similaires

  1. [XL-2003] Impossible de modifier les propriétés d'un axe d'un graphique
    Par Sclarckone dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 22/08/2011, 14h38
  2. Réponses: 10
    Dernier message: 15/09/2010, 12h55
  3. Réponses: 13
    Dernier message: 01/02/2010, 18h56
  4. Réponses: 1
    Dernier message: 04/09/2009, 20h12
  5. Répertoire par défault à modifier après lancement
    Par Mattetfamilly dans le forum C++Builder
    Réponses: 11
    Dernier message: 08/03/2007, 18h37

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