Michael Goldshteyn
Michael Goldshteyn

Reputation: 74440

Issue applying an animation using a storyboard in code

I have a Canvas with an Ellipse object named Marker:

<!-- Boilerplate -->
<Window x:Class="WpfApplication6.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
        xmlns:WpfApplication6="clr-namespace:WpfApplication6"
        Title="MainWindow" Height="350" Width="525"
        SnapsToDevicePixels="True">
  <Grid>
    <Canvas x:Name="DrawingCanvas">
      <!-- ##### Item of interest, below ##### -->
      <Ellipse x:Name="Marker" Canvas.Left="200" Canvas.Top="100" 
               Width="25" Height="25" Stroke="Black" Fill="#E0E000">
        <Ellipse.Effect>
          <BlurEffect x:Name="MarkerBlurEffect" Radius="0.0" />
        </Ellipse.Effect>
      </Ellipse>
    </Canvas>
  </Grid>
</Window>

I am trying to programatically give the Marker ellipse a blur animation:

  DoubleAnimation blurEffectAnimation=new DoubleAnimation
  {
    From=0, 
    To=10, 
    Duration=TimeSpan.FromSeconds(2.0)
  };

  // If I uncomment the line below, the blur effect animation works perfectly
  //Marker.Effect.BeginAnimation(BlurEffect.RadiusProperty, blurEffectAnimation); 

  // If I do it using the storyboard code below, the animation has no effect
  Storyboard.SetTarget(blurEffectAnimation, Marker.Effect);
  Storyboard.SetTargetProperty(blurEffectAnimation, 
                               new PropertyPath(BlurEffect.RadiusProperty));

  Storyboard sb=new Storyboard();

  sb.Children.Add(blurEffectAnimation);
  sb.Begin();

Interestingly, if I register the effect by name and use that name with the storyboard, the effect starts working again:

  // Register the MarketBlurEffect (as it's named in the XAML) effect by name 
  // with the FrameworkElement being animated (why do I need to?)
  Marker.RegisterName("MarkerBlurEffect",MarkerBlurEffect);

  // Instead of SetTarget, use SetTargetName on the registered name
  Storyboard.SetTargetName(blurEffectAnimation, "MarkerBlurEffect");
  Storyboard.SetTargetProperty(blurEffectAnimation, 
    new PropertyPath(BlurEffect.RadiusProperty));

  Storyboard sb=new Storyboard();

  sb.Children.Add(blurEffectAnimation);
  // Provide Marker to the Begin function in order to specify the name scope 
  // for the registered ("MarkerBlurEffect") name. Not doing this will result
  // in an InvalidOperationException with the Message property set to:
  //   No applicable name scope exists to resolve the name 'MarkerBlurEffect'.
  sb.Begin(Marker);

Upvotes: 1

Views: 1611

Answers (1)

NestorArturo
NestorArturo

Reputation: 2516

Yep... you're right. As the Effect object is somehow deep in the tree you have to do that to access it. Or you can access your effect from the ellipse and change your property path to something like this:

DoubleAnimation blurEffectAnimation = new DoubleAnimation
{
  From = 0,
  To = 10,
  Duration = TimeSpan.FromSeconds(2.0)
};

Storyboard.SetTarget(
  blurEffectAnimation, 
  Marker);

Storyboard.SetTargetProperty(
  blurEffectAnimation,
  new PropertyPath("(Effect).Radius"));

Storyboard sb = new Storyboard();

sb.Children.Add(blurEffectAnimation);
sb.Begin();

Upvotes: 2

Related Questions