2

在我的 WPF 应用程序中,我有一个包含一些 UserControl 对象的 Canvas 对象。

我希望在 Canvas 中为 UserControl 对象设置动画,DoubleAnimation以便它们从 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);
    }

但是,这不允许我暂停动画,所以我考虑使用情节提要来代替,但我不知道如何实现这一点。到目前为止,这是我的尝试:

    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属性。我怎样才能实现我所追求的?

谢谢。

4

2 回答 2

2

尼奥,

我想我已经解决了你的问题。这是我所做的:

我创建了一个网格,其中包含行。在第一行,我放置了一个堆栈面板来对齐我的开始、暂停、恢复按钮。在第二行,我放置了一个矩形(我的动画对象)。然后,我为开始、暂停和恢复按钮连接了一些触发器,以启动、暂停和恢复动画。这是我使用的代码:

<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>

这是我的结果输出:
输出 http://img34.imageshack.us/img34/5619/1789718.jpg

我已将代码添加到我的Google 代码项目中供您下载。我还压缩了源代码,可在以下地址获得:

http://stackoverflow-answers-by-scott.googlecode.com/files/1789718.zip

此外,这里是 WPF 动画的一个很好的参考:

http://dotnetslackers.com/articles/wpf/IntroductionToWPFAnimations.aspx

我希望这有帮助,

谢谢!

于 2009-11-24T17:31:50.397 回答
0

只是为了保持这个问题的更新,我最终解决了这个问题。和在 DispatcherTimer Tick 事件处理程序DoubleAnimationStoryboard被创建和Storyboard.Begin()调用。

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

于 2010-05-24T17:29:27.527 回答