动画按钮大小,然后恢复为null

时间:2012-01-28 16:19:10

标签: windows-phone-7 xaml animation storyboard

我正在尝试创建一个动画,使其看起来像一个按钮翻过来,后面显示。所以我想要做的是:

1-使用BackgroundColor x显示按钮。 (该按钮现在Widthnull,属性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,但对我来说似乎不可能。

2 个答案:

答案 0 :(得分:1)

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

如果您尝试通过代码执行相同的操作,则可以执行此操作,但您需要知道框架在幕后执行的操作。

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

每个都可以有触发器 - 属性触发器   设置属性或启动动作,例如动画   当属性值更改或引发事件时;

  • EventTriggers和Storyboards 根据事件的发生开始一系列操作

如果您想了解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;