Wpf 如何使用故事板和DoubleAnimation设置UserControl对象的动画?

Wpf 如何使用故事板和DoubleAnimation设置UserControl对象的动画?,wpf,animation,user-controls,storyboard,Wpf,Animation,User Controls,Storyboard,在我的WPF应用程序中,我有一个包含一些UserControl对象的Canvas对象 我希望使用DoubleAnimation在画布中设置UserControl对象的动画,以便它们从画布的右侧移动到画布的左侧。到目前为止,我就是这样做的(通过将UserControl对象传递到函数中): 然而,这不允许我暂停动画,所以我考虑使用故事板来代替,但我不确定如何实现这一点。到目前为止,这是我的尝试: private void Animate(FrameworkElement e) {

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

我希望使用
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>