прокрутка просмотра текстового блока прокрутки в WP7 - PullRequest
3 голосов
/ 12 декабря 2011

У меня есть текстовый блок, связанный с прокруткой просмотра для прокрутки текста.Я хочу, чтобы текст автоматически прокручивался без ввода данных пользователем при срабатывании какого-либо события, например нажатия кнопки.Я пытался использовать ScrollToVerticalOffset, но переход не является плавным.Есть ли в любом случае я мог бы сделать текст прокручивать вверх плавно.

Ответы [ 2 ]

5 голосов
/ 13 декабря 2011

Вот пример, где я создал элемент управления-обертку под названием AnimatableScrollViewer, который содержит обычный ScrollViewer и TextBlock.

<UserControl>
    <Grid x:Name="LayoutRoot" Background="Transparent">
            <ScrollViewer x:Name="scrollViewer" Width="{Binding ActualWidth, ElementName=userControl, Mode=OneWay}" Height="{Binding ActualHeight, ElementName=userControl, Mode=OneWay}">
                <TextBlock TextWrapping="Wrap" Text="Add some pretty long text here..."/>
        </ScrollViewer>
    </Grid>
</UserControl>

В коде позади я добавил DependencyProperty (который мы можем анимировать извне), который вызывает метод ScrollToVerticalOffset () нашего ScrollViewer при каждом изменении.

public partial class AnimatableScrollViewer : UserControl
{
    public static readonly DependencyProperty AnimatablOffsetProperty = DependencyProperty.Register("AnimatableOffset",
        typeof(double), typeof(AnimatableScrollViewer), new PropertyMetadata(AnimatableOffsetPropertyChanged));

    public double AnimatableOffset
    {
        get { return (double)this.GetValue(AnimatablOffsetProperty); }
        set { this.SetValue(AnimatablOffsetProperty, value); }
    }

    public AnimatableScrollViewer()
    {
        InitializeComponent();
        AnimatableOffset = scrollViewer.VerticalOffset;
    }

    private static void AnimatableOffsetPropertyChanged(object sender, DependencyPropertyChangedEventArgs args)
    {
        AnimatableScrollViewer cThis = sender as AnimatableScrollViewer;
        cThis.scrollViewer.ScrollToVerticalOffset((double)args.NewValue);
    }
}

Теперь вы можете добавить AnimatableScrollViewer в PhonePage и анимировать его. Например, в обработчике событий кнопки, как этот:

private void cmdScroll_Click(object sender, RoutedEventArgs e)
    {
        // Calculate target offset
        double targetOffset = 1000;

        // Create animation and storyboard
        DoubleAnimation animation = new DoubleAnimation();
        animation.EasingFunction = new CircleEase();
        animation.Duration = new Duration(new TimeSpan(0, 0, 2));
        animation.From = animatableScrollViewer.AnimatableOffset;
        animation.To = targetOffset;

        Storyboard.SetTarget(animation, animatableScrollViewer);
        Storyboard.SetTargetProperty(animation, new PropertyPath("(AnimatableScrollViewer.AnimatableOffset)"));
        Storyboard storyboard = new Storyboard();
        storyboard.Children.Add(animation);

        storyboard.Begin();
    }

Конечно, вы также можете создать анимацию в своем коде xaml, которая бы выглядела чище. Прямо сейчас содержимое ScrollViewer исправлено ... вы можете сделать его изменяемым, добавив дополнительные свойства зависимостей в класс оболочки.

Я не знаю, является ли это лучшим решением, на самом деле мне оно кажется довольно уродливым, но оно должно дать вам представление о том, как это можно сделать.

0 голосов
/ 13 декабря 2011

Вам нужно будет анимировать смещение. Поскольку свойства смещения нельзя анимировать, вам придется либо использовать собственное решение для анимации, чтобы обновлять смещение для каждого кадра, либо создавать присоединенное свойство зависимости для смещения, которое будет вызывать ScrollToVerticalOffset для каждого изменения и будет иметь возможность анимации.

...