写在后面:本文代码摘自《Head First C#》
本文应用ObjectAnimationUsingKeyFrames + Storyboard构建一个动画。
ObjectAnimationUsingKeyFrames为关键帧动画,它容许为动画设置几个关键帧,其中每一帧为ObjectKeyFrame类型。ObjectKeyFrame为抽象类,理论应用的是DiscreteObjectKeyFrame,它是ObjectKeyFrame的派生类,示意指标是不间断变动的。ObjectAnimationUsingKeyFrames的KeyFrames属性即为关键帧汇合。DiscreteObjectKeyFrame的Value属性为该帧的值,KeyTime属性为该帧的工夫点信息。
Storyboard可执行一组动画,上面的示例代码只蕴含一个动画。其SetTarget办法指定执行动画的界面元素,SetTargetProperty办法指定该动画利用到该界面元素的哪个属性上。定义并设置好动画后,将动画增加到Storyboard的Children中。
RepeatBehavior属性示意动画的反复行为。取值为0代表不播放,取其它double值管制循环次数,取RepeatBehavior.Forever示意始终循环。AutoReverse属性示意是否以相同的动画形式从终止值返回起始值。
// 前台,UserControl标记的代码
<Grid>
<Image x:Name="iamge" Streach="Fill" />
</Grid>
// 后盾代码
public sealed partial class AnimatedImage:UserControl
{
// 应用xaml创立控件,必须有一个无参构造函数
public AnimatedImage()
{
this.InitializeComponent();
}
publi AnimatedImage(IEnumerable<string> imageNames, TimeSpan interval)
:this()
{
StartAnimation(imageNames, interval);
}
public void StartAnimation(IEnumerable<string> imageNames,
TimeSpan interval)
{
Storyboard storyboard = new Storyboard();
ObjectAnimationUsingKeyFrames animation =
new ObjectAnimationUsingKeyFrames();
storyboard.SetTarget(animation, image);
storyboard.SetTargetProperty(animation, "Source");
TimeSpan currentInterval = TimeSpan.FromMilliseconds(0);
foreach(string imageName in imageNames)
{
ObjectKeyFrame keyFrame = new DiscreteObjectKeyFrame();
keyFrame.Value = CreateImageFromAssets(imageName);
keyFrame.KeyTime = currentInterval;
animation.KeyFrames.Add(keyFrame);
currentInterval = currentInterval.Add(interval);
}
storyboard.RepeatBehavior = RepeatBehavior.Forever;
storyboard.AutoReverse = true;
storyboard.Children.Add(animation);
storyboard.Begin();
}
private static BitmapImage CreateImageFromAssets(string imageFilename)
{
return new BitmapImage(new Uri("ms=appx:///Assets/" + imageFilename));
}
}
发表回复