Проблема применения анимации с использованием раскадровки в коде - PullRequest
1 голос
/ 13 января 2012

У меня есть Canvas с Ellipse объектом с именем 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>

Я пытаюсь программно дать Marker эллипсу размытие анимации:

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

Интересно, что если я зарегистрирую эффект по имени и использую это имя в раскадровке, эффект снова начнет работать:

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

1 Ответ

1 голос
/ 13 января 2012

Да ... ты прав.Поскольку объект «Эффект» находится глубоко в дереве, вы должны сделать это, чтобы получить к нему доступ.Или вы можете получить доступ к своему эффекту из эллипса и изменить путь к свойству на что-то вроде этого:

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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...