【问题标题】:WPF TranslateTransform ErrorWPF 转换转换错误
【发布时间】:2012-06-17 02:22:29
【问题描述】:

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

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

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

这里是 StackPanel

    <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 方法时,它的值与第一次相同。似乎动画正在缓冲并一起运行。有没有办法停止缓冲?

【问题讨论】:

    标签: wpf storyboard


    【解决方案1】:

    您是否尝试更改StoryboardFillBehavior 属性?

    更新:

    我有一个bug in VS,所以我无法重现你的情况。但我可能会推荐你:

    1. 尝试禁用EasingFunction。也许Storyboard.CompletedStoryboard 实际完成之前触发;

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

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

      MainPanelTransform.BeginAnimation(TranslateTransform.XProperty, null);
      MainPanelTransform.X = -100;
      

    【讨论】:

    • 好主意。尝试了 Stop 和 HoldEnd 以及同样的问题。我相信这个问题是由于动画的异步性质造成的。第二个在第一个更新值之前开始。
    • 我认为问题是由动画的异步性质引起的。第二个动画在第一个动画完成甚至称为 Completed 之前运行。我将代码更改为直接使用 TranslateTransform 而不使用情节提要,并且一切正常。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-07
    • 2017-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-15
    • 1970-01-01
    相关资源
    最近更新 更多