別のストーリーボードタイムライン内でストーリーボードを開始する
-
03-07-2019 - |
質問
2秒でいくつかの基本的なアニメーションを実行するストーリーボード(1)があります。ストーリーボード(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」があるように、すべてのアニメーションに対応するキーフレームアニメーションがあります。
アニメーション内から新しいストーリーボードを開始することはできないと思います。ただし、両方のストーリーボードを同じタイムラインに配置し、ストーリーボードの継続時間に基づいて特定の遅延でストーリーボードを開始することで、同じ結果を得ることができます(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でストーリーボードの2つのコピーを管理する必要はありませんでした。コントロールを追加し、storyboard(1)で管理する必要がある場合、この他のstoryboard(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
ご協力ありがとうございます。他の誰かが別の答えやより多くの洞察を持っている場合は、投稿することをheしないでください、私はまだこのアイデアを完全に放棄していません。