4

我有一个故事板(1),可以在 2 秒内完成一些基本动画。我希望故事板(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

感谢 Megakemp,这就是我害怕做的事情。我不想在 XAML 中管理故事板的两个副本。如果我必须添加一个控件并通过情节提要(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 回答