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))));
    }
}