2

我是这个领域的新手。我在屏幕上动态创建控件。在按钮上单击我正在更改标签值。我想添加一些带有颜色的淡出动画,以便捕捉用户的视图,从而表明屏幕上发生了某些事情。目前我正在使用它来隐藏带有淡入淡出动画的控件

myLabel.Visibility = System.Windows.Visibility.Visible;
        var a = new DoubleAnimation
        {
            From = 1.0,
            To = 0.0,
            FillBehavior = FillBehavior.Stop,
            BeginTime = TimeSpan.FromSeconds(2),
            Duration = new Duration(TimeSpan.FromSeconds(0.5))
        };
        var storyboard = new Storyboard();

        storyboard.Children.Add(a);
        Storyboard.SetTarget(a, myLabel);
        Storyboard.SetTargetProperty(a, new PropertyPath(OpacityProperty));
        storyboard.Completed += delegate { myLabel.Visibility = System.Windows.Visibility.Hidden; };
        storyboard.Begin();  

相反,我必须使用一些黄色颜色框作为背景,它会淡出,以便指示屏幕上发生的事情。任何帮助将不胜感激

4

3 回答 3

2

关于Storyboard没有 xaml 方法的问题看起来不太好。

因此,这是与您从 xaml 发布的答案相同的替代方法:

首先Storyboard在 xaml 资源中创建并分配一个Key

<Storyboard x:Key="MyStoryboard">
  <ColorAnimation BeginTime="0:0:0"
                  Duration="0:0:2"
                  Storyboard.TargetProperty="(Label.Foreground).(SolidColorBrush.Color)"
                  To="Yellow" />
  <ColorAnimation BeginTime="0:0:2"
                  Duration="0:0:3"
                  Storyboard.TargetProperty="(Label.Foreground).(SolidColorBrush.Color)"
                  To="Transparent" />
</Storyboard>

接下来,由于您想从动态Label代码中调用它,您可以在代码隐藏中执行类似的操作以在动态添加的情况下调用它Label

var myStoryboard = (Storyboard)TryFindResource("MyStoryboard"); 
foreach(var animation in myStoryboard.Children)
  Storyboard.SetTarget(animation, /* WhateverDynamicLabelControl */);
myStoryboard.Begin();

你可以从这里得到这个工作演示。如果您可以避免调用隐藏代码Storyboard,那么就去做,但我不确定您的视图是如何设置的

更新:

Storyboard要从多个视图访问相同的,要么

  • 将 移动Storyboard到两个视图都可以访问的更高资源范围(例如在 app.xaml 中)
  • 放入StoryboardaResourceDictionary并将此字典合并到您需要 Storyboard 的视图中。

对于这两种方法中的任何一种,请确保您指定x:Shared="False"您的Storyboard以防止只读修改错误。

所以而不是

<Storyboard x:Key="MyStoryboard">

你将会有

<Storyboard x:Key="MyStoryboard" x:Shared="False">
于 2013-06-17T11:10:42.813 回答
1

我已经为 FadeIn/FadeOut 使用了以下逻辑,我知道这不是最佳答案,但根据我的要求,它对我来说绝对没问题。我使用 ColorAnimation 作为

ColorAnimation animation = new ColorAnimation();
animation.To = Colors.Yellow;
animation.Duration = new Duration(TimeSpan.FromSeconds(2));
SolidColorBrush brush = new SolidColorBrush();
animation.Completed += delegate { resetAnimation(element); };
brush.BeginAnimation(SolidColorBrush.ColorProperty, animation);
element.Background = brush;

在 Completed 里面我已经将背景从黄色重置为透明色

ColorAnimation animation = new ColorAnimation();
animation.From = Colors.Yellow;
animation.To = Colors.Transparent;
animation.Duration = new Duration(TimeSpan.FromSeconds(3));
SolidColorBrush brush = new SolidColorBrush();
brush.BeginAnimation(SolidColorBrush.ColorProperty, animation);
element.Background = brush;

在任何方法中使用这两种逻辑并将元素作为参数传递。而已

于 2013-06-17T10:06:16.833 回答
0

您应该将 DoubleAnimation 更改为 ColorAnimation:

ColorAnimation colorAnimation = new ColorAnimation();
colorAnimation.To = Colors.Yellow;
colorAnimation.Duration = TimeSpan.FromSeconds(1);

并更改此行:

Storyboard.SetTarget(a, myLabel);
Storyboard.SetTargetProperty(a, new PropertyPath(OpacityProperty));

至:

SolidColorBrush myAnimatedBrush = new SolidColorBrush();
myLabel.Background = myAnimatedBrush;
myAnimatedBrush.Color = Colors.Green;
Storyboard.SetTarget(a, myAnimatedBrush);
Storyboard.SetTargetProperty(a, new PropertyPath(SolidColorBrush.ColorProperty));
于 2013-06-17T08:11:51.107 回答