Windows phone 7 设置按钮大小的动画,然后恢复为空

Windows phone 7 设置按钮大小的动画,然后恢复为空,windows-phone-7,xaml,animation,storyboard,Windows Phone 7,Xaml,Animation,Storyboard,我正在尝试创建一个动画,使它看起来像一个按钮翻转和背面显示。所以我想做的是: 1-显示背景色为x的按钮。(按钮现在的宽度为null,属性ActualWidth确实有一个值。) 2-创建将按钮宽度更改为零的双动画 DoubleAnimation widthAnimation = new DoubleAnimation(); widthAnimation.From = this.ActualWidth; widthAnimation.To = 0; widthAnimation.SpeedRatio

我正在尝试创建一个动画,使它看起来像一个按钮翻转和背面显示。所以我想做的是:

1-显示背景色为x的按钮。(按钮现在的
宽度
null
,属性
ActualWidth
确实有一个值。)

2-创建将按钮宽度更改为零的双动画

DoubleAnimation widthAnimation = new DoubleAnimation();
widthAnimation.From = this.ActualWidth;
widthAnimation.To = 0;
widthAnimation.SpeedRatio = 3;
widthAnimation.Duration = TimeSpan.FromMilliseconds(800);
3-更改按钮的背景颜色

ColorAnimation colorAnimation = new ColorAnimation();
colorAnimation.From = State ? _xColor : _yColor;
colorAnimation.To = State ? _yColor : _xColor;
colorAnimation.BeginTime = TimeSpan.FromMilliseconds(400);
colorAnimation.Duration = TimeSpan.Zero;
4-将宽度更改回其原始值

widthAnimation.AutoReverse = true;

问题在于,当动画运行两次时,动画在设置动画时会读取
this.ActualWidth
,这会导致动画无法达到原始宽度。我怎样才能解决这个问题?我想再次将
宽度
设置为
,但我觉得这是不可能的

您最好使用xaml样式和模板来“声明”您想要的内容,并让WPF/Silverlight来处理所有问题

如果您试图通过代码来做同样的事情,那么您可以做到,但是您需要知道框架在幕后做了什么

基本上你可以设置 -用于定义控件某些属性的值的样式 -DataTemplate定义控件内容的可视表示形式 -ControlTemplate来定义控件的外观

每个都可以有触发器 -属性触发器 设置属性或启动动作(如动画)的步骤 属性值更改或引发事件时

  • 事件触发器和故事板 根据事件的发生启动一组操作
如果您想了解XAML样式和模板, 看看 花一天的时间学习,并节省许多小时(或几天)的尝试、错误和挫折

直截了当地说,在你的情况下,我认为你应该使用故事板。 看见
在这里,您还可以找到与XAML示例等价的代码

我想到了将
MaxWidth
作为目标,而不是实际的
Width
。现在,我使用了一个
KeyFrameCollection
,它在开始时将
MaxWidth
设置为int.MaxValue(在使用自动翻转时在结束时也是如此)

它可以正常工作,直到出现分辨率大于最大int值的手机

守则:

DoubleAnimationUsingKeyFrames widthAnimation = new DoubleAnimationUsingKeyFrames();
widthAnimation.KeyFrames.Add(new DiscreteDoubleKeyFrame()
{
    KeyTime = TimeSpan.Zero,
    Value = int.MaxValue,
});
widthAnimation.KeyFrames.Add(new LinearDoubleKeyFrame()
{
    KeyTime = TimeSpan.FromMilliseconds(1),
    Value = ActualWidth,
});
widthAnimation.KeyFrames.Add(new LinearDoubleKeyFrame()
{
    KeyTime = TimeSpan.FromMilliseconds(400),
    Value = 0,
});
widthAnimation.Duration = TimeSpan.FromMilliseconds(400);
widthAnimation.AutoReverse = true;

您是否尝试过先将
this.ActualWidth
存储在临时变量中?