¿Hay alguna manera de definir una animación en algún lugar de xaml (por ejemplo, como recurso) una vez y luego volver a utilizarla varias veces? Tengo una gran cantidad de pinceles independientes en diferentes plantillas de datos que de forma independiente necesitan para comenzar el mismo tipo de animación basada en un datatrigger. Ahora, dado que parece que una animación tiene que definir un Storyboard.TargetName y Storyboard.TargetProperty. Esto prácticamente frustra el propósito de la reutilización. De alguna manera me gustaría declarar "usar esta animación del recurso pero aplicarla a otro elemento esta vez".definir animaciones y desencadenantes como recurso reutilizable?
Para mí, esto parece ser una solicitud bastante básica, importante y esencial, y me sorprende que no sea tan sencillo de llevar a cabo. ¿Me estoy perdiendo de algo?
Lo mismo se aplica a los factores desencadenantes. Supongamos que tengo muchos elementos visuales diferentes que representan el mismo tipo de estado usando animaciones de color. P.ej. atenuarse a verde cuando "activo" desaparecer a "rojo" cuando "error" etc. La única diferencia entre las imágenes es su forma/árbol visual el comportamiento de animación deseado es el mismo, todos tienen un elemento en algún lugar de su árbol visual que tiene una propiedad de tipo color Creo que no es difícil imaginar lo tedioso que es redefinir las mismas animaciones y conjuntos de datatriggers una y otra vez. Todo desarrollador odia esto. Busco desesperadamente una solución más fácil que no requiera ningún (o al menos muy poco) código C# detrás.
Lo que he encontrado hasta el momento es la siguiente:
Definir las animaciones en un recurso lik este (repetir esta operación para todos los estados básicos que existen, como la activación, activo, inactivo, error):
<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>
el uso en guión gráfico en los disparadores (repetir esto infinidad de veces para cada estado de cada X stateviusal differnt, siempre llegar a un nuevo nombre para el guión gráfico):
<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>
Puede imaginarse fácilmente cuánta saturación XAML tengo que copiar y pegar repetidamente para todos esos billones de DataTriggers.
Sería genial definir todos estos activadores una vez y aplicarlos a diferentes imágenes del estado. ¿Cómo se resuelve algo como esto en WPF? ¿Algún consejo?
Ya sé, probé un montón de cosas diferentes para proponer una sugerencia para esto y simplemente no fue posible sin hacer algo en el código. Esta es una buena solución como creo que vas a obtener. Hurra por la extensibilidad de WPF, ¿verdad? :) –
Puede ser una buena idea usar la API de comportamiento silverlight para esto. ¿Estás de acuerdo? ¿Es compatible con el marco .net 3.5 estándar? – bitbonk
No, no es compatible, aunque se supone. Honestamente, creo que has encontrado una gran solución que aprovecha la arquitectura de WPF de una manera muy "natural" y no debes adivinarte a ti mismo en absoluto aquí. –