Windows phone 7 如何通过编程滚动scrollviewer并保留动画

Windows phone 7 如何通过编程滚动scrollviewer并保留动画,windows-phone-7,silverlight-3.0,scrollviewer,Windows Phone 7,Silverlight 3.0,Scrollviewer,我有一个页面,其内容在水平方向上比手机宽,有点像全景图,但没有所有视差内容,我想让用户轻弹滚动,并按下按钮滚动到scrollviewer中指定的偏移量。ScrollToHorizontalOffset对按钮很好,只是它会丢失动画,我想保留动画。我正在做一件非常类似的事情。我创建了WizardControl和WizardPage用户控件。用户可以在页面之间切换或使用“下一页”和“上一页”按钮 我创建了一个幻灯片效果动画,可以在页面之间移动。代码如下: Storyboard sb = SlideEf

我有一个页面,其内容在水平方向上比手机宽,有点像全景图,但没有所有视差内容,我想让用户轻弹滚动,并按下按钮滚动到scrollviewer中指定的偏移量。ScrollToHorizontalOffset对按钮很好,只是它会丢失动画,我想保留动画。

我正在做一件非常类似的事情。我创建了WizardControl和WizardPage用户控件。用户可以在页面之间切换或使用“下一页”和“上一页”按钮

我创建了一个幻灯片效果动画,可以在页面之间移动。代码如下:

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;
}
主面板是一个水平堆栈面板。向导页面被添加到其中

_页面宽度很重要,因为它在纵向和横向模式下都有效

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++;
}

公共无效添加页面(向导页面控制页面)
{
主面板宽度+=\u页面宽度;
page.PageWidth=\u PageWidth;
双新右=(MainPanel.Width-_pageWidth)*-1;
主面板边距=新厚度(0,0,新右,10);
主面板.Children.Add(第页);
_向导页面列表。添加(第页);
TotalPages++;
}

我最终还通过如下所述的滚动条连接到了scrollviewer:但是您的解决方案更好,谢谢!我想知道你是如何解决以下问题的:水平stackpanel剪辑任何比屏幕宽的东西,我通过给它一个负的边距来阻止它,但我不确定这是否是正确的方法。完成后,我试图找出如何让stackpanel滚动以响应flicks。您是否使用工具箱gesturelistener在flicks上触发上述动画?已添加panel xaml和add page方法来回答上述问题。是的,我使用了手势监听器工具包。好的,终于成功了。在这里我们应该清楚,我们正在重新发明轮子,基本上重建一个scrollviewer。我还将提到,在父面板上设置CacheMode=BitmapCache以获得良好的滚动性能非常重要。可以在以下位置找到对该问题的全面处理: