我正忙着用Silverlight制作一个时钟。我正在尝试以编程方式设置动画代码,因为我想为3个时钟指针重复使用相同的代码(我不认为我可以在xaml中使用单个故事板来执行此操作)。
public void Rotate(double toAngle, RotateTransform rotate)
{
Storyboard sb = new Storyboard();
DoubleAnimationUsingKeyFrames keyframes = new DoubleAnimationUsingKeyFrames();
EasingDoubleKeyFrame easingStart = new EasingDoubleKeyFrame();
easingStart.KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromSeconds(0));
easingStart.Value = rotate.Angle;
EasingDoubleKeyFrame easingEnd = new EasingDoubleKeyFrame();
easingEnd.KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromSeconds(0.5));
easingEnd.Value = toAngle;
var ease = new ElasticEase();
ease.EasingMode = EasingMode.EaseIn;
easingEnd.EasingFunction = ease;
keyframes.KeyFrames.Add(easingStart);
keyframes.KeyFrames.Add(easingEnd);
Storyboard.SetTarget(keyframes, rotate);
Storyboard.SetTargetProperty(keyframes, new PropertyPath("(RotateTransform.Angle)"));
sb.Children.Add(keyframes);
sb.Begin();
}
我传入我希望当前指针旋转到的角度以及该指针的旋转变换。从这个旋转变换我得到起始角度。
当我运行时钟时,时钟指针移动(秒针每秒移动到正确的位置等)但动画似乎实际上没有动画。他们只是立即从头到尾。
为什么动画没有正确发生?
答案 0 :(得分:1)
跳过问题可能是启动想要在不到一秒钟内显示变化的故事板的滞后。当故事板准备好显示时,它基本上说“哦......现在是1秒后,应该我现在”。使用更长的故事板你会更好。
我不确定你对时钟的控制程度有多大,但是对于使用单个故事板,这里有...
我不确定您要解决的整体问题,但以下示例使用一个简单的故事板来运行时钟的3个指针。我唯一的问题是我可以为时针指定的最大时间间隔(在XAML中),没有解析错误,是23:59:59。
<Storyboard x:Name="SecondHandStoryboard" RepeatBehavior="Forever">
<DoubleAnimation Duration="0:1:0" To="360" Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.Rotation)" Storyboard.TargetName="SecondHand" />
<DoubleAnimation Duration="1:0:0" To="360" Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.Rotation)" Storyboard.TargetName="MinuteHand"/>
<DoubleAnimation Duration="23:59:59" To="360" Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.Rotation)" Storyboard.TargetName="HourHand"/>
</Storyboard>
我实际上想要为秒针添加一个可靠的“滴答”动画,但还没有弄清楚如何通过“故事板”来实现旋转。基本上使用重复的每秒6度1秒长的故事板和陡峭的缓和(将继续研究这个问题)。
无论如何,希望这对你有所帮助。