【问题标题】:Making a user control pulse制作用户控制脉冲
【发布时间】:2015-08-11 16:26:42
【问题描述】:

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

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

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

【问题讨论】:

  • 这对我来说看起来很简单......

标签: c# wpf animation code-behind


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    这是一种很好的方法,WPF 不提供自动脉冲的方法或事件。你的很简单,因为你已经创建了它,你知道如何根据需要修改它。

    【讨论】:

    • 好的,谢谢。我认为必须有我错过的动画才能使这更简单。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-25
    • 1970-01-01
    • 2017-10-26
    相关资源
    最近更新 更多