WPF-使用故事板的C#椭圆几何动画

WPF-使用故事板的C#椭圆几何动画,c#,wpf,storyboard,scaletransform,wpf-animation,C#,Wpf,Storyboard,Scaletransform,Wpf Animation,我需要用ScaleTransform在C#中缩放椭圆梯度,但它不起作用。 代码如下: XAML: 情节提要_Completed事件被触发,但椭圆曲线上没有动画 问题在哪里 我只能通过以下方式设置椭圆几何的动画: DoubleAnimation scale = new DoubleAnimation(); scale.From = 0; scale.To = 40; scale.Duration = new Duration(TimeSpan.FromMilliseconds(5000)); ro

我需要用ScaleTransform在C#中缩放椭圆梯度,但它不起作用。 代码如下:

XAML:

情节提要_Completed事件被触发,但椭圆曲线上没有动画

问题在哪里

我只能通过以下方式设置椭圆几何的动画:

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);
我需要把这个双重动画放在故事板上,但我不知道怎么做


谢谢。

如果您使用图像控件(而不是几何体)作为目标元素,它会起作用:

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

但是,最简单的方法可能是命名ScaleTransform

<EllipseGeometry.Transform>
    <ScaleTransform x:Name="scale"/>
</EllipseGeometry.Transform>

编辑:为了通过情节提要为
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();

感谢Clemens,它使用图像控件作为目标。如何更改渲染变换原点?我尝试了
,但它不起作用。因此,我更改了CenterX/Y
,这样动画将正确结束(在400x300图像的中间),但从图像的左上角开始(而不是中间)。如何更改渲染变换原点(可能使用0..1值)?谢谢你的帮助。现在还不清楚你到底想要实现什么。首先,不设置渲染变换的动画,而是剪辑几何体的变换。如果要保持剪辑几何体的中心,不应设置几何体变换的动画,而应设置其半径X和半径Y的动画(如您所做)。是的,我要保持剪辑几何体的中心。使用
rockClip.BeginAnimation(EllipseGeometry.RadiusXProperty,scale)
效果很好,但我不知道如何将此动画放入故事板中。我怎样才能做到这一点?谢谢我将ScaleTransform放在TransformGroup:
中,但我不知道如何设置target属性。我尝试了以下方法:
Storyboard.SetTargetProperty(scaleX,newPropertyPath(((Clip.Transform)。(TransformGroup.Children)[0]((ScaleTransform.ScaleY)”)
,但它不起作用。问题出在哪里?是否可以设置剪辑不透明度的动画?我尝试了
Storyboard.SetTarget(淡入淡出,目标);Storyboard.SetTargetProperty(淡入淡出,新属性路径(“Clip.Opacity”)(其中淡入是双动画,目标是图像),但它不起作用。
<EllipseGeometry.Transform>
    <ScaleTransform x:Name="scale"/>
</EllipseGeometry.Transform>
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);
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();