Раскадровка применяется ко всем меткам - PullRequest
1 голос
/ 30 марта 2010

Я хочу применить небольшую раскадровку к коллекции ярлыков в моем окне. Моя раскадровка такая:

<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 - моя раскадровка, загруженная ресурсами окна.

Анимация работает отлично, но на всех ярлыках (не только на том, который я хочу). Я пытался переключить SetTarget с помощью SetTargetName, но метки создаются в моем окне конструктором, и имена не могут быть найдены при попытке "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 и установить Storyboard.TargetName (привязанный к имени ярлыка) в Xaml раскадровки. И это работает ...

Теперь ты все знаешь.

Спасибо за помощь:)

Ответы [ 2 ]

0 голосов
/ 31 марта 2010

Я нашел решение!

Я допустил ошибку в конструкторе моего окна:

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

Основанная на клавиатуре клавиша Foreach, я создаю новую метку с заданным фоном и передним планом. Когда анимация изменяет передний план надписи, она будет изменена на всех надписях, поскольку все надписи используют одинаковую ссылку на SolidColorBrush.

Спасибо за вашу помощь;)

0 голосов
/ 30 марта 2010

Мигание вызвано тем фактом, что раскадровка имеет свой RepeatBehavior, установленный навсегда. Это означает, что когда анимация заканчивается, она начинается заново, сбрасывая исходный цвет переднего плана и анимируя его до конечного цвета. Вероятно, вам нужно установить FillBehavior в «HoldEnd».

Причина, по которой все ярлыки мигают, заключается в том, что у вас есть один экземпляр раскадровки и подключены к нему все ярлыки. Когда раскадровка начинается, все ее цели будут анимированы. Вам нужно добавлять и удалять целевые раскадровки по мере необходимости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...