2009-06-02 25 views
3

J'ai une application WPF simple qui contient un contrôle utilisateur animé par une paire de storyboards sur la fenêtre principale. J'anime l'opacité du contrôle utilisateur, scaletransform.scalex et scaletransform.scaley, pour l'afficher et l'exclure. Il a l'air cool sauf pour la première fois qu'il fonctionne. L'animation est prévue pour prendre 3/10 de seconde, bien que j'ai augmenté cela pendant mes tests. J'ai essayé de définir une valeur par défaut à une fraction de seconde pour voir s'il y a un problème où les valeurs des propriétés que j'anime ne sont pas par défaut comme prévu. Cela n'a rien fait. J'appelle même explicitement mon animation "hide" sur une fenêtre chargée pour voir si cela m'aiderait à définir mes valeurs par défaut, mais cela n'a pas fonctionné non plus. Y a-t-il une initialisation que le runtime fait la première fois que je lance l'animation? Existe-t-il un moyen que je puisse appeler explicitement ce type d'initialisation avant de montrer l'interface utilisateur? Le symptôme est que le contrôle n'est même pas visible jusqu'à environ 2/10 de seconde dans la première animation. Parfois, il est plus long et le contrôle apparaît après qu'il a été entièrement animé (l'opacité et la taille sont leurs valeurs finales quand il apparaît finalement).Première exécution de l'animation WPF

+0

Quand/comment la première animation est-elle déclenchée? En outre, à partir des symptômes que vous avez décrits, il semble que l'opacité change à un rythme différent/après la transformation de l'échelle. – rmoore

+0

La première animation est déclenchée car toutes les animations sont, par un clic de souris. Je fais cela dans le code derrière afin que je puisse marquer l'événement comme manipulé si nécessaire. L'opacité fonctionne également dans toutes les autres animations. Fondamentalement, il n'y a aucune différence dans le code entre la première animation et toute autre animation. Ce que je me demandais, c'est si l'exécution de WPF optimise quelque chose (mon contrôle est caché par ScaleTransform et Opacity par défaut), et c'est le prix que je paie pour une optimisation automatique de la mémoire ou quelque chose du genre. – Rich

+0

Comme si le moteur d'exécution de WPF disait "oh, ce contrôle n'est pas visible dès le départ puisque ScaleTransforms et l'opacité est 0, chargeons ceci dynamiquement plus tard", et par conséquent il joue le rattrapage alors que je m'y attends ne s'anime même pas en vue. – Rich

Répondre

1

Il semble que vous définissiez le DataContext de UserControl juste avant l'animation. Vraisemblablement, vous avez une liaison en cours, qui consiste à créer des objets visuels et à les ajouter à l'arbre visuel en même temps que l'animation est censée commencer. Cela nécessite un traitement pour lequel l'animation se bat. La façon d'éviter cela est d'avoir le contrôle instancié (avec DataContext), mais caché, de sorte que la création de l'objet visuel n'a pas besoin d'être effectuée au moment de l'animation. (via mon collègue Tim Lee)

+0

D'accord, vous avez absolument raison ... et c'était aussi mon intuition initiale. Cependant, l'exécution essaye d'être trop intelligente pour son propre bien. Si j'essaie de le cacher de la vue (opacité, marge négative, scaletransform, translatetransform), il fait la même chose. Si je l'autorise à être visible, je n'ai même pas besoin de définir le DataContext en premier ... la première animation se passe bien. C'est presque comme si j'avais besoin de tromper le moteur en lui faisant croire qu'il est visible quand ce n'est pas le cas. Cela, ou j'ai besoin de savoir comment le dire explicitement pour construire l'arbre visuel. Ce dernier se sent moins hacky. – Rich

+0

Je comprends que ce sujet est ancien, mais comment avez-vous fini par résoudre ce problème? Même en réglant les contrôles respectifs à 1 largeur n'a pas aidé. Je suis relativement nouveau à WPF et je n'ai donc pas trouvé de repères cachés entre les lignes ici. – Harti