Запустите Раскадровку на другой временной шкале раскадровки

StackOverflow https://stackoverflow.com/questions/202914

  •  03-07-2019
  •  | 
  •  

Вопрос

У меня есть раскадровка (1), которая выполняет некоторые базовые анимации за 2 секунды.Я хочу, чтобы раскадровка (1) выполняла все анимации свойств, для которых я ее настроил (все это работает нормально).Но через 3 секунды после начала раскадровки (1) я хочу запустить раскадровку (2) и выйти из раскадровки (1) вообще без взаимодействия с пользователем.

Единственное, что я видел, что позволяет мне делать это, - это когда пользователь нажимает на что-то.Я хочу, чтобы это было автоматически в зависимости от положения текущей временной шкалы раскадровки (1).

Я надеюсь, что в этом есть достаточный смысл.Пожалуйста, дайте мне знать, если вам нужно, чтобы я объяснил что-то более подробно.

Спасибо.

Редактировать:Пожалуйста, опубликуйте ответ на языке XAML или VB.net.:)

Это было полезно?

Решение 3

Что ж, я нашел решение.Я просто создал новый поток, подождал 3 секунды, а затем выполнил вызов Invoke для запуска раскадровки из этого потока.

    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

Используйте свои потокобезопасные делегаты и функции, и у вас все заработает.На мой взгляд, это уродливый взлом, но пока он работает.

Другие советы

Обычно для управления анимацией на временной шкале вы бы использовали "ключевые кадры".Анимация ключевых кадров позволяет вам определить конкретные значения для свойства, которое вы анимируете в определенное время.В WPF каждая анимация имеет соответствующую анимацию ключевого кадра, например, 'DoubleAnimation' имеет 'DoubleAnimationUsingKeyFrames'.

Я не думаю, что возможно запустить новую раскадровку из анимации.Однако вы могли бы добиться того же результата, разместив обе раскадровки на одной временной шкале и запустив раскадровку (2) с определенной задержкой, основанной на продолжительности раскадровки (1).Что -то вроде:

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

Здесь цветовая анимация начнется через 1 секунду после завершения анимации ширины.Возможно, стоит попробовать.

Спасибо Megakemp, это то, чего я боялся, что мне придется это сделать.Я не хотел управлять двумя копиями раскадровки в XAML.Если мне нужно добавить элемент управления и управлять им через раскадровку (1), мне нужно будет не забыть скопировать и вставить изменения в эту другую раскадровку (2).Я предполагаю, что это те обручи, через которые вам нужно перепрыгнуть, пока не появится функциональность, которую я ищу.

Теперь мне пришла в голову еще одна идея, которую можно попробовать, но я не смог получить необходимую функциональность.Это моя идея ниже, я могу лучше объяснить ее в коде..приведенный ниже код не будет компилироваться, он просто для того, чтобы донести мою точку зрения.

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

Спасибо за вашу помощь..и если у кого-то еще есть другой ответ или больше информации, пожалуйста, не стесняйтесь публиковать, я пока не отказываюсь от этой идеи полностью.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top