Reputation: 74440
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
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