我正在尝试使用Silverlight学习一些基本动画。我试图创建一个Resilience Rectange
挑战在于:我希望在没有DispatcherTimer的情况下创建它。你能帮我解决XAML和C#代码吗?
答案 0 :(得分:3)
由于Silverlight的性质,与用户界面的任何交互都会在某个时刻使用Dispatcher
,并且由于动画的性质,必须使用计时器来制作动画。任何标准的Silverlight动画都将使用DispatcherTimer
来实现此目的。您可以使用自己的计时器和动画框架来提供动画,但是没有太多意义。
使用XAML的Silverlight动画
通过使用Storyboard
元素和子*Animation
元素(DoubleAnimation
,PointAnimation
或ColorAnimation
),可以仅使用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
重复淡入淡出。可以通过动画其他属性(例如Width
和Height
)来构建更复杂的动画,包括使用easing functions和key frames。
弹性矩形
为了帮助您开始解决特定问题,您可以指定仅包含To
点(即矩形的一角)和easing function that will create the bouncing effect的动画。然后,在释放鼠标按钮时,您可以启动故事板动画,并且给定适当的值,您应该获得所需的效果。
但是,您可能会遇到一些困难,具体取决于您的矩形形状的哪些属性是读/写而不是只读,因为这会影响您可以制作动画的内容。这些问题的可能解决方案存在于更改动画的属性(您可能需要比XAML更多的代码)或更改动画对象的定义方式。
其他资源
有许多在线资源可以了解有关Silverlight动画的更多信息。 quick search获得了以下结果: