动画列表框滚动

本文关键字:滚动 列表 动画 | 更新日期: 2023-09-27 18:26:20

我有一个垂直的WPF列表框,绑定到一个集合,带有一个自定义ItemTemplate。我注意到了一些事情:

  1. 与独立的滚动查看器不同,列表框不会连续滚动,而是以与项目高度相等的增量跳跃。XAML中的这个差异是在哪里定义的(列表框模板毕竟只包含一个滚动查看器?

  2. 有可能制作这个跳跃的动画吗?我正在尝试设置它的动画,以便它快速设置从一个偏移到另一个偏移的跳跃的动画。蛋糕上的冰会让动画在最后显示一些内部和"摆动"。我希望有一个预先定义的行为,但似乎没有。在BeginAnimation的代码隐藏中尝试这样做的尝试失败了,抛出了一个异常,告诉我Scrollviewer的VerticalOffset属性无法设置动画。

有线索吗?

谢谢Tom

动画列表框滚动

1-如果您希望滚动不跳转,可以将ScrollViewer.CanContentScroll更改为False。

<ListBox ScrollViewer.CanContentScroll="False" .... >.....</ListBox>

2-您可以创建自己的控件,该控件可以设置其偏移的动画。

MyScrollViewer类

public class MyScrollViewer : ScrollViewer
{
    public static readonly DependencyProperty MyOffsetProperty = DependencyProperty.Register(
        "MyOffset", typeof(double), typeof(MyScrollViewer),
        new PropertyMetadata(new PropertyChangedCallback(onChanged)));
    public double MyOffset
    {
        get { return (double)this.GetValue(ScrollViewer.VerticalOffsetProperty); }
        set { this.ScrollToVerticalOffset(value); }
    }
    private static void onChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        ((MyScrollViewer)d).MyOffset = (double)e.NewValue;
    }
}

在MainWindow.xaml或其他中

<Grid>
    <my:MyScrollViewer x:Name="myScroll">
        <ListBox x:Name="myList">
        </ListBox>
    </my:MyScrollViewer>
    <Button Content="Down"
                    VerticalAlignment="Bottom"
                    HorizontalAlignment="Right"
                    Margin="10"
                    Click="Button_Click" />
</Grid>

主窗口.cs

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        for (int i = 1; i < 50; i++)
            myList.Items.Add(i);
    }
    private void Button_Click(object sender, RoutedEventArgs e)
    {
        double offset = (double)myScroll.GetValue(MyScrollViewer.MyOffsetProperty);
        DoubleAnimation goDown = new DoubleAnimation(
            offset,
            offset + 100,
            new Duration(TimeSpan.FromSeconds(2)));
        myScroll.BeginAnimation(MyScrollViewer.MyOffsetProperty, goDown);
    }
}