使用 System.Windows.Media.Animation 移动按钮动画

Posted

技术标签:

【中文标题】使用 System.Windows.Media.Animation 移动按钮动画【英文标题】:Shifting a Button Animation using System.Windows.Media.Animation 【发布时间】:2014-02-23 08:37:25 【问题描述】:

我的窗口中有一个Button,我如何使用 C# 中的代码来设置动画,使其向左移动 100 像素,一旦我点击它。

private void myButton_Click(object sender, System.Windows.RoutedEventArgs e)

    // TODO: Add event handler implementation here.
    DoubleAnimation _DoubleAnimation = new DoubleAnimation();
    _DoubleAnimation.From = 0;
    _DoubleAnimation.To = 100;
    _DoubleAnimation.Duration = new Duration(TimeSpan.FromSeconds(1));

    myButton.BeginAnimation(Button.RenderTransformOriginProperty, _DoubleAnimation);

【问题讨论】:

【参考方案1】:

如果要改变大小,这种情况下Animation中必须是WidthProperty

myButton.BeginAnimation(Button.WidthProperty, _DoubleAnimation);

为避免动画中的尖锐过渡,您必须明确设置Button的宽度:

<Button Name="myButton" 
        Width="30" 
        Content="Test"  
        Click="myButton_Click" />

并且在动画中只指定To 值:

private void myButton_Click(object sender, System.Windows.RoutedEventArgs e)

    DoubleAnimation _DoubleAnimation = new DoubleAnimation();
    _DoubleAnimation.To = 100;
    _DoubleAnimation.Duration = new Duration(TimeSpan.FromSeconds(1));

    myButton.BeginAnimation(Button.WidthProperty, _DoubleAnimation);

如果想在Animation中移动Button,可以使用ThicknessAnimation

感谢@Rohit Vats的评论

private void myButton_Click(object sender, System.Windows.RoutedEventArgs e)

    ThicknessAnimation animation = new ThicknessAnimation(new Thickness(0), 
                                                          new Thickness(100, 0, 0, 0), 
                                                          new Duration(new TimeSpan(0, 0, 1)),
                                                          FillBehavior.HoldEnd);

    myButton.BeginAnimation(Button.MarginProperty, animation);
 

【讨论】:

嘿@Anatoily 我猜OP想要将按钮向左移动100像素而不使用按钮的宽度。至少我可以从这个问题中推断出什么。因此,我也发布了我的答案以移动按钮,但如果需要宽度,您的解决方案可以正常工作。为你+1。 :) @Rohit Vats:是的,我不明白这个问题,抱歉。你的方案更适合OP。【参考方案2】:

如果您想将按钮向左移动 100 像素,则必须将边距设置为最后一个值的 -100,这显然 无法实现通过 DoubleAnimation,因为它只能为双精度值设置动画,而 Margin 的类型是厚度。

您可以使用 Storyboard 来实现:

Storyboard myStoryboard = new Storyboard();
ObjectAnimationUsingKeyFrames animation = new ObjectAnimationUsingKeyFrames();
animation.BeginTime = TimeSpan.FromSeconds(0);
Storyboard.SetTarget(animation, myButton);
Storyboard.SetTargetProperty(animation, new PropertyPath("Margin"));
double left = myButton.Margin.Left - 100;
DiscreteObjectKeyFrame keyFrame = new DiscreteObjectKeyFrame(new Thickness(left,
                                             0, 0, 0), TimeSpan.FromSeconds(1));
animation.KeyFrames.Add(keyFrame);
myStoryboard.Children.Add(animation);
myStoryboard.Begin();

对于平滑过渡,您可以做的是添加多个关键帧并以 0.1 秒的间隔播放它们。如果您需要更平滑的过渡,请将其分解为更小的间隔。

这就是你的做法:

Storyboard myStoryboard = new Storyboard();
ObjectAnimationUsingKeyFrames animation = new ObjectAnimationUsingKeyFrames();
animation.BeginTime = TimeSpan.FromSeconds(0);
Storyboard.SetTarget(animation, myButton);
Storyboard.SetTargetProperty(animation, new PropertyPath("Margin"));
for (int count = 1; count < 21; count++)

   double left = myButton.Margin.Left - (5 * count);
   DiscreteObjectKeyFrame keyFrame = new DiscreteObjectKeyFrame(new
                   Thickness(left, 0, 0, 0), TimeSpan.FromSeconds(0.05 * count));
   animation.KeyFrames.Add(keyFrame);

myStoryboard.Children.Add(animation);
myStoryboard.Begin();

【讨论】:

嗨,当动画开始时,它只是在 1 秒后从一个点跳到预期的结束点。我想要一个平稳的过渡。 @RStyle - 请查看答案中的更新以实现平滑过渡。 很好,不能使用双动画,因为它在 xml 中看起来更简单,我认为我可以在 c# 中使用。 DoubleAnimation 不可能。但是,您可以使用 ThicknessAnimation 来做到这一点。【参考方案3】:

这取决于您如何在页面上放置Button。如果您想按坐标布局元素(不推荐),您可以将按钮放在Canvas 上。然后你可以使用这样的代码:

<Canvas>
    <Button Canvas.Left="100" Canvas.Top="100" Name="btnOk" HorizontalAlignment="Center" VerticalAlignment="Center" Width="50" Click="BtnOk_OnClick">Ok</Button>
</Canvas>

和代码隐藏:

var doubleAnimation = new DoubleAnimation();
double left = Canvas.GetLeft(btnOk);
doubleAnimation.From = left;
doubleAnimation.To = left - 100;
doubleAnimation.Duration = new Duration(TimeSpan.FromSeconds(1));
btnOk.BeginAnimation(Canvas.LeftProperty, doubleAnimation);

【讨论】:

以上是关于使用 System.Windows.Media.Animation 移动按钮动画的主要内容,如果未能解决你的问题,请参考以下文章

在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?

今目标使用教程 今目标任务使用篇

Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)

MySQL db 在按日期排序时使用“使用位置;使用临时;使用文件排序”

使用“使用严格”作为“使用强”的备份

Kettle java脚本组件的使用说明(简单使用升级使用)