Frage

Ich habe ein Drehbuch (1), die einige grundlegende Animationen in 2 Sekunden der Fall ist. Ich möchte das Storyboard (1) alle Eigenschaft Animationen tun ich es eingerichtet haben zu tun (dies alles funktioniert gut). Aber bei 3 Sekunden in das Storyboard (1) Ich mag Drehbuch beginnen (2) und Ausgang Storyboard (1) ohne Interaktion mit dem Benutzer überhaupt.

Das Einzige, was ich gesehen habe, dass mir dies tun können, wenn der Benutzer auf etwas klickt. Ich möchte dies auf der Grundlage der Position des aktuellen Storyboard (1) Timeline automatisch sein.

Ich hoffe, dass dies genug Sinn macht. Bitte lassen Sie mich wissen, wenn Sie mich brauchen, um etwas genauer zu erklären.

Danke.

Edit: Bitte senden Sie die Antwort in XAML oder VB.net Sprache. :)

War es hilfreich?

Lösung 3

Nun kam ich mit einer Lösung auf. Ich gelaicht nur einen neuen Thread für 3 Sekunden warten und dann ein Invoke rief das Storyboard aus diesem Thread ausgeführt werden.

    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

Haben Ihre Thread-sicher Delegierten und Funktionen und Sie haben es zu arbeiten. Es ist ein hässlicher Hack meiner Meinung nach, aber es funktioniert jetzt.

Andere Tipps

Normalerweise, um Animationen während der Zeitleiste zu steuern, würden Sie „Keyframes“ verwenden. Keyframe-Animationen können Sie bestimmte Werte für die Eigenschaft definieren Sie zu bestimmten Zeiten animieren. In WPF jede Animation eine entsprechende Keyframe-Animation hat, wie 'Double' hat 'DoubleAnimationUsingKeyFrames'.

Ich glaube nicht, es ist möglich, eine neue Storyboard aus einer Animation zu starten. Allerdings könnte man das gleiche Ergebnis, indem beide Storyboards, auf der gleichen Timeline und Startstoryboard (2) mit einer bestimmten Verzögerung basierend auf der Dauer des Storyboard (1) erreichen. So etwas wie:

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

Hier ist die Farbanimation startet 1 Sekunde nach der Breite Animation beendet ist. Es könnte einen Versuch wert sein.

Danke Megakemp, ist das, was ich habe Angst zu tun zu haben. Ich wollte nicht haben zwei Kopien eines Storyboard in XAML zu verwalten. Wenn ich ein Steuerelement hinzuzufügen haben und verwalten sie über Storyboard (1) Ich muss daran denken, die Änderungen an dieser anderen Storyboard kopieren und (2). Ich denke, das sind die Reifen Sie durch springen müssen, bis die Funktionalität kommt, dass ich suche.

Nun habe ich von einer anderen Idee zu denken, um zu versuchen, war aber nicht in der Lage, die Funktionalität zu erhalten. Das ist meine Idee unten, ich es besser in Code erklären kann .. das unter Code wird nicht kompiliert, es ist nur über meinen Punkt zu gelangen.

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

Danke für Ihre Hilfe .. und wenn jemand eine andere Antwort oder mehr Einsicht hat, zögern Sie bitte nicht zu schreiben, ich diese Idee nicht aufgegeben vollständig vor.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top