[英]WPF - EllipseGeometry animation in C# using a Storyboard
I need to scale an EllipseGeometry in C# with ScaleTransform, but it doesn't works. 我需要使用ScaleTransform在C#中缩放EllipseGeometry,但它不起作用。 Here's the code:
这是代码:
XAML: XAML:
<Image x:Name="rock" Stretch="None">
<Image.Clip>
<EllipseGeometry x:Name="rockClip" RadiusX="100" RadiusY="100" Center="200,150">
<EllipseGeometry.Transform>
<ScaleTransform/>
</EllipseGeometry.Transform>
</EllipseGeometry>
</Image.Clip>
</Image>
C#: C#:
DoubleAnimation scaleX = new DoubleAnimation();
scaleX.BeginTime = TimeSpan.FromMilliseconds(fromMills);
scaleX.Duration = new Duration(TimeSpan.FromMilliseconds(2000));
scaleX.From = 0.0;
scaleX.To = 1.0;
scaleX.SetValue(Storyboard.TargetProperty, rockClip);
scaleX.SetValue(Storyboard.TargetPropertyProperty, new PropertyPath("(EllipseGeometry.Transform).(ScaleTransform.ScaleX)"));
DoubleAnimation scaleY = new DoubleAnimation();
scaleY.BeginTime = TimeSpan.FromMilliseconds(fromMills);
scaleY.Duration = new Duration(TimeSpan.FromMilliseconds(2000));
scaleY.From = 0.0;
scaleY.To = 1.0;
scaleY.SetValue(Storyboard.TargetProperty, rockClip);
scaleY.SetValue(Storyboard.TargetPropertyProperty, new PropertyPath("(EllipseGeometry.Transform).(ScaleTransform.ScaleY)"));
Storyboard storyboard = new Storyboard();
storyboard.Children.Add(scaleX);
storyboard.Children.Add(scaleY);
storyboard.Completed += storyboard_Completed;
animation.Begin();
The storyboard_Completed event is triggered but there is no animation on the EllipseGeometry. 触发了storyboard_Completed事件,但EllipseGeometry上没有动画。
Where is the problem? 问题出在哪儿?
I can animate the EllipseGeometry only in this way: 我只能以这种方式为EllipseGeometry设置动画:
DoubleAnimation scale = new DoubleAnimation();
scale.From = 0;
scale.To = 40;
scale.Duration = new Duration(TimeSpan.FromMilliseconds(5000));
rockClip.BeginAnimation(EllipseGeometry.RadiusXProperty, scale);
rockClip.BeginAnimation(EllipseGeometry.RadiusYProperty, scale);
I need to put this DoubleAnimation in a Storyboard, but I don't know how. 我需要将这个DoubleAnimation放在故事板中,但我不知道如何。
Thanks. 谢谢。
It works if you use the Image control (instead of the Geometry) as target element: 如果您使用Image控件(而不是Geometry)作为目标元素,它可以工作:
var scaleX = new DoubleAnimation();
scaleX.BeginTime = TimeSpan.FromMilliseconds(fromMills);
scaleX.Duration = TimeSpan.FromSeconds(2);
scaleX.From = 0.0;
scaleX.To = 1.0;
Storyboard.SetTarget(scaleX, rock);
Storyboard.SetTargetProperty(scaleX, new PropertyPath("Clip.Transform.ScaleX"));
var scaleY = new DoubleAnimation();
scaleY.BeginTime = TimeSpan.FromMilliseconds(fromMills);
scaleY.Duration = TimeSpan.FromSeconds(2);
scaleY.From = 0.0;
scaleY.To = 1.0;
Storyboard.SetTarget(scaleY, rock);
Storyboard.SetTargetProperty(scaleY, new PropertyPath("Clip.Transform.ScaleY"));
var storyboard = new Storyboard();
storyboard.Children.Add(scaleX);
storyboard.Children.Add(scaleY);
storyboard.Begin();
However, the most simply way may be to name the ScaleTransform 但是,最简单的方法可能是命名ScaleTransform
<EllipseGeometry.Transform>
<ScaleTransform x:Name="scale"/>
</EllipseGeometry.Transform>
and run the animations like this: 并运行这样的动画:
var scaleAnimation = new DoubleAnimation
{
BeginTime = TimeSpan.FromMilliseconds(fromMills),
Duration = TimeSpan.FromSeconds(2),
From = 0.0,
To = 1.0
};
scale.BeginAnimation(ScaleTransform.ScaleXProperty, scaleAnimation);
scale.BeginAnimation(ScaleTransform.ScaleYProperty, scaleAnimation);
EDIT: In order to animate the RadiusX
and RadiusY
properties by means of a Storyboard, you could write this: 编辑:为了通过Storyboard为
RadiusX
和RadiusY
属性设置动画,你可以这样写:
var radiusXAnimation = new DoubleAnimation();
radiusXAnimation.BeginTime = TimeSpan.FromMilliseconds(fromMills);
radiusXAnimation.Duration = TimeSpan.FromSeconds(2);
radiusXAnimation.From = 0;
radiusXAnimation.To = 100;
Storyboard.SetTarget(radiusXAnimation, rock);
Storyboard.SetTargetProperty(radiusXAnimation, new PropertyPath("Clip.RadiusX"));
var radiusYAnimation = new DoubleAnimation();
radiusYAnimation.BeginTime = TimeSpan.FromMilliseconds(fromMills);
radiusYAnimation.Duration = TimeSpan.FromSeconds(2);
radiusYAnimation.From = 0;
radiusYAnimation.To = 100;
Storyboard.SetTarget(radiusYAnimation, rock);
Storyboard.SetTargetProperty(radiusYAnimation, new PropertyPath("Clip.RadiusY"));
var storyboard = new Storyboard();
storyboard.Children.Add(radiusXAnimation);
storyboard.Children.Add(radiusYAnimation);
storyboard.Begin();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.