Pergunta

Eu tenho um ListView, que é definido de maneira muito simples na minha XAML como assim

<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 eu quero o ListView a aparecer, eu quero animar a altura da exibição de lista de 0. O problema é, eu não sei a altura final do ListView, uma vez que vai depender de quantos itens são mostrados dentro isto. Existe uma maneira de fazer isso?

Foi útil?

Solução

Você não odeia quando você procurar por horas para uma solução, postar uma pergunta para um fórum e, em seguida, encontrar a resposta-se 10 minutos mais tarde?

De qualquer forma, eu tenho que trabalhar através da aplicação de uma escala de layout transformar como assim

<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>

Outras dicas

Este não é exatamente o mesmo cenário, mas pode ajudar alguém.

Eu tive uma fronteira que tinha uma altura de Auto e eu queria animar a uma altura específica.

Meu fronteira ficou assim:

<Border Name="ContainerBorder">
  <!-- Stuff... -->
</Border>

Eu criei este storyboard:

<Storyboard x:Key="EditIn">
  <DoubleAnimation Storyboard.TargetProperty="Height"
                   Storyboard.TargetName="ContainerBorder"
                   Name="BorderAnimation"
                   To="45"
                   Duration="0:0:0.8" />
</Storyboard>

O botão que acionou a animação teve algum codebehind:

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

Então, eu simplesmente encontrei a fronteira e definir o campo "De" de propriedade da animação para ActualHeight do FrameworkElement.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top