4

これはアニメーション関連の可能性があります。幅と高さをいくつかの異なるストーリーボードでアニメーション化する WPF コントロールがあります。ストーリーボードを作成し、それに対して Begin() を呼び出します。ストーリーボードがどのように見えるかを示すコードを以下に示します。

アニメーション化された値とは異なるように、何らかのイベント (ウィンドウのサイズ変更など) でコントロールのサイズを再評価したいと考えています。Widthコントロールの プロパティとプロパティを設定して、(アニメーションの実行後に) SizeChanged でこれを手動で処理しようとしましたHeight。デバッガーは、これらの値が設定されていないことを示します (元の値が残ります)。

Snoop を使用して WPF を調べると、幅と高さの行がピーチ/オレンジ色で強調表示され、再度値を設定しようとしても保持されません (フォーカスを外すと元の値が表示されます。私の推測では、アニメーションはプロパティへの手動変更を何らかの形でオーバーライドしていますが、これが本当かどうか、または解決方法がわかりません。

ストーリーボード クラス

public class MyAnimationClass
{
    private Storyboard _myStoryboard;
    private DoubleAnimation _animation1;
    private DoubleAnimation _animation2;
    private DoubleAnimation _animation3;

    private void InitializeStoryboard()
    {
        _myStoryboard = CreateMyStoryboard(out _animation1, out _animation2, out _animation3);
    }

    private Storyboard CreateMyStoryboard(out DoubleAnimation animation1, out DoubleAnimation animation2, out DoubleAnimation animation3)
    {
        var myStoryboard = new Storyboard();

        // create animations
        animation1 = new DoubleAnimation { Duration = new TimeSpan(0, 0, 0, 0, 250), From = 0, To = 0 };
        animation2 = new DoubleAnimation { BeginTime = new TimeSpan(), Duration = new TimeSpan(0, 0, 0, 0, 250), From = 35, To = 35 };
        animation3 = new DoubleAnimation { BeginTime = new TimeSpan(0, 0, 0, 0, 250), Duration = new TimeSpan(0, 0, 0, 0, 250), From = 35, To = 0 };

        Storyboard.SetTargetProperty(animation1, new PropertyPath(FrameworkElement.WidthProperty));
        Storyboard.SetTargetProperty(animation2, new PropertyPath(FrameworkElement.HeightProperty));
        Storyboard.SetTargetProperty(animation3, new PropertyPath(FrameworkElement.HeightProperty));

        myStoryboard.Children.Add(animation1);
        myStoryboard.Children.Add(animation2);
        myStoryboard.Children.Add(animation3);

        return myStoryboard;
    }

    public void Animate(Control controlToAnimate)
    {
        // ....

        var finalWidth = CalculateFinalWidth();
        var finalHeight = CalculateFinalHeight();

        _animation1.To = finalWidth;
        _animation3.To = finalHeight;
        _myStoryboard.Begin(controlToAnimate);
    }
}

何かをアニメーション化したいときは、自分のクラスAnimate()のインスタンスを呼び出します。MyAnimationClass

考え?

4

1 に答える 1

2

これは非常に簡単な修正になりました。FillBehaviorプロパティ値を制御しているため、値は変化していませんでした。FillBehavior.Stopただし、アニメーション以外のコードで幅/高さを設定すると、次にアニメーションを実行すると、必要な幅/高さにアニメーション化され、デフォルトで設定された高さに戻るため、単純に変更しても問題は解決しませんでした。これは、計算後、アニメーションの前にコントロールの幅/高さを設定することで解決されました。

public void Animate(Control controlToAnimate)
{
    // ....

    var finalWidth = CalculateFinalWidth();
    var finalHeight = CalculateFinalHeight();

    // set values here so after animation they stay
    controlToAnimate.Width = finalWidth;
    controlToAnimate.Height = finalHeight;

    _animation1.To = finalWidth;
    _animation3.To = finalHeight;
    _myStoryboard.Begin(controlToAnimate);
}
于 2013-09-26T20:12:49.973 に答える