我有一个故事板(1),可在2秒内完成一些基本动画。我希望故事板(1)能够完成我设置的所有属性动画(这一切都很好)。但是在故事板的3秒钟(1)我想开始故事板(2)并退出故事板(1)而根本没有用户交互。
我所看到的只允许我这样做的是当用户点击某些内容时。我希望这是基于当前故事板(1)时间轴的位置自动生成的。
我希望这足够了。如果您需要我更详细地解释一下,请告诉我。
感谢。
编辑:请以XAML或VB.net语言发布答案。 :)
答案 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
你的线程安全代理和功能,你会让它工作。在我看来这是一个丑陋的黑客,但它现在有用。