Начать раскадровку на другой временной шкале раскадровки

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

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

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

Спасибо.

Обновлено: отправьте ответ на языке XAML или VB.net. :)

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
0
5 779
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Обычно для управления анимацией на временной шкале используются «ключевые кадры». Анимация по ключевым кадрам позволяет вам определять определенные значения для свойства, которое вы анимируете в определенное время. В 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

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

Вам не нужно управлять двумя копиями, просто сделайте раскадровку ресурсом и дважды обратитесь к нему!

Bob King 15.10.2008 19:34

Задержка запуска задается в самом объекте Storyboard, поэтому у него должно быть две копии, одна с задержкой, а другая без.

Enrico Campidoglio 15.10.2008 20:17

Боб Кинг, представьте, пожалуйста, пример вашего решения, чтобы я мог лучше понять, о чем вы говорите. Megakemp, ты на той же странице, что и мои мысли.

ScottN 15.10.2008 21:29
Ответ принят как подходящий

Я нашел решение. Я просто создал новый поток для ожидания в течение 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

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

Да, всегда жаль, когда вы не можете решить проблему пользовательского интерфейса на 100% в XAML и вместо этого используете императивный код.

Enrico Campidoglio 20.10.2008 18:14

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