在我的WPF应用程序中,我有一个包含一些UserControl对象的Canvas对象。
我希望使用DoubleAnimation
为Canvas中的UserControl对象设置动画,以便它们从Canvas的右侧到Canvas的左侧。这就是我到目前为止的方法(通过将UserControl对象传递给函数):
private void Animate(FrameworkElement e)
{
DoubleAnimation ani = new DoubleAnimation()
{
From = _container.ActualWidth,
To = 0.0,
Duration = new Duration(new TimeSpan(0, 0, 10),
TargetElement = e
};
TranslateTransform trans = new TranslateTransform();
e.RenderTransform = trans;
trans.BeginAnimation(TranslateTransform.XProperty, ani, HandoffBehavior.Compose);
}
但是,这不允许我暂停动画,所以我考虑使用Storyboard来做这个,但我不知道如何实现它。到目前为止,这是我的尝试:
private void Animate(FrameworkElement e)
{
DoubleAnimation ani = new DoubleAnimation()
{
From = _container.ActualWidth,
To = 0.0,
Duration = new Duration(new TimeSpan(0, 0, 10),
TargetElement = e
};
Storyboard stb = new Storyboard();
Storyboard.SetTarget(ani, e);
Storyboard.SetTargetProperty(ani, "Left");
stb.Children.Add(ani);
stb.Begin();
}
当然,由于UserControl没有Left
属性,因此失败。我怎样才能实现我的目标?
感谢。
答案 0 :(得分:2)
Neo,
我想我已经解决了你的问题。这就是我所做的:
我创建了一个网格,其中包含行。在第一行中,我放置了一个堆栈面板来对齐我的开始,暂停,恢复按钮。在第二行,我放置了一个矩形(我的对象将动画)。然后,我为启动,暂停和恢复按钮连接了一些触发器,以启动,暂停和恢复动画。这是我使用的代码:
<Window x:Class="Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<Grid>
<Grid.Triggers>
<EventTrigger SourceName="StartBtn" RoutedEvent="Button.Click">
<EventTrigger.Actions>
<BeginStoryboard x:Name="MyStoryboard">
<Storyboard >
<DoubleAnimation Storyboard.TargetName="MovingRect" Storyboard.TargetProperty="RenderTransform.(TranslateTransform.X)" From="0" To="250" AutoReverse="True" RepeatBehavior="Forever"/>
</Storyboard>
</BeginStoryboard>
</EventTrigger.Actions>
</EventTrigger>
<EventTrigger SourceName="StopBtn" RoutedEvent="Button.Click" >
<PauseStoryboard BeginStoryboardName="MyStoryboard" />
</EventTrigger>
<EventTrigger SourceName="ResumeBtn" RoutedEvent="Button.Click" >
<ResumeStoryboard BeginStoryboardName="MyStoryboard" />
</EventTrigger>
</Grid.Triggers>
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition />
</Grid.RowDefinitions>
<StackPanel Orientation="Horizontal" Grid.Row="0">
<Button x:Name="StartBtn" Content="Start" Width="100" />
<Button x:Name="StopBtn" Content="Pause" Width="100" />
<Button x:Name="ResumeBtn" Content="Resume" Width="100" />
</StackPanel>
<Rectangle Name="MovingRect" Fill="Red" Width="50" Height="25" Grid.Row="2" HorizontalAlignment="Left">
<Rectangle.RenderTransform>
<TranslateTransform X="0" Y="0" />
</Rectangle.RenderTransform>
</Rectangle>
</Grid>
</Window>
这是我的结果输出:
Output http://img34.imageshack.us/img34/5619/1789718.jpg
我已将代码添加到我的Google Code项目中供您下载。我还压缩了源代码,可以在以下地址获得:
http://stackoverflow-answers-by-scott.googlecode.com/files/1789718.zip
此外,这里有一个非常好的WPF动画参考:
http://dotnetslackers.com/articles/wpf/IntroductionToWPFAnimations.aspx
我希望这有帮助,
答案 1 :(得分:0)
为了更新此问题,我最终解决了这个问题。正在创建DoubleAnimation
和Storyboard
并在DispatcherTimer Tick事件处理程序中调用Storyboard.Begin()
。
诀窍是将调用分派给调用Storyboard.Begin()
。