Pergunta

Eu tenho um storyboard (1) que faz algumas animações básicas em 2 segundos. Eu quero o storyboard (1) para fazer todas as animações de propriedade eu configurá-lo para fazer (isso tudo muito bem funciona). Mas em 3 segundos de storyboard (1) Quero começar storyboard (2) e saia storyboard (1), sem interação do usuário em tudo.

A única coisa que eu vi que me permite fazer isso é quando o usuário clica em alguma coisa. Eu quero que isso seja automático com base na posição do atual storyboard (1) linha de tempo.

Espero que isso faz bastante sentido. Por favor, deixe-me saber se você precisar de mim para explicar algo com mais detalhes.

Graças.

Edit: Por favor, postar a resposta em XAML ou VB.net idioma. :)

Foi útil?

Solução 3

Bem, eu vim com uma solução. Eu só gerou uma nova thread para esperar por 3 segundos e, em seguida, fez uma chamada Invoke para executar o storyboard de esse segmento.

    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

Os seus delegados segmento seguro e funções e você vai ter que trabalhar. É um corte feio na minha opinião, mas funciona para agora.

Outras dicas

Normalmente, a fim de animações de controle durante o cronograma você usaria "keyframes". animações de quadro-chave permitem definir valores específicos para o imóvel que você está animando em horários específicos. Em WPF cada animação tem uma animação quadro-chave correspondente, como 'DoubleAnimation' tem 'DoubleAnimationUsingKeyFrames'.

Eu não acho que é possível para iniciar um novo storyboard de dentro de uma animação. No entanto poderia conseguir o mesmo resultado, tendo ambas as representações visuais sobre a mesma linha do tempo e a partir de storyboard (2) com um atraso específico com base na duração de encenação (1). Algo como:

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

Aqui, a animação da cor vai começar a 1 segundo após a animação largura foi concluída. Poderia ser vale a pena tentar.

Graças Megakemp, é isso que eu estava com medo de ter que fazer. Eu não quero ter que gerenciar duas cópias de um storyboard em XAML. Se eu tiver de adicionar um controle e gerenciá-lo através de storyboard (1) eu vou ter que lembrar de copiar e colar as alterações a esta outra storyboard (2). Eu acho que esses são os aros você tem que saltar através de até que a funcionalidade vem que eu estou procurando.

Agora eu pensava em outra idéia para tentar, mas não foi capaz de obter a funcionalidade. Esta é a minha ideia abaixo, eu posso explicar isso melhor no código .. este código abaixo não irá compilar, é apenas para obter o meu ponto de vista.

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

Obrigado por sua ajuda .. e se alguém tem outra resposta ou mais discernimento por favor, não hesite em postar, eu não estou abandonando essa idéia completamente ainda.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top