【问题标题】:How to control a storyboard animation from C# and XAML如何从 C# 和 XAML 控制情节提要动画
【发布时间】:2021-08-25 08:11:59
【问题描述】:

网上有很多关于此的问题,但在阅读了这些问题以及有关动画控制的 MS 文档后,我无法从 C# 代码中的 XAML 事件触发器中模仿情节提要控制。

在这个 XAML 文件中,我有一个正在旋转的画布。我想为旋转添加交互性,

<Window x:Class="GraphicsBook.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:k="clr-namespace:GraphicsBook;assembly=Testbed2D"
    Title="2D Testbed"
    KeyDown="KeyDownHandler"
   Height="600"
   Width="600" >
    <DockPanel LastChildFill="True">

        <StackPanel x:Name="stack" DockPanel.Dock ="Top" Orientation="Vertical" Background="#ECE9D8">
            <Button Name="StartAnimationClick">Start animation</Button>
            <Button Name="StopAnimationClick" Click="stopAnimationClick">Stop animation</Button>
            <Canvas x:Name="Grid">
                <Canvas.RenderTransform>
                    <TransformGroup>
                        <RotateTransform x:Name="CanvasRotation" CenterX="300" CenterY="300" Angle="0"/>
                    </TransformGroup>
                </Canvas.RenderTransform>
            </Canvas>

            <StackPanel.Triggers>
                <EventTrigger RoutedEvent="Button.Click" SourceName="StartAnimationClick">
                    <BeginStoryboard Name="GridRotationStoryboard">
                        <Storyboard>
                            <DoubleAnimation
                                Storyboard.TargetName="CanvasRotation"
                                Storyboard.TargetProperty="Angle"
                                From="0.0" To="360.0"
                                Duration="00:00:10.00" RepeatBehavior="Forever"/>
                        </Storyboard>
                    </BeginStoryboard>
                </EventTrigger>
                <!--<EventTrigger RoutedEvent="Button.Click" SourceName="StopAnimationClick">
                    <StopStoryboard BeginStoryboardName="GridRotationStoryboard"/>
                </EventTrigger>-->
            </StackPanel.Triggers>
        </StackPanel>
    </DockPanel>
</Window>

被注释的事件触发器,

<!--<EventTrigger RoutedEvent="Button.Click" SourceName="StopAnimationClick">
                        <StopStoryboard BeginStoryboardName="GridRotationStoryboard"/>
                    </EventTrigger>-->

确实按预期工作,也就是说,如果我单击按钮,动画就会停止。但是,上面的 XAML 版本尝试在 C# 中复制此功能,但这不起作用。点击处理程序如下所示,

    private void stopAnimationClick(object sender, RoutedEventArgs e)
    {
        Debug.Print("Stop animation");
        // ???
    }

我无法控制??? 中的动画对象,无论我尝试什么技术来处理它。我一定是以某种方式错误地安装这些部件,但我看不出有什么问题。

【问题讨论】:

标签: c# wpf xaml


【解决方案1】:

您可以通过调用 BeginAnimation 并使用第二个参数 null 来模仿 EventTrigger 所做的事情:

private void stopAnimationClick(object sender, RoutedEventArgs e)
{
    CanvasRotation.BeginAnimation(RotateTransform.AngleProperty, null);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-14
    • 1970-01-01
    • 2014-06-16
    • 1970-01-01
    • 2017-12-17
    • 2010-10-01
    相关资源
    最近更新 更多