没有DispatcherTimer的Silverlight动画

时间:2011-05-04 11:51:17

标签: c# animation silverlight-3.0

我正在尝试使用Silverlight学习一些基本动画。我试图创建一个Resilience Rectange

挑战在于:我希望在没有DispatcherTimer的情况下创建它。你能帮我解决XAML和C#代码吗?

1 个答案:

答案 0 :(得分:3)

由于Silverlight的性质,与用户界面的任何交互都会在某个时刻使用Dispatcher,并且由于动画的性质,必须使用计时器来制作动画。任何标准的Silverlight动画都将使用DispatcherTimer来实现此目的。您可以使用自己的计时器和动画框架来提供动画,但是没有太多意义。

使用XAML的Silverlight动画
通过使用Storyboard元素和子*Animation元素(DoubleAnimationPointAnimationColorAnimation),可以仅使用XAML创建动画。

一个简单的例子可能是将控件淡入或淡出视图(taken from MSDN):

<UserControl x:Class="animation_ovw_intro.Page"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
  Width="400" Height="300">

  <StackPanel>
    <StackPanel.Resources>
      <!-- Animates the rectangle's opacity. -->
      <Storyboard x:Name="myStoryboard">
        <DoubleAnimation
          Storyboard.TargetName="MyAnimatedRectangle"
          Storyboard.TargetProperty="Opacity"
          From="1.0" To="0.0" Duration="0:0:1" 
          AutoReverse="True" 
          RepeatBehavior="Forever" />
       </Storyboard>
    </StackPanel.Resources>
    <TextBlock Margin="10">Click on the rectangle to start the animation.</TextBlock>

    <Rectangle MouseLeftButtonDown="Mouse_Clicked"
      x:Name="MyAnimatedRectangle"
      Width="100" Height="100" Fill="Blue" />

  </StackPanel>
</UserControl>

使用此C#挂钩事件:

private void Mouse_Clicked(object sender, MouseEventArgs e)
{
    myStoryboard.Begin();
}

此示例在点击StackPanel时动画显示Rectangle的不透明度,导致StackPanel重复淡入淡出。可以通过动画其他属性(例如WidthHeight)来构建更复杂的动画,包括使用easing functionskey frames

弹性矩形
为了帮助您开始解决特定问题,您可以指定仅包含To点(即矩形的一角)和easing function that will create the bouncing effect的动画。然后,在释放鼠标按钮时,您可以启动故事板动画,并且给定适当的值,您应该获得所需的效果。

但是,您可能会遇到一些困难,具体取决于您的矩形形状的哪些属性是读/写而不是只读,因为这会影响您可以制作动画的内容。这些问题的可能解决方案存在于更改动画的属性(您可能需要比XAML更多的代码)或更改动画对象的定义方式。

其他资源
有许多在线资源可以了解有关Silverlight动画的更多信息。 quick search获得了以下结果: