Search code examples
c#wpfanimationblink

Create a Blink animation in WPF in code behind


I want to apply a Blink animation to a Canvas so that all the objects I have drawn on it would blink with it.

I have been somewhat successful using the code below which changes the Opacity property of the Canvas rather fast to achieve this effect but I'm kinda not satisfied with it.

I would prefer a pure blink without any FadeOut/FadeIn as in my current code. How can I do it the right way?

var blinkAnimation = new DoubleAnimation
{
    From = 1,
    To = 0
};

var blinkStoryboard = new Storyboard
{
    Duration = TimeSpan.FromMilliseconds(500),
    RepeatBehavior = RepeatBehavior.Forever,
    AutoReverse = true
};

Storyboard.SetTarget(blinkAnimation, MyCanvas);
Storyboard.SetTargetProperty(blinkAnimation, new PropertyPath(OpacityProperty));

blinkStoryboard.Children.Add(blinkAnimation);
MyCanvas.BeginStoryboard(blinkStoryboard);

Maybe I can do that using the VisibilityProperty but I couldn't get it right.


Solution

  • You might use a second animation with an appropriate BeginTime:

    var switchOffAnimation = new DoubleAnimation
    {
        To = 0,
        Duration = TimeSpan.Zero
    };
    
    var switchOnAnimation = new DoubleAnimation
    {
        To = 1,
        Duration = TimeSpan.Zero,
        BeginTime = TimeSpan.FromSeconds(0.5)
    };
    
    var blinkStoryboard = new Storyboard
    {
        Duration = TimeSpan.FromSeconds(1),
        RepeatBehavior = RepeatBehavior.Forever
    };
    
    Storyboard.SetTarget(switchOffAnimation, MyCanvas);
    Storyboard.SetTargetProperty(switchOffAnimation, new PropertyPath(Canvas.OpacityProperty));
    blinkStoryboard.Children.Add(switchOffAnimation);
    
    Storyboard.SetTarget(switchOnAnimation, MyCanvas);
    Storyboard.SetTargetProperty(switchOnAnimation, new PropertyPath(Canvas.OpacityProperty));
    blinkStoryboard.Children.Add(switchOnAnimation);
    
    MyCanvas.BeginStoryboard(blinkStoryboard);