c# - 制作用户控制脉冲

标签 c# wpf animation code-behind

我想做的是让我的控件“脉动”(例如放大一点,然后缩小一点,然后回到正常大小)。下面的代码正是我想要的,但似乎应该有一个更简单的方法。它必须在代码隐藏中完成,因为这是我们大多数控件派生自的抽象类。我对动画控制和 Storyboard没有太多经验。

所以具体来说,我的问题是,是否有比以下方法更简单的方法来获得所需的结果(同时仍在代码隐藏中完成)?

    public void Pulse()
    {
        var storyboard = new Storyboard
        {
            FillBehavior = FillBehavior.Stop,
            RepeatBehavior = new RepeatBehavior(2)
        };

        double timeIncrement = .15;
        double changePercent = 20;

        var firstTime = TimeSpan.FromSeconds(timeIncrement);
        var secondTime = TimeSpan.FromSeconds(timeIncrement * 3);
        var thirdTime = TimeSpan.FromSeconds(timeIncrement * 4);

        var scale = new ScaleTransform(1.0, 1.0);

        RenderTransformOrigin = new Point(.5, .5);
        RenderTransform = scale;

        //enlarge
        {
            DoubleAnimation growX = new DoubleAnimation
            {
                Duration = firstTime,
                To = 1 + changePercent
            };
            storyboard.Children.Add(growX);
            Storyboard.SetTargetProperty(growX, new PropertyPath("RenderTransform.ScaleX"));

            DoubleAnimation growY = new DoubleAnimation
            {
                Duration = firstTime,
                To = 1 + changePercent
            };
            storyboard.Children.Add(growY);
            Storyboard.SetTargetProperty(growY, new PropertyPath("RenderTransform.ScaleY"));
        }

        //shrink
        {
            DoubleAnimation shrinkX = new DoubleAnimation
            {
                Duration = secondTime,
                To = 1 - changePercent
            };
            storyboard.Children.Add(shrinkX);
            Storyboard.SetTargetProperty(shrinkX, new PropertyPath("RenderTransform.ScaleX"));

            DoubleAnimation shrinkY = new DoubleAnimation
            {
                Duration = secondTime,
                To = 1 - changePercent
            };
            storyboard.Children.Add(shrinkY);
            Storyboard.SetTargetProperty(shrinkY, new PropertyPath("RenderTransform.ScaleY"));
        }

        //back to normal
        {
            DoubleAnimation normX = new DoubleAnimation
            {
                Duration = thirdTime,
                To = 1
            };
            storyboard.Children.Add(normX);
            Storyboard.SetTargetProperty(normX, new PropertyPath("RenderTransform.ScaleX"));

            DoubleAnimation normY = new DoubleAnimation
            {
                Duration = thirdTime,
                To = 1
            };
            storyboard.Children.Add(normY);
            Storyboard.SetTargetProperty(normY, new PropertyPath("RenderTransform.ScaleY"));
        }

        BeginStoryboard(storyboard, HandoffBehavior.SnapshotAndReplace, false);
    }

最佳答案

您也许可以通过将增长/收缩逻辑移至其自己的方法中来稍微简化事情。这减少了重复并提供了潜在的更可重用的代码粗粒。

public void Pulse()
{
    var storyboard = new Storyboard
    {
        FillBehavior = FillBehavior.Stop,
        RepeatBehavior = new RepeatBehavior(2)
    };

    double timeIncrement = .15;

    double growPercent = 20;
    double shrinkPercent = -20;

    var firstTime = TimeSpan.FromSeconds(timeIncrement);
    var secondTime = TimeSpan.FromSeconds(timeIncrement * 3);
    var thirdTime = TimeSpan.FromSeconds(timeIncrement * 4);

    var scale = new ScaleTransform(1.0, 1.0);

    RenderTransformOrigin = new Point(.5, .5);
    RenderTransform = scale;

    storyboard = AddSizeChange(firstTime, growPercent, storyboard);
    storyboard = AddSizeChange(secondTime, shrinkPercent, storyboard);
    storyboard = AddSizeChange(thirdTime, growPercent, storyboard);

    BeginStoryboard(storyboard, HandoffBehavior.SnapshotAndReplace, false);
}

public Storyboard AddSizeChange(TimeSpan animTime, double changePercent, Storyboard storyboard)
{
    DoubleAnimation growX = new DoubleAnimation
    {
        Duration = animTime,
        To = 1 + changePercent
    };
    storyboard.Children.Add(growX);
    Storyboard.SetTargetProperty(growX, new PropertyPath("RenderTransform.ScaleX"));

    DoubleAnimation growY = new DoubleAnimation
    {
        Duration = animTime,
        To = 1 + changePercent
    };
    storyboard.Children.Add(growY);
    Storyboard.SetTargetProperty(growY, new PropertyPath("RenderTransform.ScaleY"));

    return storyboard;
}

关于c# - 制作用户控制脉冲,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31924102/

相关文章:

wpf - 三边边框

android - fragment 标准过渡没有动画

javascript - Three.js关键帧动画

C# TextWriter 每 1024 个字符插入换行符

c# - 创建你自己的 Tinyurl 风格的 uid

c# - 如何从注册表读取二进制数据到字节数组

c# - 如果 asp :fileupload field is used 从数据库下载文件挂起 IE

c# - WPF DataGrid - 获取鼠标光标所在的行号

c# - 为什么绑定(bind)到结构不起作用?

javascript - 让div在页面加载时不显示,然后在函数运行时显示 block