我正在尝试使用 Silverlight 学习一些基本动画。我试图创建一个弹性矩形
挑战是:我希望在没有 DispatcherTimer 的情况下创建它。您能帮我处理 XAML 和 C# 代码吗?
最佳答案
由于 Silverlight 的性质,与用户界面的任何交互都会在某个时刻使用Dispatcher
,并且由于动画的性质,必须使用计时器来制作动画。任何标准 Silverlight 动画都将使用 DispatcherTimer 来实现此目的。您可以使用自己的计时器和动画框架来提供动画,但这没有多大意义。
使用 XAML 的 Silverlight 动画
可以通过使用 Storyboard
仅使用 XAML 创建动画元素和子 *Animation
元素( DoubleAnimation
、 PointAnimation
或 ColorAnimation
)。
一个简单的示例可能是淡入或淡出 View ( 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();
}
此示例在单击 Rectangle
时对 StackPanel
的不透明度进行动画处理,从而导致 StackPanel
反复淡入和淡出。可以通过设置其他属性(例如 Width
和 Height
)的动画来构建更复杂的动画,包括使用 easing functions和 key frames .
弹性矩形
为了帮助您开始解决特定问题,您可以仅使用 To
指定动画。点(即矩形的角)和 easing function that will create the bouncing effect 。然后,在释放鼠标按钮时,您可以启动 Storyboard动画,并且给定适当的值,您应该获得您正在寻找的效果。
但是,您可能会遇到一些困难,具体取决于矩形形状的哪些属性是读/写还是只读,因为这会影响您可以制作动画的内容。这些问题的可能解决方案是更改动画属性(您可能需要比 XAML 更多的代码)或更改动画对象的定义方式。
其他资源
在线有许多资源可用于了解有关 Silverlight 动画的更多信息。一个quick search获得这些结果:
关于c# - 没有 DispatcherTimer 的 Silverlight 动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5882897/