別のストーリーボードタイムライン内でストーリーボードを開始する

StackOverflow https://stackoverflow.com/questions/202914

  •  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しないでください、私はまだこのアイデアを完全に放棄していません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top