1

我使用一些 WPF 动画来垂直移动 UserControl。

这是代码

public void RestartAnimation(double contentControlHeight, double thisHeight)
        {
            if (cp != null && IsLoaded)
                da.From = contentControlHeight;  
                da.To = -thisHeight;
                da.RepeatBehavior = RepeatBehavior.Forever;
                da.Duration = new Duration(TimeSpan.FromSeconds(this.Duration)); 
                sb.Children.Clear();
                sb.Children.Add(da);
                Storyboard.SetTargetProperty(da, new PropertyPath("(Canvas.Top)"));
                Storyboard.SetTarget(da, cp);
                sb.Begin();           
            }
        }

它工作得很好,但我发现如果高度更大,那么运动就会更快。

所以我需要意识到两件事:

一些速度范围值,即 1-100(非常慢 - 超快),在内部我需要一些公式/系数来做到这一点。

我用静态速度和不同的高度做了一些实验,得到了一些桌子。

在此处输入图像描述

请帮我弄清楚我必须做哪些计算才能设置速度范围(1-100),它应该可以正常工作,无论 StackPanel 高度

谢谢你们!

4

2 回答 2

3

我不确定您是否应该对比率(StackPanel Height / ContentControl Height)感兴趣,而只是对差异(StackPanel Height - ContentControl Height)感兴趣。

假设您希望您的速度为每秒 30 像素(实际上相当慢,但只是从上面的“速度”值开始)。您可能有兴趣根据以每秒 30 个像素的速率覆盖像素距离(高度差)所需的秒数来设置持续时间。

所以你只需要:

var duration = TimeSpan.FromSeconds((thisHeight - contentControlHeight) / pixelPerSecondSpeed);

这就是你如何让速度保持不变。

于 2012-05-15T12:49:53.450 回答
2

您需要标准化动画的持续时间。因此,假设堆栈面板高度与内容控件高度的比率为0.5,持续N秒数被认为是“正常速度”(您应该决定N此时是什么)。

所以现在假设有一些R不同的比率0.5,我们想找出动画持续时间应该是多少。这很容易:

var duration = TimeSpan.FromSeconds(N * R / 0.5);

假设您也想使用标准化的持续时间比例。假设在这个线性刻度上,100 对应于“正常”速度;假设数字越小,动画越快,所以 1 是“几乎瞬间”,而 200 是“正常速度的一半”。我们称之为标准化的持续时间norm。然后你会有:

var absoluteDuration = TimeSpan.FromSeconds(N * R / 0.5);
var normalizedDuration = absoluteDuration.Seconds * norm / 100;
于 2012-05-15T12:41:04.233 回答