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();           
            }
        }

正常に動作しますが、高さが大きいほど動きが速いことがわかりました。

だから私は2つのことを実現する必要があります:

いくつかの速度範囲の値、つまり 1 ~ 100 (非常に遅い - 超高速) があり、内部的にはそれを行うための数式/係数が必要です。

静的速度とさまざまな高さでいくつかの実験を行い、いくつかのテーブルを取得しました。

ここに画像の説明を入力

速度範囲(1〜100)を設定するためにどの計算を行う必要があるかを 理解するのを手伝ってください。StackPanel 高さに関係なく正常に動作するはずです。

君たちありがとう!

4

2 に答える 2

3

比率(StackPanelの高さ/ ContentControlの高さ)ではなく、単に違い(StackPanelの高さ-ContentControlの高さ)に関心があるかどうかはわかりません。

速度を毎秒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 に答える