9

以下のコードが機能しないように見える理由を見つけようとしています。エラーは発生しません-単にスケーリングしません。2 番目のコード サンプルのように変更すると、実際に機能するように見えます。誰でも思いつきましたか?

ありがとう

public static void StartMouseEnterAnimation(Button button)
    {
        Storyboard storyboard = new Storyboard();

        ScaleTransform scale = new ScaleTransform(1.0, 1.0, 1, 1);
        button.RenderTransformOrigin = new Point(0.5, 0.5);
        button.RenderTransform = scale;

        DoubleAnimation growAnimation = new DoubleAnimation();
        growAnimation.Duration = TimeSpan.FromMilliseconds(300);
        growAnimation.From = 1;
        growAnimation.To = 1.8;
        storyboard.Children.Add(growAnimation);

        Storyboard.SetTargetProperty(growAnimation, new PropertyPath(ScaleTransform.ScaleXProperty));
        Storyboard.SetTarget(growAnimation, scale);

        storyboard.Begin();
    }

--- 次は動作しますが、TransformGroup を作成し、より複雑な PropertyChain を介してこれを参照する必要がありました...

public static void StartMouseEnterAnimation(Button button)
    {    
        Storyboard storyboard = new Storyboard();            
        ScaleTransform scale = new ScaleTransform(1.0, 1.0, 1, 1);
        button.RenderTransformOrigin = new Point(0.5, 0.5);
        TransformGroup myTransGroup = new TransformGroup();
        myTransGroup.Children.Add(scale);
        button.RenderTransform = myTransGroup;

        DoubleAnimation growAnimation = new DoubleAnimation();
        growAnimation.Duration = TimeSpan.FromMilliseconds(100);
        //growAnimation.From = 1;
        growAnimation.To = 1.1;
        storyboard.Children.Add(growAnimation);

        DependencyProperty[] propertyChain = new DependencyProperty[]
        {
            Button.RenderTransformProperty, 
            TransformGroup.ChildrenProperty,
            ScaleTransform.ScaleXProperty
        };
        string thePath = "(0).(1)[0].(2)";
        PropertyPath myPropertyPath = new PropertyPath(thePath, propertyChain);
        Storyboard.SetTargetProperty(growAnimation, myPropertyPath);
        Storyboard.SetTarget(growAnimation, button);

        storyboard.Begin();
   }
4

2 に答える 2

27

最初のコードサンプルを次のように微調整することで、機能させることができました。

public static void StartMouseEnterAnimation(Button button) {
    Storyboard storyboard = new Storyboard();

    ScaleTransform scale = new ScaleTransform(1.0, 1.0);
    button.RenderTransformOrigin = new Point(0.5, 0.5);
    button.RenderTransform = scale;

    DoubleAnimation growAnimation = new DoubleAnimation();
    growAnimation.Duration = TimeSpan.FromMilliseconds(300);
    growAnimation.From = 1;
    growAnimation.To = 1.8;
    storyboard.Children.Add(growAnimation);

    Storyboard.SetTargetProperty(growAnimation, new PropertyPath("RenderTransform.ScaleX"));
    Storyboard.SetTarget(growAnimation, button);

    storyboard.Begin();
}

の代わりにnew PropertyPath(ScaleTransform.ScaleXProperty))を使用new PropertyPath("RenderTransform.ScaleX"))し、ストーリーボードのターゲットをボタンに設定しました (scaleTransform 自体ではありません)。

それが役立つことを願っています!

于 2010-07-13T08:51:43.997 に答える
3

変換グループがある場合に、ScaleTransform で 2 つの異なる方向にアニメートする方法の例を次に示します。パス文字列は、アニメーション化されている部分を示します。また、Canvas はフリーズ可能であるため、RegisterName. (これが何を意味するのかわかりませんが、必要です)

        var storyBoard = new Storyboard();
        var group = new TransformGroup();
        var scale = new ScaleTransform(Zoom, Zoom);
        group.Children.Add(scale);
        group.Children.Add(new TranslateTransform(_translateX,_translateY));
        MainCanvas.RenderTransform = group;

        RegisterName("MainCanvas",MainCanvas);

        var growAnimation = new DoubleAnimation();
        growAnimation.Duration = TimeSpan.FromMilliseconds(1000);
        growAnimation.From = _oldZoom;
        growAnimation.To = Zoom;
        storyBoard.Children.Add(growAnimation);

        var growAnimation2 = new DoubleAnimation();
        growAnimation2.Duration = TimeSpan.FromMilliseconds(1000);
        growAnimation2.From = _oldZoom;
        growAnimation2.To = Zoom;

        storyBoard.Children.Add(growAnimation2);

        string thePath = "(0).(1)[0].(2)"; // Not used - just to show the syntax


        Storyboard.SetTargetProperty(growAnimation, new PropertyPath("RenderTransform.Children[0].ScaleX"));
        Storyboard.SetTargetProperty(growAnimation2, new PropertyPath("RenderTransform.Children[0].ScaleY"));
        Storyboard.SetTargetName(growAnimation, "MainCanvas");
        Storyboard.SetTargetName(growAnimation2,"MainCanvas");
        storyBoard.Begin(this);
于 2012-10-23T05:27:09.747 に答える