C# 在WPF中更改ItemsControl的DataContext时设置高度更改动画
我有一个C# 在WPF中更改ItemsControl的DataContext时设置高度更改动画,c#,wpf,storyboard,itemscontrol,C#,Wpf,Storyboard,Itemscontrol,我有一个ItemsControl,它绑定到它的DataContext。当DataContext更改时,我希望ItemsControl的高度更改设置动画。我试图为ItemsControl指定一个DataContextChanged事件: <ItemsControl x:Name="items" ItemsSource="{Binding}" ItemTemplate="{StaticResource LocationTemplate}" DataContextChanged="Items_D
ItemsControl
,它绑定到它的DataContext
。当DataContext
更改时,我希望ItemsControl
的高度更改设置动画。我试图为ItemsControl
指定一个DataContextChanged
事件:
<ItemsControl x:Name="items" ItemsSource="{Binding}" ItemTemplate="{StaticResource LocationTemplate}" DataContextChanged="Items_DataContextChanged">
在处理程序中,我尝试为高度创建一个
DoubleAnimation
。但是,我不知道如何指定From
和to
属性。有人能帮忙吗?谢谢 通过将ItemsControl
包装在画布中,我能够创建(我想)您想要的效果:
private void MyItemsControl_DataContextChanged(object Sender, DependencyPropertyChangedEventArgs e)
{
BeginAnimation(HeightProperty, New DoubleAnimation(500.0, New Duration(Timespan.FromMilliseconds(500))));
}
<Canvas x:Name="ClippingContainer" Background="Aquamarine" HorizontalAlignment="Center" VerticalAlignment="Center" ClipToBounds="True">
<ItemsControl x:Name="ICont" ItemsSource="{Binding}" SizeChanged="ItemsControl_SizeChanged"/>
</Canvas>
注意:这可以很容易地转换为它自己的UserControl
。执行此操作时,您可以覆盖MeasureOverride
,并强制布局传递重新绘制动画ItemsControl
所属的任何父布局容器
我希望这对您有所帮助。请记住,如果未指定DoubelAnimation的From属性,它将根据当前值设置动画…在许多情况下,这是所需的行为(例如,如果另一个动画正在进行或另一个值影响了动画属性,则防止出现“跳跃”效果),谢谢您的回答。我也不想硬编码toValue,因为控件可能会根据其中的项目数量而增长或收缩。有什么方法可以让我得到toValue的实际高度吗?如果你能提供更多关于你想要实现的目标的细节,我很乐意尝试进一步帮助你。:)我试过DesiredSize.Height,但不管物品如何变化,它每次都会以10像素的速度增长…当然!谢谢,XamlZealot。基本上,我有一个ItemsControl绑定到它的DataContext。单击按钮时,其DataContext将以编程方式更改。它的ItemsPanelTemplate是一个只有1列的UniformGrid。现在,如果单击按钮更改DataContext,ItemsControl会突然更改。我想为更改添加一个转换,即在ItemsControl的DataContext更改时扩展/缩小其高度。
<Canvas x:Name="ClippingContainer" Background="Aquamarine" HorizontalAlignment="Center" VerticalAlignment="Center" ClipToBounds="True">
<ItemsControl x:Name="ICont" ItemsSource="{Binding}" SizeChanged="ItemsControl_SizeChanged"/>
</Canvas>
private void ItemsControl_SizeChanged(object sender, SizeChangedEventArgs e)
if (double.IsNaN(ClippingContainer.Height))
{
ClippingContainer.Height = e.NewSize.Height;
}
else
{
ClippingContainer.BeginAnimation(FrameworkElement.HeightProperty, new DoubleAnimation(e.NewSize.Height, new Duration(TimeSpan.FromSeconds(1))));
}
if (double.IsNaN(ClippingContainer.Width))
{
ClippingContainer.Width = e.NewSize.Width;
}
else
{
ClippingContainer.BeginAnimation(FrameworkElement.WidthProperty, new DoubleAnimation(e.NewSize.Width, new Duration(TimeSpan.FromSeconds(1))));
}
}