2008-10-14 8 views
4

J'ai un storyboard (1) qui fait quelques animations de base en 2 secondes. Je veux que le storyboard (1) fasse toutes les animations de la propriété que je l'ai configuré pour faire (tout fonctionne bien). Mais à 3 secondes dans le storyboard (1) je veux commencer storyboard (2) et quitter le storyboard (1) sans interaction de l'utilisateur du tout.Démarrer Storyboard dans une autre chronologie Storyboards

La seule chose que j'ai vue qui me permet de faire cela est quand l'utilisateur clique sur quelque chose. Je veux que cela soit automatique en fonction de la position de la chronologie actuelle du storyboard (1).

J'espère que cela a assez de sens. S'il vous plaît laissez-moi savoir si vous avez besoin de moi pour expliquer quelque chose de plus en détail.

Merci.

Modifier: Veuillez poster la réponse en langage XAML ou VB.net. :)

Répondre

0

Eh bien, j'ai trouvé une solution. J'ai juste engendré un nouveau thread pour attendre 3 secondes, puis j'ai lancé un appel Invoke pour lancer le storyboard à partir de ce thread.

Dim board As Storyboard = New Storyboard 
    board = DirectCast(TryFindResource("DoSplit"), Storyboard) 
    If board IsNot Nothing Then 
     board.Begin(Me, True) 

     Dim t As Thread 
     t = New Thread(AddressOf Me.WaitToHidePanel) 
     t.SetApartmentState(ApartmentState.STA) 
     t.Start() 

    End If 

Délimitez vos délégués et vos fonctions en toute sécurité. C'est un hack moche à mon avis, mais ça marche pour l'instant.

+0

Oui, c'est toujours dommage quand vous ne pouvez pas résoudre un problème d'interface utilisateur à 100% en XAML, et au lieu de finir en utilisant l'utilisation du code impératif. –

6

Normalement, afin de contrôler les animations pendant la ligne de temps, vous utiliseriez des "images clés". Les animations d'images clés vous permettent de définir des valeurs spécifiques pour la propriété que vous animez à des moments spécifiques. Dans WPF, chaque animation a une animation d'image clé correspondante, comme 'DoubleAnimation' a 'DoubleAnimationUsingKeyFrames'.

Je ne pense pas qu'il soit possible de démarrer un nouveau storyboard à partir d'une animation. Cependant, vous pouvez obtenir le même résultat en ayant les deux storyboards sur le même scénario et en démarrant le storyboard (2) avec un délai spécifique basé sur la durée du storyboard (1). Quelque chose comme:

<StackPanel> 
    <Rectangle Name="recProgressBar" 
       Fill="Orange" 
       Width="1" 
       Height="25" 
       Margin="20" 
       HorizontalAlignment="Left" /> 
    <Button Content="Start Animation" 
      Width="150" 
      Height="25"> 
     <Button.Triggers> 
      <EventTrigger RoutedEvent="Button.Click"> 
       <BeginStoryboard> 
        <Storyboard> 
         <DoubleAnimation Storyboard.TargetName="recProgressBar" 
             Storyboard.TargetProperty="Width" 
             From="0" 
             To="250" 
             Duration="0:0:2" /> 
         <Storyboard BeginTime="0:0:3"> 
          <ColorAnimation Storyboard.TargetName="recProgressBar" 
              Storyboard.TargetProperty="Fill.Color" 
              To="DarkGreen" 
              Duration="0:0:1" /> 
         </Storyboard> 
        </Storyboard> 
       </BeginStoryboard> 
      </EventTrigger> 
     </Button.Triggers> 
    </Button> 
</StackPanel> 

Ici, l'animation de couleur commencera 1 seconde après que l'animation de largeur est terminée. Cela pourrait valoir le coup d'essayer.

0

Merci Megakemp, c'est ce que j'avais peur de devoir faire. Je ne voulais pas avoir à gérer deux copies d'un storyboard en XAML. Si je dois ajouter un contrôle et le gérer via storyboard (1), je devrai me souvenir de copier et coller les changements à ce storyboard (2). Je suppose que ce sont les cerceaux que vous devez sauter jusqu'à ce que la fonctionnalité vient que je cherche.

Maintenant, j'ai pensé à une autre idée d'essayer, mais n'a pas été en mesure d'obtenir la fonctionnalité. C'est mon idée ci-dessous, je peux l'expliquer mieux dans le code .. ce code ci-dessous ne compilera pas, c'est juste pour faire passer mon message.

Dim board As Storyboard = New Storyboard 
board = DirectCast(TryFindResource("Animation1"), Storyboard) 
If board IsNot Nothing Then 
    board.Begin(Me) 
    While board.GetCurrentState(Me) = ClockState.Active 
     'Wait until Animation1 ends 
    End While 
    'Start Animation2 
    board = DirectCast(TryFindResource("Animation2"), Storyboard) 
    If board IsNot Nothing Then 
     board.Begin(Me) 
    End If 
End If 

Merci pour votre aide .. et si quelqu'un d'autre a une autre réponse ou plus de perspicacité s'il vous plaît ne hésitez pas à poster, je ne suis pas abandonner cette idée tout à fait encore.

+0

Vous n'avez pas besoin de gérer deux copies, il suffit d'utiliser le storyboard comme ressource et de s'y référer deux fois! –

+0

Le délai de démarrage est défini sur l'objet Storyboard lui-même, il devra donc avoir deux copies, une avec le retard et l'autre sans. –

+0

Bob King, veuillez fournir un exemple de votre solution afin que je puisse mieux comprendre de quoi vous parlez. Megakemp, votre sur la même page que ma pensée. – ScottN

Questions connexes