如何使用Storyboard和DoubleAnimation为UserControl对象设置动画?

时间:2009-11-24 12:17:36

标签: wpf animation user-controls storyboard

在我的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属性,因此失败。我怎样才能实现我的目标?

感谢。

2 个答案:

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

为了更新此问题,我最终解决了这个问题。正在创建DoubleAnimationStoryboard并在DispatcherTimer Tick事件处理程序中调用Storyboard.Begin()

诀窍是将调用分派给调用Storyboard.Begin()

的代理