2008-10-14 10 views
4

我有一個在2秒內完成一些基本動畫的storyboard(1)。我想要故事板(1)做所有我設定的屬性動畫(這一切都正常)。但在故事板(3)3秒鐘後,我想開始故事板(2)並退出故事板(1),而無需用戶互動。在另一個Storyboards時間軸中啓動Storyboard

只有我見過的事情允許我這樣做是當用戶點擊某個東西時。我希望這是基於當前故事板(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'。

我不認爲有可能從動畫中開始新的故事板。然而,通過在同一時間線上放置兩個故事板並根據故事板的持續時間(1)以特定延遲開始故事板(2),可以達到相同的效果。例如:

<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中管理故事板的兩個副本。如果我不得不添加一個控件並通過storyboard(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

開始延遲在故事板對象本身上設置,因此他需要有兩個副本,一個有延遲,另一個沒有。 – 2008-10-15 16:17:11

相關問題