Анимированная прокрутка списка - PullRequest
1 голос
/ 02 марта 2012

У меня есть вертикальный список WPF, связанный с коллекцией, с пользовательским шаблоном ItemTemplate.Я заметил несколько вещей:

  1. В отличие от отдельного средства просмотра с прокруткой, список не прокручивается непрерывно, а скачет с шагом, равным высоте элементов.Где в XAML определяется это различие (в конце концов, шаблон списка просто содержит средство просмотра прокрутки?

  2. Возможно ли оживить этот прыжок? Я пытаюсь оживить это, чтобы он быстро оживлялпрыжок от одного смещения к другому. Обледенение на торте было бы для анимации, чтобы отобразить некоторое interia и «колебание» в конце. Я надеялся, что для этого будет заранее определенное поведение, но, похоже, его нет.Попытки сделать это самостоятельно в коде с BeginAnimation потерпели неудачу, при этом возникло исключение, сообщающее мне, что свойство VerticalOffset Scrollviewer не может быть анимировано.

Любые подсказки?

Спасибо, Том

1 Ответ

3 голосов
/ 02 марта 2012

1- Если вы хотите, чтобы прокрутка не выполнялась, можно изменить ScrollViewer.CanContentScroll на False.

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

2 - Вы можете создать свой собственный элемент управления, способный анимировать его смещение.

MyScrollViewer Class

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>

MainWindow.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);
    }
}
...