在代码隐藏中设置Storyboard.SetTargetProperty

时间:2018-03-14 19:34:36

标签: c# wpf storyboard code-behind

我遇到的问题当然非常简单,但我是编码C#的初学者,我根本无法理解代码失败的原因。

我想为形状设置动画,并可以选择将属性作为参数传入。 I.o.w。:我想使用变量指定动画属性(路径)。

这导致我尝试以下方法:

public static class HelperExtension
{
    public static void Animate(this UIElement target, string propertyToAnimate, double? from, double to, int duration = 3000, int startTime = 0)
    {
        var doubleAni = new DoubleAnimation
        {
            To = to,
            From = from,
            Duration = TimeSpan.FromMilliseconds(duration)
        };

        Storyboard.SetTarget(doubleAni, target);
        PropertyPath myPropertyPath; 

        // option 1: fails:
        string _mypropertypathvariablestring = "Rectangle.Width";
        myPropertyPath = new PropertyPath(_mypropertypathvariablestring); 

        // option 2: succeeds:
        myPropertyPath = new PropertyPath("(Rectangle.Width)");         

        Storyboard.SetTargetProperty(doubleAni, myPropertyPath);


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

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

编译成功,但执行会抛出异常消息:

  

System.InvalidOperationException:无法解析所有属性   属性路径中的引用'" Rectangle.Width"'

sb.Begin();

我不明白选项1和2是如何不同的(这意味着不同时实施)。

有人可以告诉我我误解了什么吗?很可能是s.th.在概念层面

也许提供一个提示如何最好地使用new PropertyPath()中的变量?

1 个答案:

答案 0 :(得分:1)

@ Clemens:完美,这解决了我的问题,从我的角度来看是答案。

我查找了将评论标记为答案的选项,但显然有一个原因(Mark a comment as answer to a question)没有。 如果主持人可以选择将Clemens评论标记为答案并同意,我认为这是获得它的正确方法。

暂时重述我相信从克莱门斯的评论中学到的东西:

有效的语法:

myPropertyPath = new PropertyPath("(Rectangle.Width)");
string _mypropertypathvariablestring = "(Rectangle.Width)"; 
string _mypropertypathvariablestring = "Width";

失败的语法:

myPropertyPath = new PropertyPath("Rectangle.Width");
string _mypropertypathvariablestring = "Rectangle.Width";

I.o.w。无论何时在PropertyPath中指定类型,它都要求使用括号来表示“部分限定”,并且该类型要在默认XML命名空间内,如Rectangle那样。 在所有其他情况下,只有财产本身就足够了。

由于我尝试实现纯CodeBehind解决方案,我没有考虑“PropertyPath XAML Syntax”,并坚持使用“PropertyPath Class”,这更简洁,不涉及“paranthesis”语法

但我最初的错误是误解,即PropertyPath必须包含属性(链)附加的对象,由工作语法选项提供支持

myPropertyPath = new PropertyPath("(Rectangle.Width)");

我通过反复试验发现,但没有理解括号的含义。

感谢您指出在不使用故事板的情况下实现动画的选项,并通过BeginAnimation提出更好的实现选项。

再次感谢!