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来缩小高度,但这会挤压高度,而不是将其卷起。这不是我想要的效果,因为它看起来很糟糕。此外,它在正常情况下工作,只有当我清除列表框的内容时,才会发生此异常。“只有当我清除列表框的内容时,才会发生此异常”-这是一个很好的提示。用于另外检查是否存在此问题。顺便说一句,你可能想尝试停止情节提要。不要在进入/退出操作中运行两个不同的故事板,而是创建两组触发器,在进入操作中启动故事板,在退出-停止它。