在另一个Storyboard时间轴中启动Storyboard

时间:2008-10-14 21:25:06

标签: wpf animation storyboard

我有一个故事板(1),可在2秒内完成一些基本动画。我希望故事板(1)能够完成我设置的所有属性动画(这一切都很好)。但是在故事板的3秒钟(1)我想开始故事板(2)并退出故事板(1)而根本没有用户交互。

我所看到的只允许我这样做的是当用户点击某些内容时。我希望这是基于当前故事板(1)时间轴的位置自动生成的。

我希望这足够了。如果您需要我更详细地解释一下,请告诉我。

感谢。

编辑:请以XAML或VB.net语言发布答案。 :)

3 个答案:

答案 0 :(得分: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秒开始。值得一试。

答案 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

感谢您的帮助..如果有其他人有其他答案或更多见解,请不要犹豫发帖,我还没有完全放弃这个想法。

答案 2 :(得分: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

你的线程安全代理和功能,你会让它工作。在我看来这是一个丑陋的黑客,但它现在有用。