我正在尝试创建一个动画,使其看起来像一个按钮翻过来,后面显示。所以我想要做的是:
1-使用BackgroundColor x显示按钮。 (该按钮现在Width
为null
,属性ActualWidth
确实有值。)
2-创建一个双重动画,将按钮的宽度更改为零。
DoubleAnimation widthAnimation = new DoubleAnimation();
widthAnimation.From = this.ActualWidth;
widthAnimation.To = 0;
widthAnimation.SpeedRatio = 3;
widthAnimation.Duration = TimeSpan.FromMilliseconds(800);
3-更改按钮的BackgroundColor。
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
,这会导致它失败到原始宽度。我怎么解决这个问题?我想再次将Width
设置回null
,但对我来说似乎不可能。
答案 0 :(得分:1)
您最好使用xaml样式和模板“声明”您想要的内容,并让WPF / Silverlight处理所有内容。
如果您尝试通过代码执行相同的操作,则可以执行此操作,但您需要知道框架在幕后执行的操作。
基本上你可以设置 - 样式以定义控件的某些属性的值 - DataTemplate,用于定义控件内容的可视化表示 - ControlTemplate定义控件的外观
每个都可以有触发器 - 属性触发器 设置属性或启动动作,例如动画 当属性值更改或引发事件时;
如果您想了解XAML样式和模板, 看看http://msdn.microsoft.com/en-us/library/ms745683.aspx 花一天时间学习并节省许多小时(或几天)的尝试,错误和挫折!
为了正确到达目的,在您的情况下,我认为您应该使用故事板。 见http://msdn.microsoft.com/en-us/library/ms742868.aspx 您还可以在其中找到与XAML示例等效的代码
答案 1 :(得分:0)
我想到了定位MaxWidth
而非实际Width
的想法。我现在使用KeyFrameCollection
在开始时将MaxWidth
设置为int.MaxValue(因此在使用自动反转时也是如此)。
它会正常工作,直到会有分辨率大于max 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;