Запустите раскадровку на другой шкале времени - PullRequest
4 голосов
/ 15 октября 2008

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

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

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

Спасибо.

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

Ответы [ 3 ]

6 голосов
/ 15 октября 2008

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

0 голосов
/ 16 октября 2008

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

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

0 голосов
/ 15 октября 2008

Спасибо, Мегакемп, это то, чего я боялся делать. Я не хотел управлять двумя копиями раскадровки в 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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...