在代码问题中应用动画ScaleTransform

我试图找出为什么下面的代码似乎不起作用。 它没有给出错误 – 它根本不会缩放。 如果我将其更改为我的第二个代码示例,它实际上似乎有效。 有人有任何想法吗?

谢谢

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

—下面的DOES工作,但我必须创建一个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(); } 

通过调整你的第一个代码示例,我能够让它工作:

 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("RenderTransform.ScaleX"))而不是new PropertyPath(ScaleTransform.ScaleXProperty)) ,并将故事板的目标设置为按钮(而不是scaleTransform本身)。

希望有所帮助!

下面是一个如何在ScaleTransform上为两个不同方向设置动画的示例,当您有一个变换组时。 路径字符串显示正在设置动画的部分。 此外,因为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);