制作用户控制脉冲

时间:2015-08-10 15:58:12

标签: c# wpf animation code-behind

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

特别是我的问题是,是否有一种比下面的方法更简单的方法来获得所需的结果(虽然仍然在代码隐藏中完成)?

    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);
    }

2 个答案:

答案 0 :(得分:2)

您可以通过将增长/缩小逻辑移动到自己的方法中来简化一点。这减少了重复并提供了可能更可重用的代码粗磨。

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;
}

答案 1 :(得分:1)

这是一个很好的方法,WPF不提供自动脉冲的方法或事件。你很简单,当你创建它时,你知道如何根据自己的意愿修改它。