Pregunta

Tengo un guión gráfico (1) que hace algunas animaciones básicas en 2 segundos. Quiero que el guión gráfico (1) haga todas las animaciones de propiedades para las que lo he configurado (todo esto funciona bien). Pero a los 3 segundos en el guión gráfico (1), quiero comenzar el guión gráfico (2) y salir del guión gráfico (1) sin la interacción del usuario.

Lo único que he visto que me permite hacer esto es cuando el usuario hace clic en algo. Quiero que esto sea automático basado en la posición del guión gráfico actual (1).

Espero que esto tenga suficiente sentido. Déjeme saber si necesita que le explique algo con más detalle.

Gracias.

Editar: publique la respuesta en XAML o VB.net. :)

¿Fue útil?

Solución 3

Bueno, se me ocurrió una solución. Acabo de generar un nuevo hilo para esperar 3 segundos y luego hice una llamada Invoke para ejecutar el guión gráfico de ese hilo.

    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

Haz tus delegados y funciones seguras de hilos, y lo harás funcionar. Es un truco feo en mi opinión, pero funciona por ahora.

Otros consejos

Normalmente, para controlar las animaciones durante la línea de tiempo, utilizarías " fotogramas clave " ;. Las animaciones de fotogramas clave le permiten definir valores específicos para la propiedad que está animando en momentos específicos. En WPF, cada animación tiene una animación de fotograma clave correspondiente, como 'DoubleAnimation' tiene 'DoubleAnimationUsingKeyFrames'.

No creo que sea posible comenzar un nuevo guión gráfico desde una animación. Sin embargo, puede lograr el mismo resultado si tiene dos guiones gráficos en la misma línea de tiempo y un guión gráfico inicial (2) con un retraso específico basado en la duración del guión gráfico (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>

Aquí, la animación en color comenzará 1 segundo después de que la animación de ancho haya terminado. Podría valer la pena intentarlo.

Gracias, Megakemp, eso es lo que temía tener que hacer. No quería tener que administrar dos copias de un guión gráfico en XAML. Si tengo que agregar un control y administrarlo mediante el guión gráfico (1), tendré que acordarme de copiar y pegar los cambios en este otro guión gráfico (2). Supongo que esos son los aros por los que tienes que saltar hasta que llegue la funcionalidad que estoy buscando.

Ahora pensé en otra idea para probar pero no pude obtener la funcionalidad. Esta es mi idea a continuación, puedo explicarlo mejor en el código ... este código a continuación no se compilará, es solo para expresar mi 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

Gracias por su ayuda ... y si alguien más tiene otra respuesta o más información, no dude en publicar, no estoy abandonando esta idea por completo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top