故事板适用于所有标签

时间:2010-03-30 15:22:45

标签: c# wpf animation storyboard

我想在我的窗口中为一组标签应用一个小故事板。 我的故事板是这样的:

<Storyboard x:Key="Storyboard1" AutoReverse="True" RepeatBehavior="Forever">
        <ColorAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="label" Storyboard.TargetProperty="(Label.Foreground).(SolidColorBrush.Color)">
            <SplineColorKeyFrame KeyTime="00:00:00.1000000" Value="#FFFFFF"/>
        </ColorAnimationUsingKeyFrames>
</Storyboard>

我有一个由以下内容组成的窗口:

<Grid Background="#FF000000">
        <Viewbox HorizontalAlignment="Center" VerticalAlignment="Center" Stretch="Uniform">
            <UniformGrid x:Name="grid" Background="#FF000000" />
        </Viewbox>
</Grid>

当我想开始我的故事板时,我这样做:

Storyboard.SetTarget( _stb, myLabel );
_stb.Begin();

其中_std是由窗口资源加载的故事板。

动画效果很好,但在所有标签上(不仅仅是我想要的标签)。 我试图通过SetTargetName切换SetTarget,但是构造函数在我的窗口中创建了标签,当我尝试“SetTargetName”时,无法建立名称。

你有什么想法吗?

谢谢:)

------------编辑:我们要求我更具描述性-------------------------- ------------------------------------------

标签不是直接在xaml中创建的,它们是由窗口的构造函数创建的:

public SpellerWindow(IKeyboard keyboard, int colomnNumber, SolidColorBrush background, SolidColorBrush foreground )
{
    InitializeComponent();
    grid.Columns = colomnNumber;
    int i = 0;
    foreach( IKey key in keyboard.Zones.Default.Keys )
    {
        Label lb = new Label();
        lb.Foreground = foreground;
        lb.Name = "label"+(i++).ToString();
        lb.Content = key.ActualKeys[keyboard.CurrentMode].UpLabel;
        lb.HorizontalAlignment = HorizontalAlignment.Center;
        lb.VerticalAlignment = VerticalAlignment.Center;

        Viewbox box = new Viewbox();
        box.Stretch = Stretch.Fill;
        box.Child = lb;
        box.Tag = key;

        grid.Children.Add( box );
    }
}

动画由事件处理程序启动:

void Highlighter_StartAnimation( object sender, HiEventArgs e )
{
      Storyboard stb;
      if( !_anims.TryGetValue( e.Step.Animation.Name, out stb ) )
      {
          stb = (Storyboard)_window.FindResource( e.Step.Animation.Name );
          _anims.Add( e.Step.Animation.Name, stb );
      }

      DoAnimations( _zones[e.Step.Zone], stb );
}

最后,动画由DoAnimations开始:

void DoAnimations( List<Label> labels, Storyboard stb )
{
     foreach( Label lb in labels )
     {
         Storyboard.SetTarget( stb, lb );
         stb.Begin();
     }
}

我想突出显示一系列标签,但所有标签都在闪烁。 我不知道为什么,但我尝试直接在Xaml中创建一个标签,并在故事板的Xaml中设置一个Storyboard.TargetName(绑定到标签的名称)。它正在发挥作用......

现在你知道了一切。

谢谢你的帮助:)

2 个答案:

答案 0 :(得分:0)

故事是由故事板将RepeatBehavior设置为永远的事实引起的。这意味着当动画结束时,它从头开始,重新设置原始前景色并将其设置为结束色。您可能正在寻找的是将FillBehavior设置为“HoldEnd”。

所有标签闪烁的原因是因为您有一个故事板的实例并将所有标签连接到它。当故事板开始时,其所有目标都将变为动画。您需要根据需要添加和删除故事板目标。

答案 1 :(得分:0)

我找到了解决方案!

我在窗口的构造函数中犯了错误:

public SpellerWindow(IKeyboard keyboard, int colomnNumber, SolidColorBrush background, SolidColorBrush foreground )
{
    ....
}

在键盘上创建的Foreach键,我创建了一个具有给定背景和前景的新标签。当动画更改标签的前景时,它将在所有标签上更改,因为所有标签都使用与SolidColorBrush相同的引用。

感谢您的帮助;)