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, поскольку она будет зависеть от того, сколько элементов отображается внутри него. Есть ли способ сделать это?


person Ray    schedule 30.04.2009    source источник


Ответы (2)


Разве вы не ненавидите, когда вы часами ищете решение, задаете вопрос на форуме, а затем сами находите ответ через 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>
person Ray    schedule 30.04.2009
comment
Это может удовлетворить вас, но действительно ли это отвечает на ваш первоначальный вопрос? Я думал, вы хотите увеличить высоту элемента управления, но не масштабировать его содержимое при этом. - person Mal Ross; 11.06.2010
comment
Я согласен с Мэлом... шкала работает в определенных сценариях, но не во всех. Я все еще хотел бы получить ответ на ваш первоначальный вопрос. - person Chris Nicol; 27.09.2011
comment
@ChrisNicol Я думаю, у вас может быть просто двойная анимация, в которой вы ничего не указываете для свойства To. - person Ray; 27.09.2011

Это не совсем тот же сценарий, но он может помочь кому-то другому.

У меня была граница с высотой 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.

person Daniel    schedule 16.08.2012