2010-03-30 3 views
1

Je souhaite appliquer un petit storyboard à une collection d'étiquettes dans ma fenêtre. Mon story-board est comme ça:Storyboard s'applique à toutes les étiquettes

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

J'ai une fenêtre composée de ce qui suit:

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

Quand je veux commencer mon story-board je fais ça:

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

où _std est mon storyboard chargé par les ressources de la fenêtre.

L'animation fonctionne bien, mais sur toutes les étiquettes (pas seulement celle que je veux). J'ai essayé de changer SetTarget par SetTargetName mais les étiquettes sont créées dans ma fenêtre par le constructeur et les noms ne peuvent pas être fondés quand j'essaye "SetTargetName".

Avez-vous des idées?

Merci de

------------ EDIT: Nous m'a demandé d'être plus descriptif ------------------ --------------------------------------------------

étiquette ne sont pas créés directement dans le XAML, ils sont créés par le constructeur de la fenêtre:

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 démarrés par un gestionnaire d'événements:

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); 
} 

Enfin, des animations sont mises en marche par DoAnimations:

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

Je veux mettre en évidence une collection d'étiquettes, mais toutes les étiquettes clignotent. Je ne sais pas pourquoi, mais j'essaie de créer directement une étiquette dans le Xaml, et de définir un Storyboard.TargetName (lié au nom de l'étiquette) dans le Xaml du storyboard. Et ça marche ...

Maintenant vous savez tout.

Merci pour votre aide :)

+0

Je suppose que "myLabel" est dans le UniformGrid. Votre code fonctionne pour moi lorsque j'ajoute deux étiquettes à la grille uniforme dans XAML. Pouvez-vous nous en dire plus sur la façon dont tout est mis en place? –

+0

La modification du titre d'une question ne la ferme pas. Si vous voulez vraiment que la question soit fermée, signalez-la à un modérateur et laissez une note. – Aaronaught

+0

Ok Aaronaught, je viens de le faire. –

Répondre

0

J'ai trouvé la solution!

J'ai fait des erreurs dans le constructeur de ma fenêtre:

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

clé foreach fondée sur le clavier, je crée une nouvelle étiquette, avec l'arrière-plan et de premier plan donné.Lorsque l'animation change le premier plan d'une étiquette, elle sera modifiée sur toutes les étiquettes, car toutes les étiquettes utilisent la même référence à SolidColorBrush.

Merci pour votre aide;)

0

Le clignotement est causé par le fait que le story-board a son RepeatBehavior mis à jamais. Cela signifie que lorsque l'animation se termine, elle recommence depuis le début, en réinitialisant la couleur d'avant-plan originale et en l'animant à la couleur finale. Ce que vous cherchez probablement est de définir FillBehavior sur "HoldEnd".

La raison pour laquelle toutes les étiquettes clignotent est que vous avez une instance d'un storyboard et que vous y avez accroché toutes les étiquettes. Quand le storyboard commence, toutes ses cibles seront animées. Vous devez ajouter et supprimer les cibles de storyboards au besoin.

+0

Merci pour votre réponse Scott. Je sais pour le RepeatBehavior, c'était juste pour les tests. Pour mon problème, la première fois que j'ai pensé comme vous, j'ai essayé de ne définir qu'une seule étiquette comme cible du storyboard mais toutes les étiquettes s'animent. Je pense que je vais essayer de créer Label directement dans le Xaml, ou utiliser un XamlWriter pour écrire Xaml depuis le constructeur de la fenêtre. Qu'en pensez-vous? –

Questions connexes