Прокрутка анимации - PullRequest
       0

Прокрутка анимации

5 голосов
/ 23 августа 2011

Как я могу анимировать прокрутку для ListBox?Я знаю, что могу использовать scrollIntoView, но как мне его оживить?Я хочу нажимать клавиши со стрелками, чтобы перейти от одного элемента списка к другому.

Ответы [ 2 ]

7 голосов
/ 23 августа 2011

Вот примерная реализация, основанная на том же подходе, что и следующая ссылка
http://aniscrollviewer.codeplex.com/

Свойство VerticalOffset доступно только для чтения, поэтому вместо него можно использовать присоединенное свойство VerticalOffset дляScrollViewer, который в свою очередь делает ScrollToVerticalOffset.Это прикрепленное свойство может быть анимированным.

Вы также можете создать метод расширения для ItemsControl, называемый AnimateScrollIntoView.

Вызовите его следующим образом

listBox.AnimateScrollIntoView(yourItem);

ScrollViewerBehavior

public class ScrollViewerBehavior
{
    public static DependencyProperty VerticalOffsetProperty =
        DependencyProperty.RegisterAttached("VerticalOffset",
                                            typeof(double),
                                            typeof(ScrollViewerBehavior),
                                            new UIPropertyMetadata(0.0, OnVerticalOffsetChanged));

    public static void SetVerticalOffset(FrameworkElement target, double value)
    {
        target.SetValue(VerticalOffsetProperty, value);
    }
    public static double GetVerticalOffset(FrameworkElement target)
    {
        return (double)target.GetValue(VerticalOffsetProperty);
    }
    private static void OnVerticalOffsetChanged(DependencyObject target, DependencyPropertyChangedEventArgs e)
    {
        ScrollViewer scrollViewer = target as ScrollViewer;
        if (scrollViewer != null)
        {
            scrollViewer.ScrollToVerticalOffset((double)e.NewValue);
        }
    }
}

ItemsControlExtensions

public static class ItemsControlExtensions
{
    public static void AnimateScrollIntoView(this ItemsControl itemsControl, object item)
    {
        ScrollViewer scrollViewer = VisualTreeHelpers.GetVisualChild<ScrollViewer>(itemsControl);

        UIElement container = itemsControl.ItemContainerGenerator.ContainerFromItem(item) as UIElement;
        int index = itemsControl.ItemContainerGenerator.IndexFromContainer(container);
        double toValue = scrollViewer.ScrollableHeight * ((double)index / itemsControl.Items.Count);
        Point relativePoint = container.TranslatePoint(new Point(0.0, 0.0), Window.GetWindow(container));

        DoubleAnimation verticalAnimation = new DoubleAnimation();
        verticalAnimation.From = scrollViewer.VerticalOffset;
        verticalAnimation.To = toValue;
        verticalAnimation.DecelerationRatio = .2;
        verticalAnimation.Duration = new Duration(TimeSpan.FromMilliseconds(1000));
        Storyboard storyboard = new Storyboard();
        storyboard.Children.Add(verticalAnimation);
        Storyboard.SetTarget(verticalAnimation, scrollViewer);
        Storyboard.SetTargetProperty(verticalAnimation, new PropertyPath(ScrollViewerBehavior.VerticalOffsetProperty));
        storyboard.Begin();
    }
}

А так как вам также нужно овладеть ScrollViewer, вам это понадобится

public static class VisualTreeHelpers
{
    public static T GetVisualChild<T>(DependencyObject parent) where T : Visual
    {
        T child = default(T);

        int numVisuals = VisualTreeHelper.GetChildrenCount(parent);
        for (int i = 0; i < numVisuals; i++)
        {
            Visual v = (Visual)VisualTreeHelper.GetChild(parent, i);
            child = v as T;
            if (child == null)
            {
                child = GetVisualChild<T>(v);
            }
            if (child != null)
            {
                break;
            }
        }
        return child;
    }
}
0 голосов
/ 23 августа 2011

Взгляните на эту статью , в которой объясняется, как анимировать прокрутку и добавлять сенсорные жесты. Загрузите исходный код внизу страницы и посмотрите на решение WpfScrollContent. Я бы расширил WPF ListBox и добавил к нему анимацию прокрутки, чтобы вы могли повторно использовать элемент управления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...