通过重新排序项目的WPF ListView动画?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了通过重新排序项目的WPF ListView动画?相关的知识,希望对你有一定的参考价值。
我想做几年前在WPF演示中看到的事情。我不知道它是如何完成的,但我知道它可以完成,所以这是我的问题。
在演示中,有一个带有ListView或ListBox的WPF应用程序,其中包含大量项目。每个ListView都重新排序了列表中已更改位置的项目。但ListView不仅仅是刷新,事实上有一个项目的动画移动到他们的新位置。
这个应用程序非常酷,现在这正是我需要的。我们计划进行实时数据排名应用程序,这种动画将是完美的。
但我的团队中没有人知道如何做到这一点。我正在考虑一个ObservableCollection和Databinding,但其余的对我来说完全是个谜。
任何提示或想法都将是一个很大的帮助。我相信有人已经这样做了。当WPF是新手时,我亲眼看到它,但我不知道从哪里开始寻找。
还可以使用自定义面板。查理对于覆盖布局几乎是正确的。要创建自定义Panel,您主要必须覆盖从MeasureOverride
继承的ArrangeOverride
和System.Windows.Controls.Panel
方法。
CodeProject上的This project演示了几个自定义面板,您可以在其中研究它们的动画效果。当一行从一行的末尾移动到另一行的开头或反之亦然时,FanPanel
动画重新定位项目。
This tutorial还展示了ArrangeOverride
的开始动画。
我没有尝试过,但您也可以使用等级值和自定义ValueConverter
将等级转换为一个位置,以便在Canvas
中驱动这样的动画。但是,自定义面板可以更好地自包含,允许您更改排名数据中使用的DataTemplate
,并让每个人告诉Panel
他们想要多高(假设它们是垂直排列的)。
我从未尝试过这样的事情,但我怀疑至少,你需要为ListView编写自己的ViewBase。有很好的例子,here和here。然后真正的问题是,你用什么事件动画触发?尝试查看ItemsControl.ItemsChanged。
最终,您可能必须继承ItemsControl并覆盖多个布局并安排方法以获得此功能。即使使用WPF的超可自定义控件,这也不是一件容易的事,并且需要比XAML更多的代码隐藏。
另一种选择是使用微软的ReorderThemeTransition。从网站上的示例:
<!--XAML-->
<StackPanel>
<Button x:Name="AddItemButton" Content="AddItem" Click="AddItemButton_Click"/>
<ItemsControl x:Name="ItemsList">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<WrapGrid>
<WrapGrid.ChildrenTransitions>
<!-- Apply a ReorderThemeTransition that will run when child elements are reordered. -->
<TransitionCollection>
<ReorderThemeTransition/>
</TransitionCollection>
</WrapGrid.ChildrenTransitions>
</WrapGrid>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<!-- Initial items. -->
<Rectangle Width="100" Height="100" Fill="Red"/>
<Rectangle Width="100" Height="100" Fill="Green"/>
<Rectangle Width="100" Height="100" Fill="Blue"/>
</ItemsControl>
</StackPanel>
然后在代码中:
// C#
private void AddItemButton_Click(object sender, RoutedEventArgs e)
{
Rectangle newItem = new Rectangle();
Random rand = new Random();
newItem.Height = 100;
newItem.Width = 100;
newItem.Fill = new SolidColorBrush(Color.FromArgb(255,
(byte)rand.Next(0, 255), (byte)rand.Next(0, 255), (byte)rand.Next(0, 255)));
// Insert a new Rectangle of a random color into the ItemsControl at index 2.
ItemsList.Items.Insert(2, newItem);
}
以上是关于通过重新排序项目的WPF ListView动画?的主要内容,如果未能解决你的问题,请参考以下文章