Question

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 propriétés pour lesquelles je l’ai configurée (tout fonctionne bien). Mais à 3 secondes du storyboard (1), je veux commencer le storyboard (2) et sortir du storyboard (1) sans aucune interaction de la part de l'utilisateur.

La seule chose que j'ai vue me permette de le faire, c'est lorsque l'utilisateur clique sur quelque chose. Je veux que ce soit automatique en fonction de la position du scénario actuel du storyboard (1).

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

Merci.

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

Était-ce utile?

La solution 3

Eh bien, j'ai trouvé une solution. Je viens de créer un nouveau fil pour attendre 3 secondes, puis un appel Invoke pour exécuter le storyboard à partir de ce fil.

    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

Faites vos délégués et fonctions thread-safe et vous le ferez fonctionner. C'est un bidule moche à mon avis, mais ça marche pour le moment.

Autres conseils

Normalement, pour contrôler les animations au cours de la timeline, 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 heures précises. 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 story-board à partir d'une animation. Cependant, vous pouvez obtenir le même résultat en disposant les deux story-boards sur la même ligne de temps et en commençant le story-board (2) avec un délai spécifique basé sur la durée du story-board (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 couleur commencera 1 seconde après la fin de l’animation en largeur. Cela pourrait valoir la peine d'essayer.

Merci Megakemp, c'est ce que j'avais peur de devoir faire. Je ne voulais pas avoir à gérer deux copies d'un scénario en XAML. Si je dois ajouter un contrôle et le gérer via le storyboard (1), je devrai me rappeler de copier et coller les modifications apportées à cet autre storyboard (2). Je suppose que ce sont les cerceaux que vous devez parcourir jusqu'à ce que la fonctionnalité que je recherche me soit fournie.

Maintenant, j’ai pensé à une autre idée à essayer mais j’ai été incapable d’obtenir la fonctionnalité. C’est mon idée ci-dessous, je peux mieux l’expliquer dans le code. Ce code ci-dessous ne sera pas compilé, 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 une idée à nous, n'hésitez pas à poster, je n'abandonne pas complètement cette idée.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top