开发者

WPF Animating a Run element to flash

This is kind of a weird problem I am having right now. What I am trying to do is animate a Run element to essentially flash/blink. The parent is a Hyperlink which contains multiple Inlines of type Run and Image. Now I开发者_如何学Python am trying to animate the Foreground color of the element but it does not seem to work.

Here is my code for a hyperlink.

 CallbackHyperLink callbackLink = new CallbackHyperLink();
 ToolTipService.SetShowDuration(callbackLink, 3600000);
 ToolTipService.SetInitialShowDelay(callbackLink, 0);
 callbackLink.Foreground = new SolidColorBrush(Colors.Magenta);                        // Default text color of the link

 callbackLink.TextDecorations = null;                            // Disable the underline until mouse over
 callbackLink.ToolTip = f.Tooltip;                               // Set the tooltip string

DoubleAnimation opacityAnim = new DoubleAnimation();
opacityAnim.From = 1.0;
opacityAnim.To = 0.0;
opacityAnim.FillBehavior = FillBehavior.Stop;
opacityAnim.Duration = TimeSpan.FromSeconds(BlinkDurationOff);
opacityAnim.AutoReverse = true;
_blinkAnimation.Children.Add(opacityAnim);

Storyboard.SetTarget(opacityAnim, callbackLink.Foreground);
Storyboard.SetTargetProperty(opacityAnim, new PropertyPath(SolidColorBrush.OpacityProperty));

_blinkAnimation.Stop();
_blinkAnimation.Begin();

So that gets put in a storyboard which get fired. However the foreground is not getting animated and I am not seeing any warnings that im trying to animate something I shouldn't. Anybody have any ideas?

Thanks


This works:

Storyboard.SetTarget(opacityAnim, callbackLink); 
Storyboard.SetTargetProperty(opacityAnim, new PropertyPath(UIElement.OpacityProperty));

Edit full working example with a TextBlock stolen from here :

void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
    TextBlock callbackLink = new TextBlock();
    callbackLink.HorizontalAlignment = HorizontalAlignment.Center;
    callbackLink.VerticalAlignment = VerticalAlignment.Center;
    callbackLink.Text = "Test";
    this.Content = callbackLink;

    NameScope.SetNameScope(this, new NameScope());

    var b = new SolidColorBrush(Colors.Magenta);
    callbackLink.Foreground = b;
    this.RegisterName("MyAnimatedBrush", b);

    DoubleAnimation opacityAnimation = new DoubleAnimation();
    opacityAnimation.To = 0.0;
    opacityAnimation.Duration = TimeSpan.FromSeconds(0.5);
    opacityAnimation.AutoReverse = true;
    opacityAnimation.RepeatBehavior = RepeatBehavior.Forever;
    Storyboard.SetTargetName(opacityAnimation, "MyAnimatedBrush");
    Storyboard.SetTargetProperty(
        opacityAnimation, new PropertyPath(SolidColorBrush.OpacityProperty));
    Storyboard mouseLeftButtonDownStoryboard = new Storyboard();
    mouseLeftButtonDownStoryboard.Children.Add(opacityAnimation);
    callbackLink.MouseEnter += delegate(object sender2, MouseEventArgs ee)
    {
        mouseLeftButtonDownStoryboard.Begin(this, true);
    };

    callbackLink.MouseLeave += delegate(object sender2, MouseEventArgs ee)
    {
        mouseLeftButtonDownStoryboard.Stop(this);
    };


}


Also another way to link to the foreground opacity call without registering the name of the brush is the following.

    Storyboard.SetTarget(opacityAnim, callbackLink);
    Storyboard.SetTargetProperty(opacityAnim, new PropertyPath("Foreground.Opacity"));

This seems to finally work for me. Still tweaking my solution as I am doing a lot of Stop/Begin calls on the animation which I believe is not good way of doing things.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜