28

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>
jwarzech
  • 6,506
  • 11
  • 50
  • 71

3 Answers3

43

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.

Drew Marsh
  • 32,873
  • 3
  • 81
  • 100
  • I added the storyboard code. I do bind the 'To' property since I don't want to hardcode the width. – jwarzech Nov 03 '09 at 20:43
  • 1
    That's your problem then, I will explain. – Drew Marsh Nov 03 '09 at 20:47
  • Thanks for the explanation! Any suggestion on how I can achieve this storyboard (with binding) without having to connect the datatrigger to the control? – jwarzech Nov 03 '09 at 21:26
  • 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? – Drew Marsh Nov 03 '09 at 22:33
  • 3
    This happened to me not due Binding, but using Dynamicresources! Thanks for the hint! – dba Dec 02 '15 at 08:52
  • 3
    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 Dictionary – Ben Hayward Nov 11 '17 at 12:32
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.

Community
  • 1
  • 1
Jason Frank
  • 3,692
  • 29
  • 32
3

Old question but might be useful for other people. Sometimes creating the Storyboard in the code-behind can be simpler: https://stackoverflow.com/a/10848781/779521

Community
  • 1
  • 1
Sverrir Sigmundarson
  • 2,282
  • 29
  • 26