1

我有一个 StackPanel,我正在左右滑动以使用 TranslateTransform 模拟移动页面。

如果我调用幻灯片方法一次它运行良好。如果我快速连续调用我的幻灯片方法两次(在代码中),则第二次转换的起始位置错误并最终出现在错误的位置。

如何让我的第二个翻译“刷新”它的起始位置?

这是堆栈面板

    <StackPanel
        x:Name="MainPanel"
        Orientation="Horizontal">
        <StackPanel.RenderTransform>
            <TranslateTransform
                x:Name="MainPanelTransform"
                />
        </StackPanel.RenderTransform>
    </StackPanel>

这是幻灯片代码:

    private void SlidePage(int pagesToMove)
    {
        Storyboard sb = SlideEffect(MainPanel, (-PageWidth * pagesToMove));
        sb.Completed += SlideCompleted;
        sb.Begin();
    }

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

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

        Storyboard.SetTarget(da, controlToAnimate);

        Storyboard.SetTargetProperty(da, new PropertyPath("RenderTransform.(TranslateTransform.X)"));
        //Storyboard.SetTargetProperty(da, new PropertyPath("RenderTransform.Children[0].X"));

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

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

    }

有问题的代码行是这样的:

var p = gt.Transform(new Point(0, 0));

我第二次调用 SlideEffect 方法时,它的值与第一次相同。似乎动画正在缓冲并一起运行。有没有办法停止缓冲?

4

1 回答 1

0

您是否尝试更改 的FillBehavior属性Storyboard

更新:

在 VS 中有一个错误,所以我无法重现您的情况。但我可能会推荐你:

  1. 尝试禁用EasingFunction. 可能在实际完成Storyboard.Completed之前触发;Storyboard

  2. 你确定,变换会改变实际坐标吗?我认为这是解决方案,但不确定。

  3. Storyboard.Completed您可以手动更新变换坐标:

    MainPanelTransform.BeginAnimation(TranslateTransform.XProperty, null);
    MainPanelTransform.X = -100;
    
于 2012-06-17T07:01:26.160 回答