Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF如何轻松地在代码隐藏中链接动画?_C#_Wpf - Fatal编程技术网

C# WPF如何轻松地在代码隐藏中链接动画?

C# WPF如何轻松地在代码隐藏中链接动画?,c#,wpf,C#,Wpf,我有一张画布: <Canvas x:Name="testCanvas" Height="40" Width="460" VerticalAlignment="Top"> <Image Source="versus2-top-p1.png"/> <Label x:Name="testLabel" Content="TEST" /> </Canvas> 问题是动画没有链接。所有3行代码都在同一时间被触发。我想按顺序运行这三行代码: 将

我有一张画布:

<Canvas x:Name="testCanvas" Height="40" Width="460" VerticalAlignment="Top">
    <Image Source="versus2-top-p1.png"/>
    <Label x:Name="testLabel" Content="TEST" />
</Canvas>
问题是动画没有链接。所有3行代码都在同一时间被触发。我想按顺序运行这三行代码:

  • 将上边距移动到-40
  • 更改testLabel中的文本
  • 将上边距移动到0

  • 做这件事最简单的方法是什么?

    找到了答案。。。使用animation.Completed事件处理程序

        private void button_Click(object sender, RoutedEventArgs e)
        {
            ThicknessAnimation animate = new ThicknessAnimation(new Thickness(0, -40, 0, 0), TimeSpan.FromSeconds(1));
            animate.Completed += new EventHandler(animate_Completed);
    
            testCanvas.BeginAnimation(Canvas.MarginProperty, animate);
        }
    
        private void animate_Completed(object sender, EventArgs e)
        {
            testLabel.Content = "ANIMATION TEST";
    
            testCanvas.BeginAnimation(Canvas.MarginProperty,
                new ThicknessAnimation(new Thickness(0, 0, 0, 0), TimeSpan.FromSeconds(1))
            );
        }
    

    我想出来了。。。使用animation.Completed事件处理程序

        private void button_Click(object sender, RoutedEventArgs e)
        {
            ThicknessAnimation animate = new ThicknessAnimation(new Thickness(0, -40, 0, 0), TimeSpan.FromSeconds(1));
            animate.Completed += new EventHandler(animate_Completed);
    
            testCanvas.BeginAnimation(Canvas.MarginProperty, animate);
        }
    
        private void animate_Completed(object sender, EventArgs e)
        {
            testLabel.Content = "ANIMATION TEST";
    
            testCanvas.BeginAnimation(Canvas.MarginProperty,
                new ThicknessAnimation(new Thickness(0, 0, 0, 0), TimeSpan.FromSeconds(1))
            );
        }
    

    作为使用已完成事件启动下一个动画的代码隐藏替代方案,您可以将所有后续动画放在一个情节提要中,并设置它们的开始时间

    这样做的好处是,您不会得到一组方法,您可以使用故事板控制(开始、暂停、停止、加速)动画

    尽管如此,我仍然认为动画是XAML资源的一个更好的选择。为了将参数传递给动画,可以使用数据绑定,并且我认为XAML动画的可读性/可维护性优于C编码动画。
    private void button_Click(object sender, RoutedEventArgs e)
    {
        var moveTopUpDuration = TimeSpan.FromSeconds(1);
        var storyboard = new Storyboard();
    
        var moveTopUp = new ThicknessAnimation(
                            new Thickness(0, -40, 0, 0), 
                            moveTopUpDuration);
        Storyboard.SetTarget(moveTopUp, testCanvas);
        Storyboard.SetTargetProperty(moveTopUp, Canvas.MarginProperty);
        moveTopUp.Completed += MoveTopUpCompleted;
    
        var moveTopDown = new ThicknessAnimation(
                              new Thickness(0, 0, 0, 0),
                              TimeSpan.FromSeconds(1));
        Storyboard.SetTarget(moveTopDown, testCanvas);
        Storyboard.SetTargetProperty(moveTopDown, Canvas.MarginProperty);
        moveTopDown.BeginTime = moveTopUpDuration;
    
        storyboard.Childeren.Add(moveTopUp);
        storyboard.Childeren.Add(moveTopDown);       
    
        storyboard.Begin();
    }
    
    private void MoveTopUp_Completed(object sender, EventArgs e)
    {
        testLabel.Content = "ANIMATION TEST";
    }
    

    作为使用已完成事件启动下一个动画的代码隐藏替代方案,您可以将所有后续动画放在一个情节提要中,并设置它们的开始时间

    这样做的好处是,您不会得到一组方法,您可以使用故事板控制(开始、暂停、停止、加速)动画

    尽管如此,我仍然认为动画是XAML资源的一个更好的选择。为了将参数传递给动画,可以使用数据绑定,并且我认为XAML动画的可读性/可维护性优于C编码动画。
    private void button_Click(object sender, RoutedEventArgs e)
    {
        var moveTopUpDuration = TimeSpan.FromSeconds(1);
        var storyboard = new Storyboard();
    
        var moveTopUp = new ThicknessAnimation(
                            new Thickness(0, -40, 0, 0), 
                            moveTopUpDuration);
        Storyboard.SetTarget(moveTopUp, testCanvas);
        Storyboard.SetTargetProperty(moveTopUp, Canvas.MarginProperty);
        moveTopUp.Completed += MoveTopUpCompleted;
    
        var moveTopDown = new ThicknessAnimation(
                              new Thickness(0, 0, 0, 0),
                              TimeSpan.FromSeconds(1));
        Storyboard.SetTarget(moveTopDown, testCanvas);
        Storyboard.SetTargetProperty(moveTopDown, Canvas.MarginProperty);
        moveTopDown.BeginTime = moveTopUpDuration;
    
        storyboard.Childeren.Add(moveTopUp);
        storyboard.Childeren.Add(moveTopDown);       
    
        storyboard.Begin();
    }
    
    private void MoveTopUp_Completed(object sender, EventArgs e)
    {
        testLabel.Content = "ANIMATION TEST";
    }
    

    解决问题的最好方法是使用故事板。看看吧:解决问题的最好方法就是使用故事板。你能帮我把我想做的事情写在故事板上吗?你能帮我把我想做的事情写在故事板上吗?