Existe-t-il un moyen de définir une animation quelque part dans xaml (par exemple en tant que ressource) une seule fois, puis de la réutiliser plusieurs fois? J'ai beaucoup de pinceaux indépendants sur différents datatemplates qui ont indépendamment besoin de démarrer le même type d'animation basé sur un datatrigger. Maintenant, il semble qu'une animation doit définir un Storyboard.TargetName et Storyboard.TargetProperty. Cela défait à peu près le but de la réutilisabilité. Je voudrais en quelque sorte déclarer "utiliser cette animation à partir de la ressource mais l'appliquer à un autre élément cette fois".définir des animations et des déclencheurs comme ressource réutilisable?
Pour moi, cela semble être une demande plutôt basique, importante et essentielle et je suis surpris que ce n'est pas si simple à accomplir. Est-ce que j'ai râté quelque chose?
La même chose s'applique aux déclencheurs. Supposons que j'ai beaucoup d'éléments visuels différents qui représentent tous le même type d'état en utilisant des animations de couleur. Par exemple. La seule différence entre les visuels est leur forme/arbre visuel le comportement d'animation désiré est le même, ils ont tous un élément quelque part dans leur arbre visuel qui a une propriété de type couleur. Je pense qu'il n'est pas difficile d'imaginer à quel point il est fastidieux de redéfinir les mêmes animations et les mêmes jeux de déclencheurs de données encore et encore. Chaque développeur déteste ça. Je cherche désespérément une solution plus facile qui ne nécessite pas (ou du moins très peu) de code C# derrière.
Ce que je suis venu avec à ce jour est la suivante:
Définir les animations dans une ressource lik ce (Répétez cette opération pour tous les états de base qu'il ya, comme l'activation, actif, inactif, erreur):
<ColorAnimationUsingKeyFrames x:Key="deactivatingColorAnimation"
Storyboard.TargetProperty="Material.(MaterialGroup.Children)[0].Brush.(SolidColorBrush.Color)"
FillBehavior="HoldEnd" RepeatBehavior="Forever" AutoReverse="True">
<ColorAnimationUsingKeyFrames.KeyFrames>
<LinearColorKeyFrame KeyTime="00:00:00" Value="Gray"/>
<LinearColorKeyFrame KeyTime="00:00:0.25" Value="Gray"/>
<LinearColorKeyFrame KeyTime="00:00:0.5" Value="Gray" />
<LinearColorKeyFrame KeyTime="00:00:0.75" Value="Gray" />
</ColorAnimationUsingKeyFrames.KeyFrames>
</ColorAnimationUsingKeyFrames>
l'utilisation en story-board dans les déclencheurs (répéter cette zillions de fois pour chaque état X chaque stateviusal differnt, viennent toujours avec un nouveau nom pour le story-board):
<DataTrigger Binding="{Binding SubstrateHolder.State}" Value="Deactivating">
<DataTrigger.EnterActions>
<BeginStoryboard x:Name="someStateVisualDeactivatingStoryboard">
<Storyboard Storyboard.TargetName="someStateVisual">
<StaticResource ResourceKey="deactivatingColorAnimation" />
</Storyboard>
</BeginStoryboard>
</DataTrigger.EnterActions>
<DataTrigger.ExitActions>
<RemoveStoryboard BeginStoryboardName="someStateVisualDeactivatingStoryboard" />
</DataTrigger.ExitActions>
</DataTrigger>
Vous pouvez facilement imaginer combien XAML bourgeonnent je dois copier et coller à plusieurs reprises pour tous ces DataTriggers zillion.
Il serait cool de définir tous ces déclencheurs une fois et de l'appliquer à différents visuels d'état. Comment est-ce que quelque chose comme ça est résolu dans WPF? Un conseil?
Je sais que j'ai essayé un tas de choses différentes pour trouver une suggestion pour cela et que ce n'était pas possible sans faire quelque chose dans le code. C'est aussi une bonne solution que je pense que vous obtiendrez. Hurrah pour l'extensibilité de WPF, non? :) –
Cela peut être une bonne idée d'utiliser l'API silverlight behavior pour cela. Êtes-vous d'accord? Est-il compatible avec le framework standard .net 3.5? – bitbonk
Non, ce n'est pas compatible, bien qu'ils soient supposés. Honnêtement, je pense que vous avez trouvé une excellente solution qui exploite l'architecture WPF d'une manière très "naturelle" et ne devrait pas vous deviner du tout ici. –