Domanda

Ho uno storyboard (1) che esegue alcune animazioni di base in 2 secondi. Voglio che lo storyboard (1) esegua tutte le animazioni delle proprietà che ho impostato (tutto funziona bene). Ma a 3 secondi dallo storyboard (1) voglio iniziare lo storyboard (2) e uscire dallo storyboard (1) senza l'interazione dell'utente.

L'unica cosa che ho visto che mi permette di fare questo è quando l'utente fa clic su qualcosa. Voglio che questo sia automatico in base alla posizione della sequenza temporale dello storyboard (1) corrente.

Spero che abbia abbastanza senso. Per favore fatemi sapere se avete bisogno di me per spiegare qualcosa in modo più dettagliato.

Grazie.

Modifica: pubblica la risposta in XAML o VB.net. :)

È stato utile?

Soluzione 3

Beh, ho trovato una soluzione. Ho appena generato un nuovo thread per aspettare 3 secondi e poi ho fatto una chiamata Invoke per eseguire lo storyboard da quel 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

Proteggi i delegati e le funzioni del tuo thread e lo farai funzionare. Secondo me è un brutto hack, ma per ora funziona.

Altri suggerimenti

Normalmente per controllare le animazioni durante la sequenza temporale devi utilizzare i "fotogrammi chiave". Le animazioni dei fotogrammi chiave consentono di definire valori specifici per la proprietà che si sta animando in momenti specifici. In WPF ogni animazione ha un'animazione di fotogramma chiave corrispondente, come "DoubleAnimation" ha "DoubleAnimationUsingKeyFrames".

Non credo sia possibile avviare un nuovo storyboard all'interno di un'animazione. Tuttavia, è possibile ottenere lo stesso risultato disponendo entrambi gli storyboard sulla stessa sequenza temporale e avviando lo storyboard (2) con un ritardo specifico basato sulla durata dello storyboard (1). Qualcosa del tipo:

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

Qui l'animazione del colore inizierà 1 secondo al termine dell'animazione della larghezza. Potrebbe valere la pena provarlo.

Grazie Megakemp, ecco cosa avevo paura di dover fare. Non volevo dover gestire due copie di uno storyboard in XAML. Se devo aggiungere un controllo e gestirlo tramite storyboard (1), dovrò ricordare di copiare e incollare le modifiche su questo altro storyboard (2). Immagino che questi siano i cerchi che devi saltare fino a quando arriva la funzionalità che sto cercando.

Ora ho pensato a un'altra idea da provare ma non sono riuscito a ottenere la funzionalità. Questa è la mia idea qui sotto, posso spiegarla meglio nel codice .. questo codice qui sotto non verrà compilato, è solo per far capire il mio punto.

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

Grazie per il tuo aiuto .. e se qualcun altro ha un'altra risposta o ulteriori informazioni, non esitare a postare, non abbandonerò ancora completamente questa idea.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top