我正在开发一个 Windows Phone 应用程序,但我相信这也适用Silverlight
。我想创建一个Storyboard
(现在我在我的代码隐藏页面中将其创建为全局变量以进行测试)将 aRectangle
的Fill
属性从透明更改为红色,然后再恢复为透明。我将Storyboard
在多个矩形中重新使用它,所以我希望能够Begin()
从代码隐藏中访问它和它。我找不到任何这样的例子,所以我试了一下我认为可行的方法。
最初设定:
sb = new Storyboard();
turnOn= new ColorAnimation();
turnOn.From = Colors.Transparent;
turnOn.To = Colors.Red;
turnOn.Duration = new TimeSpan(0, 0, 0, 0, 500); //half second
turnOff= new ColorAnimation();
turnOff.From = Colors.Red;
turnOff.To = Colors.Transparent;
turnOff.Duration = new TimeSpan(0, 0, 0, 0, 500); //half second
Storyboard.SetTargetProperty(turnOn, new PropertyPath("(Rectangle.Fill)"));
Storyboard.SetTargetProperty(turnOff, new PropertyPath("(Rectangle.Fill)"));
sb.Children.Add(turnOn);
sb.Children.Add(turnOff);
canvas.Resources.Add("sb", sb); // this is the canvas where the rectangles will be
然后,在任何时候,如果我有一个Rectangle
实例,它将在Canvas
上面,我想启动情节提要 - 它会变成Rectangle
红色,然后变回透明:
// Set the target to my current rectangle, and begin:
Storyboard.SetTarget(turnOn, myRectangle);
Storyboard.SetTarget(turnOn, myRectangle);
sb.Begin();
但是,它会抛出以下异常sb.Begin()
:
用户代码未处理 InvalidOperationException System.Windows.ni.dll 中出现“System.InvalidOperationException”类型的异常,但未在用户代码中处理
我希望我的想法不会太远,但也许有更简单的方法?如果没有,谁能看到我做错了什么?
更新(解决方案):
我遵循@Josh Mackey 提供的示例并将我Storyboard
的XAML
页面移到我认为无论如何都会更干净的页面中。我之前没有注意到的是异常详细信息,指出“ColorAnimation 由于类型不兼容而不能用于动画属性 Fill”。通过将我的更改ColorAnimation
为ColorAnimationUsingKeyFrames
. 新代码:
<Canvas.Resources>
<Storyboard x:Name="sb">
<ColorAnimationUsingKeyFrames
Storyboard.TargetProperty="(Rectangle.Fill).(SolidColorBrush.Color)"
AutoReverse="True">
<EasingColorKeyFrame KeyTime="00:00:0" Value="Black" />
<EasingColorKeyFrame KeyTime="00:00:0.25" Value="Red" />
</ColorAnimationUsingKeyFrames>
</Storyboard>
</Canvas.Resources>
我只能使用一个动画,因为我可以设置AutoReverse
为True
,我发现这篇文章描述了如何Storyboard
在我的代码隐藏中访问,如下所示:
sb.Stop();
sb.SetValue(Storyboard.TargetNameProperty, myRectangle.Name);
sb.Begin();
现在它按预期工作!