通过重新排序项目的WPF ListView动画?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了通过重新排序项目的WPF ListView动画?相关的知识,希望对你有一定的参考价值。

我想做几年前在WPF演示中看到的事情。我不知道它是如何完成的,但我知道它可以完成,所以这是我的问题。

在演示中,有一个带有ListView或ListBox的WPF应用程序,其中包含大量项目。每个ListView都重新排序了列表中已更改位置的项目。但ListView不仅仅是刷新,事实上有一个项目的动画移动到他们的新位置。

这个应用程序非常酷,现在这正是我需要的。我们计划进行实时数据排名应用程序,这种动画将是完美的。

但我的团队中没有人知道如何做到这一点。我正在考虑一个ObservableCollection和Databinding,但其余的对我来说完全是个谜。

任何提示或想法都将是一个很大的帮助。我相信有人已经这样做了。当WPF是新手时,我亲眼看到它,但我不知道从哪里开始寻找。

答案

还可以使用自定义面板。查理对于覆盖布局几乎是正确的。要创建自定义Panel,您主要必须覆盖从MeasureOverride继承的ArrangeOverrideSystem.Windows.Controls.Panel方法。

CodeProject上的This project演示了几个自定义面板,您可以在其中研究它们的动画效果。当一行从一行的末尾移动到另一行的开头或反之亦然时,FanPanel动画重新定位项目。

This tutorial还展示了ArrangeOverride的开始动画。

我没有尝试过,但您也可以使用等级值和自定义ValueConverter将等级转换为一个位置,以便在Canvas中驱动这样的动画。但是,自定义面板可以更好地自包含,允许您更改排名数据中使用的DataTemplate,并让每个人告诉Panel他们想要多高(假设它们是垂直排列的)。

另一答案

我从未尝试过这样的事情,但我怀疑至少,你需要为ListView编写自己的ViewBase。有很好的例子,herehere。然后真正的问题是,你用什么事件动画触发?尝试查看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动画?的主要内容,如果未能解决你的问题,请参考以下文章

通过拖动重新排序ListView的元素[重复]

UWP 动画列表项移动

使用拖放重新排序 ListView 中的项目

通过拖放可重新排序的 ListView

通过拖放功能重新排序 Xamarin 表单中的 ListView

CheckBox 动画在 ReorderableListView 内时不起作用