6
votes

Pourquoi après l'animation de la hauteur de réglage de cette propriété arrête directement de fonctionner

J'ai un problème qui me tue. Ci-dessous est un exemple simple xxx

et dans le code derrière xxx

application ressemble à ceci

 texte alt

Après avoir appuyé sur _ResizeButton Gauche Bouton Agrandir immédiatement. Ensuite, je appuie sur _Animatebutton - Le bouton gauche est agrandi lentement. Après cela, je appuie à nouveau _ResizeButton et rien ne se passe. Pourquoi est-ce?

J'ai remarqué que la même chose est quand elle aime l'animation de propriété supérieure


0 commentaires

3 Réponses :


3
votes

Vous devez définir le rempliBeHavior du doubleinimation sur Stop au lieu de Hold . Voir cet article:


1 commentaires

Merci pour votre réponse, mais après avoir défini Animation.frebbehavior = FillBbehavior.stop Son rétrécit à la dernière valeur de la hauteur. Est-ce que je fais quelque chose de mal?



3
votes

La réponse de Rick ne fonctionnera pas comme vous l'avez signalée. Dans votre cas, vous devez définir l'animation de la propriété animée (hauteur du bouton) à NULL afin de pouvoir modifier d'autres modifications sur cette propriété.

http://msdn.microsoft.com/en-us/library/aa970493.commex xxx

changer votre gestionnaire _animatebutton_click sur celui indiqué ci-dessus. Ajoutez également le second gestionnaire d'événements de sorte que lorsque l'animation est terminée, nous pouvons supprimer la référence à la section "Animation" de la deuxième instruction de MyDoubleanimation_completé, car lorsque la référence d'animation est supprimée, la valeur non animée apparaît en arrière.


1 commentaires

Parfait .. Il y a quelques autres messages sans réponse pour cela. Je vais mettre un lien à votre réponse



18
votes

Pour comprendre le comportement, vous devez être conscient d'une caractéristique de la manière dont l'animation fonctionne dans le système de propriétés du WPF: les animations ne fonctionnent pas en définissant la propriété à différentes valeurs au fil du temps. Ils travaillent en fournissant une valeur effective pour la propriété qui prime temporairement la valeur «base». C'est une distinction subtile, mais c'est ce qui vous cause de venir décontracté ici.

Lorsque vous rencontrez d'abord le système d'animation, la plupart des gens imaginent que cela fonctionne en appelant à plusieurs reprises l'accessor «Set» de la propriété. Mais ce n'est pas - si vous définissez la propriété de cette façon avant de commencer l'animation, la valeur d'origine que vous avez définie reste en place. C'est juste que le getter retournera la valeur fournie par le système d'animation de préférence pour renvoyer la valeur «locale». En fait, vous pouvez même modifier la valeur "locale" en définissant la propriété pendant l'exécution de l'animation, mais que la valeur locale ne deviendra pas visible tant que l'animation s'arrête.

En réalité, le système de propriété fait beaucoup de ce genre de chose - ce ne sont pas que des animations. Ce Aide Sujet répertorie 11 endroits différents qu'un La valeur de la propriété pourrait venir de. Les animations sont la 2e priorité la plus élevée. Les propriétés définies à la mode habituelle via l'accessor «Set '(ou via les attributs de XAML) sont la plus haute priorité suivante, mais vous pouvez voir que les modèles, les styles et les déclencheurs fournissent toutes d'autres sources pour une valeur de la propriété locale.

Le système d'animation dans WPF a un concept de la valeur «base», et c'est essentiellement la valeur prioritaire la plus proche disponible après la valeur animée actuelle. Si vous avez une valeur locale, ce sera la valeur de base, mais si vous n'avez pas la valeur de base viendra de l'une des autres sources énumérées dans cet article.

Le résultat de tous C'est là qu'il n'existe pas de manière simple de faire ce que vous semblez essayer de faire. Je pense que ce que vous voulez, c'est que l'animation fonctionne à l'achèvement et que la propriété conserve sa valeur d'animation finale jusqu'à ce que vous définissez la valeur locale sur autre chose.

Si vous dites à l'animation de Arrêtez une fois terminé, la valeur effective revient à la valeur de base. (Comme vous le dites dans un commentaire, il rétrécit après que l'animation se termine.) Et si vous dites à l'animation de tenir une fois terminée (qui est le comportement par défaut), l'animation fournira à jamais une valeur supérieure à la hausse des valeurs locales que les valeurs locales. , C'est pourquoi vous voyez que redimensionner le bouton manuellement ne fonctionne plus. Ainsi aucune option ne fait ce que vous voulez.

Il y a deux façons de traiter cela. @ Responderns5 a affiché une manipulation l'achèvement de l'animation, modifie la valeur locale pour refléter la valeur finale de l'animation, puis arrêter l'animation. (Vous pouvez considérer que cela pourrait être une sorte de rétrogradation de la propriété - il la convertit d'une valeur de propriété à haute priorité mais transitoire - une valeur locale légèrement inférieure mais plus persistante.) Je serais enclin à modifier le code un peu: xxx

Qu'est-ce que j'ai changé ici, c'est que le code ne tente plus de deviner où le système d'animation s'est terminé - il s'agit simplement de la valeur du système d'animation. avait mis la propriété pour et fait que la nouvelle valeur locale. Je préfère que sur le + = 10 dans le gestionnaire complété , qui ressemble à une duplication légèrement fragile de la logique pour moi.

L'autre moyen de traiter avec il est de supprimer l'animation au point où vous essayez de mettre à jour la propriété: xxx

Cela semble légèrement plus robuste pour moi, car cela fonctionnera même si l'animation n'avait pas terminé au moment où vous cliquez sur le bouton Redimension.


0 commentaires