2010-03-30 2 views
1

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

<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».

Есть ли у вас идеи?

спасибо :)

------------ Edit: Мы попросили меня быть более описательный ------------------ --------------------------------------------------

этикетки не создаются непосредственно в 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); 
    } 
} 

Animations запускаются с помощью обработчика событий:

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 (связанное с именем метки). И это работает ...

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

Спасибо Вам помочь :)

+0

Я предполагаю, что «myLabel» находится в UniformGrid. Ваш код работает для меня, когда я добавляю две метки в форму единой сетки в XAML. Можете ли вы рассказать нам больше о том, как все настроено? –

+0

Редактирование заголовка вопроса не закрывает его. Если вы действительно хотите, чтобы вопрос был закрыт, отметьте его модератором и оставьте примечание. – Aaronaught

+0

Хорошо, Аарон, я просто сделал это. –

ответ

0

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

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

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

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

Благодарим за помощь;)

0

мигающего вызвано тем, раскадровка имеет свой RepeatBehavior набор навсегда. Это означает, что когда анимация заканчивается, она начинается с начала, переиздавая исходный цвет переднего плана и анимируя его до конечного цвета. То, что вы, вероятно, ищете, - это установить FillBehavior на «HoldEnd».

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

+0

Благодарим вас за ответ Скотта. Я знаю, что для RepeatBehavior это было просто для тестов. Для моей проблемы, в первый раз, я подумал, как вы, поэтому я попытался установить только один ярлык в качестве цели раскадровки, но все ярлыки ожидают. Я думаю, что я попытаюсь создать ярлык непосредственно в Xaml или использовать XamlWriter для записи Xaml из конструктора окна. Как вы думаете? –