Как программно прокрутить scrollviewer и сохранить анимацию

#windows-phone-7 #silverlight-3.0 #scrollviewer

#windows-phone-7 #silverlight-3.0 #scrollviewer

Вопрос:

У меня есть страница, содержимое которой по горизонтали шире, чем телефон, что-то вроде панорамы, но без всего этого параллакса, и я хочу позволить пользователю щелкнуть для прокрутки, а также нажать кнопку для прокрутки до заданных смещений в scrollviewer. ScrollToHorizontalOffset отлично работает для кнопки, за исключением того, что она теряет анимацию, а я хочу сохранить анимацию.

Ответ №1:

Я делаю очень похожую вещь. Я создал пользовательские элементы управления WizardControl и WizardPage. Пользователь может переключаться между страницами или использовать кнопки next и previous.

Я создал анимацию с эффектом слайда для перемещения между страницами. Вот код:

 Storyboard sb = SlideEffect(MainPanel, (-_pageWidth * pagesToMove));
sb.Completed  = Slide_Completed;
sb.Begin();


private Storyboard SlideEffect(UIElement controlToAnimate, double positionToMove)
{
    //Get position of stackpanel
    GeneralTransform gt = controlToAnimate.TransformToVisual(MainGrid);
    Point p = gt.Transform(new Point(0, 0));

    //add new storyboard and animation
    Storyboard sb = new Storyboard();
    DoubleAnimation da = new DoubleAnimation { To = p.X   positionToMove };
    Storyboard.SetTarget(da, controlToAnimate);

    Storyboard.SetTargetProperty(da, new PropertyPath("(controlToAnimate.RenderTransform).(TransformTranslate.X)"));

    ExponentialEase ee = new ExponentialEase { Exponent = 6.0, EasingMode = EasingMode.EaseOut };
    da.EasingFunction = ee;

    sb.Children.Add(da);
    return sb;
}
  

mainPanel — это горизонтальная панель стека. К нему добавляются страницы мастера.

_pageWidth имеет значение, поскольку это работает как в портретном, так и в альбомном режиме.

pagestoMove используется, поскольку у меня есть кнопка для возврата непосредственно к первой странице.

ОБНОВЛЕНИЕ — добавлен мастер определения главной панели и метод добавления страницы

 <StackPanel
    x:Name="MainPanel"
    Grid.Row="1"
    Orientation="Horizontal"
    RenderTransformOrigin="0.5,0.5"
    Margin="0,0,0,10"
    Width="480">

    <StackPanel.RenderTransform>
        <TranslateTransform
            X="0" />
    </StackPanel.RenderTransform>

</StackPanel>


public void AddPage(WizardPageControl page)
{
    MainPanel.Width  = _pageWidth;

    page.PageWidth = _pageWidth;

    double newRight = (MainPanel.Width - _pageWidth) * -1;
    MainPanel.Margin = new Thickness(0, 0, newRight, 10);

    MainPanel.Children.Add(page);

    _wizardPageList.Add(page);

    TotalPages  ;
}
  

Комментарии:

1. Я также в конечном итоге заставил это работать с scrollviewer, прикрепив к полосам прокрутки, как описано здесь: codeproject.com/Articles/95746/… Но ваше решение намного приятнее, спасибо!

2. Поторопился с этим последним комментарием, интересно, как вы решили следующие проблемы: Горизонтальная панель stackpanel обрезает все, что шире экрана, я заставил ее прекратить это делать, присвоив ей отрицательный запас, но я не уверен, что это правильный подход. После этого я пытаюсь выяснить, как заставить stackpanel прокручиваться в ответ на щелчки. Использовали ли вы toolkit gesturelistener для запуска вышеупомянутой анимации на щелчках?

3. добавили panel xaml и метод add page для ответа выше. Да, я использовал прослушиватель жестов toolkit.

4. Хорошо, наконец-то это заработало. Здесь должно быть ясно, что мы изобретаем колесо и, по сути, перестраиваем scrollviewer. Я также упомяну, что важно установить CacheMode = BitmapCache на родительской панели, чтобы получить достойную производительность прокрутки. Полное решение проблемы можно найти здесь: wintellect.com/CS/blogs/jprosise/archive/2011/01/20 /…