【问题标题】:WPF ListView animation by reorder of items?通过项目重新排序的WPF ListView动画?
【发布时间】:2010-11-15 11:53:45
【问题描述】:

我想做一些几年前在 WPF 演示中看到的事情。我不知道它是怎么做到的,但我知道它可以做到,所以这是我的问题。

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

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

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

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

【问题讨论】:

    标签: wpf listview animation controls


    【解决方案1】:

    另一种选择是使用微软的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);
    }
    

    【讨论】:

      【解决方案2】:

      还有做自定义面板的可能性。查理关于覆盖布局非常正确。要创建自定义面板,您主要必须重写从 System.Windows.Controls.Panel 继承的 MeasureOverrideArrangeOverride 方法。

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

      This tutorial 还在ArrangeOverride 中演示了开始动画。

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

      【讨论】:

      • 好答案;我正在寻找一个涵盖排列和测量覆盖的教程。
      【解决方案3】:

      我从未尝试过这样的事情,但我怀疑至少,您需要为 ListView 编写自己的ViewBaseherehere 有很好的例子。那么真正的问题就变成了,你用什么事件来触发你的动画?尝试查看 ItemsControl.ItemsChanged。

      最终,您可能必须从 ItemsControl 继承并覆盖多个布局和排列方法才能获得此功能。即使使用 WPF 的超可自定义控件,这也不是一件容易的事,并且需要比 XAML 更多的代码隐藏。

      【讨论】:

        猜你喜欢
        • 2015-08-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-25
        • 1970-01-01
        • 1970-01-01
        • 2014-07-05
        相关资源
        最近更新 更多