wpf xaml animation mvvm datatrigger

Animación de WPF "No se puede congelar este árbol de la línea de tiempo del Guión Gráfico para su uso a través de subprocesos"



xaml animation (3)

Actualmente tengo un cuadro de lista que tiene su elemento seleccionado vinculado a una propiedad en mi ViewModel. Siempre que el elemento seleccionado no sea nulo, deseo realizar una animación en él. Sin embargo, sigo recibiendo el siguiente error "No se puede congelar este árbol de la línea de tiempo del Storyboard para usarlo en todos los subprocesos" y, desde la investigación, entiendo por qué sucede esto. Sin embargo, no estoy seguro de qué enfoque debo tomar para obtener el comportamiento que quiero.

<Storyboard x:Key="ShowItemEdit"> <DoubleAnimation Storyboard.TargetName="lstItemList" Storyboard.TargetProperty="ListBox.Width" To="{Binding ActualWidth, ElementName=UserControl}" Duration="0:0:0.40" /> ... </Storyboard> <Style x:Key="ListStyle"> <Style.Triggers> <DataTrigger Binding="{Binding SelectedItem, Converter={StaticResource IsNullConverter}}" Value="False"> <DataTrigger.EnterActions> <BeginStoryboard Storyboard="{StaticResource ShowItemEdit}" /> </DataTrigger.EnterActions> </DataTrigger> </Style.Triggers> </Style> <ListBox x:Name="lstItemList" Style={StaticResource ListStyle}" SelectedItem="{Binding SelectedItem}"> ... </ListBox>


¿Puedes publicar tu Storyboard? Parece que tienes algún tipo de vinculación en la definición del guión gráfico.

Ok, como sospeché, es porque estás usando un Binding en tu Storyboard . No puede hacer esto porque WPF intenta freeze todos los recursos aprovechados por una plantilla para Freezable eficiencia y cuando usa un Freezable en un Freezable , en este caso el Storyboard , evita que se pueda congelar.


Antigua pregunta pero podría ser útil para otras personas. En ocasiones, crear el Storyboard en el código subyacente puede ser más sencillo: https://.com/a/10848781/779521


Existe una técnica que puede utilizar para solucionar el problema de Freezable que le permite usar un enlace para el valor "Para" de su animación (en lugar de codificar el valor allí). Es bastante sencillo y lo he descrito here .