我遇到的问题当然非常简单,但我是编码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()
中的变量?
答案 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提出更好的实现选项。
再次感谢!