1

我有以下有效的方法。我想把它放在一个返回故事板的实用方法中。我将其转换为故事板的每一次尝试都失败了,我花了很多时间进行研究。除非有人来救我,否则我准备放弃。

这是我要转换的代码:

public override void Begin(FrameworkElement element, int duration)
{
    var transform = new ScaleTransform();
    element.LayoutTransform = transform;

    var animation = new DoubleAnimation
                        {
                            From = 1,
                            To = 0,
                            Duration = TimeSpan.FromMilliseconds(duration),
                            FillBehavior = FillBehavior.Stop,
                            EasingFunction = new QuinticEase { EasingMode = EasingMode.EaseIn }
                        };

    transform.BeginAnimation(ScaleTransform.ScaleXProperty, animation);
    transform.BeginAnimation(ScaleTransform.ScaleYProperty, animation);
}

因此,我想返回一个 Storyboard,而不是两个 BeginAnimation() 调用,所以我所要做的就是调用 storyboard.Begin()。我知道这应该不难做到,但我就是不明白。

谢谢。

编辑:响应 HB 的建议,我尝试了以下代码,但仍然无法正常工作:

private static Storyboard CreateAnimationStoryboard(FrameworkElement element, int duration)
{
    var sb = new Storyboard();
    var scale = new ScaleTransform(1, 1);
    element.RenderTransform = scale;
    element.RegisterName("scale", scale);

    var animation = new DoubleAnimation
    {
        From = 1,
        To = 0,
        Duration = TimeSpan.FromMilliseconds(duration),
        FillBehavior = FillBehavior.Stop,
        EasingFunction = new QuinticEase { EasingMode = EasingMode.EaseIn }
    };
    sb.Children.Add(animation);

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

    return sb;
}

我知道我只为 X 轴设置了动画——只是想先让一些东西工作。

4

2 回答 2

0

您需要两个动画,然后使用和将附加Storyboard属性设置为对正确对象的正确属性进行动画处理。SetTargetPropertySetTargetName

由于情节提要的工作方式,您还需要设置名称范围 ( NameScope.SetNameScope),注册转换的名称,并StoryBoard.Begin使用包含元素重载进行调用。

例如

NameScope.SetNameScope(element, new NameScope());

var transform = new ScaleTransform();
var transformName = "transform";
element.RegisterName(transformName, transform);
element.RenderTransform = transform;

var xAnimation = new DoubleAnimation(2, TimeSpan.FromSeconds(1));
var yAnimation = xAnimation.Clone();

var storyboard = new Storyboard()
{
    Children = { xAnimation, yAnimation }
};

Storyboard.SetTargetProperty(xAnimation, new PropertyPath("(ScaleTransform.ScaleX)"));
Storyboard.SetTargetProperty(yAnimation, new PropertyPath("(ScaleTransform.ScaleY)"));

Storyboard.SetTargetName(xAnimation, transformName);
Storyboard.SetTargetName(yAnimation, transformName);

storyboard.Begin(element);
于 2012-07-29T17:20:27.260 回答
0

我建议使用Expression Blend并从那里开始录制,它应该在 XAML 中创建您的故事板。而不是用 C# 对其进行硬编码并尝试将其一一翻译到情节提要,因此它可能是一个容易出错的错误。

于 2012-07-30T01:05:45.553 回答