Storyboard.SetTargetProperty在Windows Phone 8.1下无法正常工作?

时间:2014-12-26 04:15:04

标签: c# animation storyboard windows-phone-8.1

我在Windows Phone 7的gesture example app I found online中使用了以下扩展方法。我正在尝试将其迁移到8.1以用于我的应用,但是遇到了Storyboard.SetTargetProperty的问题方法调用。它似乎是Windows 8.1中的this signature is not supported

我对Windows Phone开发一般都很陌生,并且不确定我应该使用什么代替这个,有人能指出我在API中提供了一个方法,它提供了什么吗?现在签名现在需要一个字符串,以前允许使用PropertyPath。我不确定将DP属性转换为表示它的字符串需要做什么,将字符串设置为DP属性的名称是否有效?

public static void Animate(this DependencyObject target, double from, double to,
                        object propertyPath, int duration, int startTime,
                        Action completed = null)
{
    var db = new DoubleAnimation();
    db.To = to;
    db.From = from;
    db.EasingFunction = new SineEase();
    db.Duration = TimeSpan.FromMilliseconds(duration);
    Storyboard.SetTarget(db, target);

    // Compiler error: This method signature is no longer supported.
    Storyboard.SetTargetProperty(db, new PropertyPath(propertyPath));

    var sb = new Storyboard();
    sb.BeginTime = TimeSpan.FromMilliseconds(startTime);

    if (completed != null)
    {
        sb.Completed += (s, e) => completed();
    }

    sb.Children.Add(db);
    sb.Begin();
}

像这样调用

TranslateTransform elementTrans = new TranslateTransform();
elementTrans.Animate(0, elementOffset, TranslateTransform.YProperty, 200, startTime, null, action);

不确定如何将TranslateTransform.YProperty转换为可以传入SetTargetProperty来电的字符串。

修改

have found some documentation on MSDN显示如何通过字符串传递属性名称。我不认为我正确提供它,因为我得到一个运行时异常,它找不到提供的属性。

        transform.Animate(transform.X, 0, "(FrameworkElement.RenderTransform).(TranslateTransform.XProperty)", 300, 0, new BounceEase()
        {
            Bounciness = 5,
            Bounces = 2
        });

请注意,我更改了方法签名以接受propertyPath的字符串而不是对象,但在此处没有反映出来,因为我希望将原始来源保留在原始帖子之上。

RenderTransform设置为TranslateTransform,如下所示:

    public static void SetHorizontalOffset(this FrameworkElement element, double offset)
    {
        var transform = new TranslateTransform { X = offset };
        element.RenderTransform = transform;
        element.Tag = new Offset { Value = offset, Transform = transform };
    }

1 个答案:

答案 0 :(得分:0)

您不需要指定完整的属性路径。只需X而不是整个(FrameworkElement.RenderTransform).(TranslateTransform.XProperty)

e.g。

transform.Animate(transform.X, 0, "X", 300, 0, new BounceEase()
{
    Bounciness = 5,
    Bounces = 2
});