以编程方式在C#中使用缓动创建silverlight动画

时间:2010-08-22 03:32:18

标签: c# silverlight-4.0

我正忙着用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();
    }

我传入我希望当前指针旋转到的角度以及该指针的旋转变换。从这个旋转变换我得到起始角度。

当我运行时钟时,时钟指针移动(秒针每秒移动到正确的位置等)但动画似乎实际上没有动画。他们只是立即从头到尾。

为什么动画没有正确发生?

1 个答案:

答案 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秒长的故事板和陡峭的缓和(将继续研究这个问题)。

无论如何,希望这对你有所帮助。