代码之家  ›  专栏  ›  技术社区  ›  Ray

通过ItemsSource添加项目时,如何设置ListView高度的动画?

  •  0
  • Ray  · 技术社区  · 16 年前

    我有一个列表视图,它是用MinHeight和MaxHeight设置的。最终高度由列表中的项目数决定。

    1 回复  |  直到 16 年前
        1
  •  1
  •   MichaC    16 年前

    这里有一个例子,它能满足你的需求(据我所知)。我会称之为“又快又脏”,并没有说我花了很多心思。

        public class CustomListView : ListView
        {
            public bool IsAttached
            {
                get { return (bool)GetValue(IsAttachedProperty); }
                set { SetValue(IsAttachedProperty, value); }
            }
    
            // Using a DependencyProperty as the backing store for IsAttached.  
            // This enables animation, styling, binding, etc...
            public static readonly DependencyProperty IsAttachedProperty =
                DependencyProperty.Register("IsAttached", 
                    typeof(bool), 
                    typeof(CustomListView), 
                    new UIPropertyMetadata(false));
        }
    
        public class ViewModel : INotifyPropertyChanged
        {
            public void PopulateItems()
            {
                Items = new List<string>();
    
                for (var i = 0; i < 200; i++ )
                {
                    Items.Add("The quick brown fox jumps over the lazy dog.");
                }
                InvokePropertyChanged(new PropertyChangedEventArgs("Items"));
    
                IsAttached = true;
                InvokePropertyChanged(new PropertyChangedEventArgs("IsAttached"));
            }
    
            public List<string> Items { get; private set; }
            public bool IsAttached { get; private set; }
    
            public event PropertyChangedEventHandler PropertyChanged;
    
            private void InvokePropertyChanged(PropertyChangedEventArgs e)
            {
                var changed = PropertyChanged;
    
                if (changed != null)
                {
                    changed(this, e);
                }
            }
        }
    
    <Window x:Class="AnimateHeight.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:local="clr-namespace:AnimateHeight"
        Title="Window1" Height="300" Width="300">
        <StackPanel>
            <Button Width="100" Content="Add Items" Click="OnClickAddItems"/>
            <local:CustomListView x:Name="VariableListView" ItemsSource="{Binding Items}" IsAttached="{Binding IsAttached}" >
                <local:CustomListView.Style>
                    <Style TargetType="{x:Type local:CustomListView}">
                        <Setter Property="MinHeight" Value="50" />
                        <Setter Property="MaxHeight" Value="50" />
                        <Style.Triggers>
                            <Trigger Property="IsAttached" Value="true">
                                <Trigger.EnterActions>
                                    <BeginStoryboard>
                                        <Storyboard>
                                            <DoubleAnimation 
                                                Storyboard.TargetProperty="(ListView.MaxHeight)" 
                                                To="150" 
                                                Duration="0:0:5"/>
                                        </Storyboard>
                                    </BeginStoryboard>
                                </Trigger.EnterActions>
                            </Trigger>
                        </Style.Triggers>
                    </Style>
                </local:CustomListView.Style>
            </local:CustomListView>
        </StackPanel>
    </Window>
    
        /// <summary>
        /// Interaction logic for Window1.xaml
        /// </summary>
        public partial class Window1 : Window
        {
            public Window1()
            {
                InitializeComponent();
    
                DataContext = new ViewModel();
            }
    
            private void OnClickAddItems(object sender, RoutedEventArgs e)
            {
                ((ViewModel)DataContext).PopulateItems();
            }
        }