围绕C#代码的元素原点旋转动画



我有一个XAML代码,它为元素的旋转变换的角度属性设置动画:

<Canvas.RenderTransform>
<RotateTransform Angle="0" 
x:Name="MyAnimatedTransform"/>
</Canvas.RenderTransform>
<Canvas.Triggers>
<EventTrigger RoutedEvent="Loaded">
<BeginStoryboard>
<Storyboard>
<DoubleAnimation                 Storyboard.TargetName="MyAnimatedTransform"
Storyboard.TargetProperty="(RotateTransform.Angle)"
From="0.0"
To="90"
Duration="0:0:1" />
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Canvas.Triggers>

从那以后,我一直在尝试将其转换为C#代码,但出于某种原因,我认为我错过了一些东西。。。

代码:

public void AnimateElement(RotateTransform element, UIElement control, double degreesTo, double secDuration)
{
DoubleAnimation OriginAnimatorDoubleAnimation = new DoubleAnimation()
{
From = 0,
To = degreesTo,
Duration = TimeSpan.FromSeconds(secDuration)
};
Storyboard.SetTargetProperty(element, new PropertyPath("RotateTransform.Angle"));
Storyboard.SetTarget(element, OriginAnimatorDoubleAnimation);
Storyboard storyboard = new Storyboard();
storyboard.Duration = TimeSpan.FromSeconds(secDuration);
storyboard.Children.Add(OriginAnimatorDoubleAnimation);
storyboard.Begin();
}

有人能告诉我我做错了什么吗?

谢谢,

这不是XAML的确切等价物,但您不需要代码背后的情节提要。

public void RotateElement(UIElement element, double degreesTo, double secDuration)
{
if (element.RenderTransform is RotateTransform transform)
{
var animation = new DoubleAnimation
{
To = degreesTo,
Duration = TimeSpan.FromSeconds(secDuration)
};
transform.BeginAnimation(RotateTransform.AngleProperty, animation);
}
}

请注意,元素的RenderTransform中仍然必须有一个RotateTransform。如果不是这样,这将把它放在适当的位置:

public void RotateElement(UIElement element, double degreesTo, double secDuration)
{
var transform = element.RenderTransform as RotateTransform;
if (transform == null)
{
transform = new RotateTransform();
element.RenderTransform = transform;
element.RenderTransformOrigin = new Point(0.5, 0.5);
}
var animation = new DoubleAnimation
{
To = degreesTo,
Duration = TimeSpan.FromSeconds(secDuration)
};
transform.BeginAnimation(RotateTransform.AngleProperty, animation);
}

这对我有效:

public void RotateElement(RotateTransform transform, double degreesTo, double secDuration)
{
var animation = new DoubleAnimation
{
To = degreesTo,
Duration = TimeSpan.FromSeconds(secDuration)
};
transform.BeginAnimation(RotateTransform.AngleProperty, animation);
}

不过谢谢!