WPF: Animate Height of ListView quando l'altezza finale è sconosciuta
Domanda
Ho un ListView, che è definito in modo molto semplice nel mio XAML in questo modo
<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>
Quando voglio che ListView appaia, voglio animare l'altezza della visualizzazione elenco da 0. Il problema è che non conosco l'altezza finale di ListView poiché dipenderà dal numero di elementi mostrati all'interno esso. Esiste un modo per farlo?
Soluzione
Non lo odi quando cerchi ore per trovare una soluzione, pubblica una domanda in un forum e trova la risposta tu stesso 10 minuti dopo?
Comunque, l'ho fatto funzionare applicando una trasformazione della scala del layout in questo modo
<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>
Altri suggerimenti
Questo non è esattamente lo stesso scenario ma può aiutare qualcun altro.
Avevo un bordo che aveva un'altezza di Auto e volevo che si animasse a un'altezza specifica.
Il mio bordo sembrava così:
<Border Name="ContainerBorder">
<!-- Stuff... -->
</Border>
Ho creato questo storyboard:
<Storyboard x:Key="EditIn">
<DoubleAnimation Storyboard.TargetProperty="Height"
Storyboard.TargetName="ContainerBorder"
Name="BorderAnimation"
To="45"
Duration="0:0:0.8" />
</Storyboard>
Il pulsante che ha attivato l'animazione aveva un po 'di codice dietro:
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);
}
Quindi, ho semplicemente trovato il bordo e impostato " Da " proprietà dell'animazione per ActualHeight di FrameworkElement.