Я пытаюсь улучшить анимацию ListView
внутри приложения WPF. Я хочу скрыть ListView
из поля зрения (запускается Button
). В открытом состоянии он должен занимать высоту своей родительской сетки. Я начал с анимации ScaleTransform
, но мне не понравилось, как это искажает все элементы в элементах. Затем я попытался анимировать MaxHeight
от 0 до высоты сетки, но это было действительно прерывисто (казалось, нормально на моем компьютере разработчика Core i7 Laptop Win7Pro, но при переходе на Intel Atom E3827 Win10 1607 это было довольно плохо). Я думал, что это может быть вызвано постоянным пересчетом Height
и Scrollbar
, поэтому я подумал, что просто поместил бы его в Canvas
и установил бы его на ClipToBounds
<Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="0,-1,0,0">
<Canvas VerticalAlignment="Top" Height="0" ClipToBounds="True">
<ListView HorizontalAlignment="Stretch" Height="{Binding ActualHeight, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Grid}}" VerticalAlignment="Top" ScrollViewer.PanningMode="VerticalOnly" Background="#FFFFFEFF" ItemsSource="{Binding MessageLogViewModel.MessageLog}" >
<ListView.View>
<GridView>
<GridViewColumn Header="Type" Width="220">
<GridViewColumn.CellTemplate>
<DataTemplate DataType="{x:Type vm:MessageLogViewModel}">
<StackPanel Orientation="Horizontal">
<Path x:Name="PART_Path" Width="30" Height="30" Stretch="UniformToFill" Fill="{StaticResource DarkForeGround2}" Data="M12.44,6.065H15.55V9.175L14.773,16.639H13.218L12.44,9.175V6.065M12.44,18.816H15.55V21.93H12.44V18.816M28,14 A14,14 0 0,1 14,28A14,14 0 0,1 0,14A14,14 0 0,1 14,0A14,14 0 0,1 28,14 M26,12A12,12 0 0,1 12,26A12,12 0 0,1 2,12A12,12 0 0,1 12,2A12,12 0 0,1 26,12Z" Margin="28,0,15,0"/>
<TextBlock Text="{Binding SeverityLevel}" VerticalAlignment="Center"/>
</StackPanel>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn Header="In" Width="154" DisplayMemberBinding="{Binding TimeRaised,StringFormat=hh:mm tt}"/>
<GridViewColumn Header="Out" Width="154">
<GridViewColumn.CellTemplate>
<DataTemplate DataType="{x:Type vm:MessageViewModel}">
<TextBlock Text=""/>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn Header="Description" Width="875" DisplayMemberBinding="{Binding Description}"/>
</GridView>
</ListView.View>
<ListView.ItemContainerStyle>
<Style TargetType="{x:Type ListViewItem}">
<Setter Property="Height" Value="50"/>
<Setter Property="FontSize" Value="25"/>
<Setter Property="FontFamily" Value="{StaticResource Fonts.Button}"/>
<Setter Property="FontStretch" Value="Condensed"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ListViewItem">
<Border Background="{TemplateBinding Background}" BorderThickness="0">
<GridViewRowPresenter HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Content="{TemplateBinding Content}"/>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<Trigger Property="ItemsControl.AlternationIndex" Value="1">
<Setter Property="Background" Value="#FFF3F6F9"/>
</Trigger>
</Style.Triggers>
</Style>
</ListView.ItemContainerStyle>
</ListView>
<Canvas.Style>
<Style TargetType="Canvas">
<Style.Triggers>
<DataTrigger Binding="{Binding IsChecked, ElementName=MessageButton}" Value="True">
<DataTrigger.EnterActions>
<BeginStoryboard>
<Storyboard TargetProperty="Height">
<DoubleAnimation Duration="0:0:0.2" To="719"/>
</Storyboard>
</BeginStoryboard>
</DataTrigger.EnterActions>
<DataTrigger.ExitActions>
<BeginStoryboard>
<Storyboard TargetProperty="Height">
<DoubleAnimation Duration="0:0:0.2" To="0"/>
</Storyboard>
</BeginStoryboard>
</DataTrigger.ExitActions>
</DataTrigger>
</Style.Triggers>
</Style>
</Canvas.Style>
</Canvas>
</Grid>
Это кажется немного более производительный, но теперь вертикальная полоса прокрутки отсутствует. Я знаю, что это связано с Canvas
, потому что, если я верну его, полоса прокрутки будет вести себя нормально.
Также это лучший способ сделать это. ListView
всегда будет одного и того же эффективного размера, я хочу только оживить его появление, исчезновение