C# ListBoxItem上的WPF动画在清除项源时引发异常

C# ListBoxItem上的WPF动画在清除项源时引发异常,c#,wpf,animation,exception,drag-and-drop,C#,Wpf,Animation,Exception,Drag And Drop,我正在处理的项目需要从列表框中拖动项目以删除目标,以便使用列表中的所述项目。该项在拖动时隐藏(鼠标后面跟着元素的位图),放置时使用双动画将其折叠为0高度。我使用bool?来确定可见性,所有这些功能都非常有效 我的项目是多选项卡的,因为数据需要在页面之间刷新,所以当可见性发生变化时,页面会清除集合并重新加载它们。我的问题是,当我折叠了自定义列表框控件绑定到的ObservableCollection中的项时,我在PresentationCore.dll中收到一个InvalidOperationExc

我正在处理的项目需要从列表框中拖动项目以删除目标,以便使用列表中的所述项目。该项在拖动时隐藏(鼠标后面跟着元素的
位图
),放置时使用
双动画将其折叠为0
高度。我使用
bool?
来确定可见性,所有这些功能都非常有效

我的项目是多选项卡的,因为数据需要在页面之间刷新,所以当可见性发生变化时,页面会清除集合并重新加载它们。我的问题是,当我折叠了自定义
列表框
控件绑定到的
ObservableCollection
中的项时,我在
PresentationCore.dll
中收到一个
InvalidOperationException
“System.Windows.Media.Animation.DoubleAnimation”无法使用默认目标值“NaN”

不幸的是,这没有帮助,因为我正在使用指定显式<代码>高度<代码>值的样式设置<代码>高度<代码>的动画,并且<代码>双动画<代码>指定从0设置动画,因此这两个值不应该都是<代码>NaN

我最好的猜测是,实际问题是由于
ListBox
DisconnectedItem
对象应用为
DataContext
。当
DataTrigger
试图访问由于
DataContext
已更改而不再存在的
bool?
属性时,可能是这样的结果

不管是不是这种情况,我都不知道如何解决这个问题,因为当WPF在不再使用的元素上制作动画时,我无法控制这个问题

我觉得将使用过的项目保留在列表中,但将其折叠是一种很好的方法,因为我不必将项目移入或移出集合,这样可以使动画效果良好且平滑。此外,在我从目标区域放置项目或从目标区域返回项目到列表的代码中,我无法访问
列表框
或其集合,否则会使代码更加混乱

如果有人尝试过类似的方法,有更好的方法实现相同的用户体验,或者对导致这种情况的底层实现有很好的理解,我将非常感谢您的投入

干杯

更新:样式为XAML

<Style TargetType="ListBoxItem" BasedOn="{StaticResource {x:Type ListBoxItem}}">
     <Setter Property="Margin" Value="0,0,0,7"/>
     <Setter Property="MinHeight" Value="0"/>
     <Setter Property="Padding" Value="5"/>
     <Setter Property="Width" Value="220"/>
     <Setter Property="Height" Value="70"/>
     <Setter Property="Background" Value="{DynamicResource ContainerFill}"/>
     <EventSetter Event="MouseMove" Handler="OnMouseMove"/>
     <Style.Triggers>
         <DataTrigger Binding="{Binding IsAvailable}" Value="False">
             <DataTrigger.EnterActions>
                 <BeginStoryboard>
                     <Storyboard>
                         <ThicknessAnimation Storyboard.TargetProperty="Margin" 
                                          To="0" Duration="0:0:0.3" AutoReverse="False"/>
                         <DoubleAnimation Storyboard.TargetProperty="Height" 
                                          To="0" Duration="0:0:0.3" AutoReverse="False"/>
                     </Storyboard>
                 </BeginStoryboard>
             </DataTrigger.EnterActions>
             <DataTrigger.ExitActions>
                 <BeginStoryboard>
                     <Storyboard>
                         <ThicknessAnimation Storyboard.TargetProperty="Margin" 
                                             From="0" Duration="0:0:0.3" AutoReverse="False"/>
                         <DoubleAnimation Storyboard.TargetProperty="Height" 
                                          From="0" Duration="0:0:0.3" AutoReverse="False"/>
                     </Storyboard>
                 </BeginStoryboard>
             </DataTrigger.ExitActions>
             <Setter Property="Visibility" Value="Hidden"/>
         </DataTrigger>
         <DataTrigger Binding="{Binding IsAvailable}" Value="{x:Null}">
             <Setter Property="Visibility" Value="Hidden"/>
         </DataTrigger>
     </Style.Triggers>
 </Style>


可能重复如我所说,我在样式中使用显式值设置高度。我把它添加到了问题中。重点是:不要设置
高度
的动画,创建
布局变换
,或者最好是设置
渲染变换
并设置动画。我知道可以使用scaleY来缩小高度,但这会挤压高度,而不是将其卷起。这不是我想要的效果,因为它看起来很糟糕。此外,它在正常情况下工作,只有当我清除列表框的内容时,才会发生此异常。“只有当我清除列表框的内容时,才会发生此异常”-这是一个很好的提示。用于另外检查是否存在此问题。顺便说一句,你可能想尝试停止情节提要。不要在进入/退出操作中运行两个不同的故事板,而是创建两组触发器,在进入操作中启动故事板,在退出-停止它。