WPF:Анимировать высоту ListView, когда конечная высота неизвестна
Вопрос
У меня есть ListView, который определяется очень просто в моем XAML следующим образом
<ListView Name="myListVew" MaxHeight="200" Visibility="Collapsed">
<ListView.View>
<GridView>
<GridViewColumn Header="Line" Width="Auto" DisplayMemberBinding="{Binding Line}" />
<GridViewColumn Header="Error" Width="Auto" DisplayMemberBinding="{Binding Error}" />
</GridView>
</ListView.View>
</ListView>
Когда я хочу, чтобы отображался ListView, я хочу анимировать высоту представления списка с 0.Проблема в том, что я не знаю конечной высоты ListView, поскольку это будет зависеть от того, сколько элементов отображается внутри него.Есть ли какой-нибудь способ сделать это?
Решение
Разве вам не противно, когда вы часами ищете решение, размещаете вопрос на форуме, а затем сами находите ответ через 10 минут?
Во всяком случае, я заставил это работать, применив преобразование масштаба макета следующим образом
<DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="ErrorDisplay" Storyboard.TargetProperty="(FrameworkElement.LayoutTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleY)">
<SplineDoubleKeyFrame KeyTime="00:00:00" Value="0"/>
<SplineDoubleKeyFrame KeyTime="00:00:00.3000000" Value="1"/>
</DoubleAnimationUsingKeyFrames>
Другие советы
Это не совсем тот же сценарий, но он может помочь кому-то другому.
У меня была граница с высотой Auto, и я хотел, чтобы она анимировалась до определенной высоты.
Моя граница выглядела примерно так:
<Border Name="ContainerBorder">
<!-- Stuff... -->
</Border>
Я создал эту раскадровку:
<Storyboard x:Key="EditIn">
<DoubleAnimation Storyboard.TargetProperty="Height"
Storyboard.TargetName="ContainerBorder"
Name="BorderAnimation"
To="45"
Duration="0:0:0.8" />
</Storyboard>
Кнопка, которая запускала анимацию, имела некоторую кодовую привязку:
private void Edit_Click(object sender, RoutedEventArgs e) {
Storyboard sb = (Storyboard)FindResource("EditIn");
//Find the border animation
DoubleAnimation da = (DoubleAnimation)sb.Children.Where(t => t.Name == "BorderAnimation").FirstOrDefault();
if (da != null) { da.From = ContainerBorder.ActualHeight; }
sb.Begin(this);
}
Итак, я просто нашел границу и установил свойству анимации "From" значение ActualHeight элемента FrameworkElement.