WPF动画"无法冻结此Storyboard时间轴树以跨线程使用"

jwa*_*ech 22 wpf animation xaml datatrigger mvvm

我目前有一个列表框,其选定的项目绑定到我的ViewModel上的属性.每当所选项目不为null时,我想在其上执行动画.但是,我不断收到以下错误"无法冻结此故事板时间轴树以供跨线程使用",并且从研究中了解为什么会发生这种情况.但是我不确定我需要采取什么方法来获得我想要的行为.

<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>
Run Code Online (Sandbox Code Playgroud)

Dre*_*rsh 33

你可以发布你的故事板吗?听起来你在Storyboard定义中有某种Binding.


好的,正如我所怀疑的那样,这是因为你正在使用Binding你的Storyboard.你不能这样做,因为WPF试图冻结由效率的模板利用的所有资源,当你使用一个绑定Freezable,在这种情况下Storyboard,它可以防止它能够被冻结.

  • 我在使用 DynamicResources 时也遇到过这种情况。在这种情况下如何使用动态资源?我需要引用资源字典中的颜色 (3认同)
  • 这发生在我身上不是由于绑定,而是使用动态资源!谢谢你的提示! (2认同)

Jas*_*ank 8

您可以使用一种技术来解决Freezable问题,该问题允许您对动画的"To"值使用绑定(而不是在那里对值进行硬编码).它很简单,我在这里概述了它.