Wpf 如何使用故事板和DoubleAnimation设置UserControl对象的动画?
在我的WPF应用程序中,我有一个包含一些UserControl对象的Canvas对象 我希望使用Wpf 如何使用故事板和DoubleAnimation设置UserControl对象的动画?,wpf,animation,user-controls,storyboard,Wpf,Animation,User Controls,Storyboard,在我的WPF应用程序中,我有一个包含一些UserControl对象的Canvas对象 我希望使用DoubleAnimation在画布中设置UserControl对象的动画,以便它们从画布的右侧移动到画布的左侧。到目前为止,我就是这样做的(通过将UserControl对象传递到函数中): 然而,这不允许我暂停动画,所以我考虑使用故事板来代替,但我不确定如何实现这一点。到目前为止,这是我的尝试: private void Animate(FrameworkElement e) {
DoubleAnimation
在画布中设置UserControl对象的动画,以便它们从画布的右侧移动到画布的左侧。到目前为止,我就是这样做的(通过将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
};
Storyboard stb = new Storyboard();
Storyboard.SetTarget(ani, e);
Storyboard.SetTargetProperty(ani, "Left");
stb.Children.Add(ani);
stb.Begin();
}
当然,这会失败,因为UserControl没有Left
属性。我怎样才能实现我的目标
谢谢。尼奥
我想我已经解决了你的问题。以下是我所做的:
我创建了一个网格,其中包含行。在第一行,我放置了一个堆栈面板来对齐开始、暂停和恢复按钮。在第二行中,我放置了一个矩形(将设置动画的对象)。然后,我为开始、暂停和恢复按钮连接了一些触发器,以开始、暂停和恢复动画。以下是我使用的代码:
<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>
这是我的结果输出:我已将代码添加到我的项目中供您下载。我还压缩了源代码,可从以下地址获得: 此外,这里有一个非常好的WPF动画参考: 我希望这有帮助
谢谢 为了不断更新这个问题,我最终解决了这个问题。正在创建
DoubleAnimation
和Storyboard
,并在Dispatchermer Tick事件处理程序中调用Storyboard.Begin()
诀窍是将调用分派给调用
故事板.Begin()
的代理。不幸的是,我需要以编程方式(在C#代码后面)执行此操作,并且只希望修改我的工作动画函数以将DoubleAnimation对象附加到故事板对象。您的代码对于XAML实现启动/暂停/恢复功能来说似乎很好,但我有一个更简单的要求-将DoubleAnimation对象附加到情节提要对象,并指定一个属性(在Storyboard.SetTargetProperty中)以使目标对象在画布上从右向左移动。这可能吗?@Peretz我的最后一条评论中给出了线索——使用dispatcher将调用放到UI线程上。
<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>