WPF Animation "Cannot freeze this Storyboard timeline tree for use across threads"
Asked Answered
H

3

29

I currently have a listbox that has its selected item bound to a property on my ViewModel. Whenever the selected item isn't null I want to perform an animation on it. However I keep getting the following error "Cannot freeze this Storyboard timeline tree for use across threads" and from research sort of understand why this is happening. However I am unsure of what approach I need to take to get the behavior I want.

<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>
Highpitched answered 3/11, 2009 at 19:52 Comment(0)
S
46

Can you post your Storyboard? It sounds like you have some kind of Binding in the Storyboard definition.


Ok so, as I suspected, it's because you're using a Binding in your Storyboard. You can't do this because WPF attempts to freeze all the resources leveraged by a template for efficiency and when you use a Binding on a Freezable, in this case the Storyboard, it prevents it from being able to be frozen.

Sudden answered 3/11, 2009 at 20:0 Comment(6)
I added the storyboard code. I do bind the 'To' property since I don't want to hardcode the width.Highpitched
That's your problem then, I will explain.Sudden
Thanks for the explanation! Any suggestion on how I can achieve this storyboard (with binding) without having to connect the datatrigger to the control?Highpitched
Ehhh, based on what I can guess you're trying to do with the animation how about instead of setting a Width on the the ListBox you set it's HorizontalAlignment to Stretch and then give it a Margin and this storyboard animates the Margin to 0 instead of the Width to the ActualWidth of the UserControl?Sudden
This happened to me not due Binding, but using Dynamicresources! Thanks for the hint!Kleiman
This happened to me too with DynamicResources. How can I use dynamic resources in this case? I need to reference a colour which I have in a Resource DictionaryRoustabout
L
11

There is a technique that you can use to get around the Freezable issue that allows you to use a binding for the "To" value of your animation (rather than hard-coding a value there). Its pretty straightforward and I've outlined it here.

Lubric answered 30/1, 2013 at 16:34 Comment(1)
Thank you for posting this. However, since this technique uses the Tag property, it must be added that it works to animate one property, like in the OP example, the Width. If you plan to use this approach for Width and Height, for a more complex animation, then it does not work, unless you animate a square.Loosetongued
F
3

Old question but might be useful for other people. Sometimes creating the Storyboard in the code-behind can be simpler: https://mcmap.net/q/501676/-achieve-quot-slide-down-quot-animation-in-wpf

Fumigant answered 1/6, 2012 at 10:44 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.