2008-10-14 3 views
4

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

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

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

Спасибо.

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

ответ

0

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

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

6

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

Спасибо 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 

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

+0

Вам не нужно управлять двумя копиями, просто используйте сделать раскадровку ресурсом и обратитесь к нему дважды! – 2008-10-15 15:34:45

+0

Задержка запуска устанавливается на самом объекте Storyboard, поэтому ему нужно будет иметь две копии: одну с задержкой и одну без нее. – 2008-10-15 16:17:11

Смежные вопросы