关于c#:WPF-构建动画

5次阅读

共计 1735 个字符,预计需要花费 5 分钟才能阅读完成。

写在后面: 本文代码摘自《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));
    }
}
正文完
 0