4

基本的なアニメーションを 2 秒で実行するストーリーボード (1) があります。storyboard(1) に、設定したすべてのプロパティ アニメーションを実行させたい (これはすべて正常に動作します)。しかし、ストーリーボード (1) の 3 秒で、ストーリーボード (2) を開始し、ユーザーの操作なしでストーリーボード (1) を終了したいと考えています。

これを可能にするのは、ユーザーが何かをクリックしたときだけです。現在のストーリーボード(1)タイムラインの位置に基づいて、これを自動化したいと考えています。

これが十分に理にかなっていることを願っています。もっと詳しく説明する必要がある場合はお知らせください。

ありがとう。

編集: XAML または VB.net 言語で回答を投稿してください。:)

4

3 に答える 3

7

通常、タイムラインでアニメーションを制御するには、「キーフレーム」を使用します。キーフレーム アニメーションを使用すると、特定の時間にアニメーション化するプロパティの特定の値を定義できます。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 秒後にカラー アニメーションが開始されます。試してみる価値があるかもしれません。

于 2008-10-15T15:15:40.613 に答える
0

Megakenp に感謝します。それが私がしなければならないことを恐れていたことです。XAML でストーリーボードの 2 つのコピーを管理する必要はありませんでした。コントロールを追加してストーリーボード (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

助けてくれてありがとう..そして、他の誰かが別の答えやより多くの洞察を持っている場合は、投稿することを躊躇しないでください.私はまだこの考えを完全に放棄していません.

于 2008-10-15T15:31:49.643 に答える
0

さて、私は解決策を思いつきました。3 秒間待機する新しいスレッドを生成し、そのスレッドからストーリーボードを実行する呼び出しを呼び出しました。

    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

スレッドセーフなデリゲートと関数を実行すると、機能します。私の意見では醜いハックですが、今のところ機能します。

于 2008-10-15T20:52:42.337 に答える