动画边框控件的宽度

问题描述:

我试图在Windows 8 Metro应用程序中为Border控件的宽度设置动画效果。我已经成功地在动画边境其他属性,如不透明度:动画边框控件的宽度

private void Item_Tapped(object sender, RoutedEventArgs e) 
{ 
    var border = sender as Border; 

    var animation = new DoubleAnimation(); 
    animation.To = 0.0; 
    animation.Duration = new Duration(TimeSpan.FromSeconds(1)); 

    var storyboard = new Storyboard(); 
    storyboard.Children.Add(animation); 

    Storyboard.SetTarget(animation, border); 
    Storyboard.SetTargetProperty(animation, "Opacity"); 

    storyboard.Begin(); 
} 

但是,当我尝试动画控件的宽度:

private void Item_Tapped(object sender, RoutedEventArgs e) 
{ 
    var border = sender as Border; 

    var animation = new DoubleAnimation(); 
    animation.To = 600.0; 
    animation.Duration = new Duration(TimeSpan.FromSeconds(1)); 

    var storyboard = new Storyboard(); 
    storyboard.Children.Add(animation); 

    Storyboard.SetTarget(animation, border); 
    Storyboard.SetTargetProperty(animation, "Width"); 

    storyboard.Begin(); 
} 

什么也没有发生。

我能够在WPF中做到这一点,但不是在Windows 8中。这是Metro的限制或错误,还是我做错了什么?

谢谢

我不确定你在WPF中是如何工作的。根据http://msdn.microsoft.com/en-us/library/system.windows.media.animation.storyboard.targetproperty,目标属性必须是依赖项属性。根据http://msdn.microsoft.com/en-us/library/system.windows.controls.border,宽度不是依赖属性。

+0

我可以为WPF和SL中的Width属性设置动画,证明[here](http://www.silverlight.net/learn/creating-ui/animation-and-easing/animations-(silverlight-quickstart) #advanced_animations)。 不幸的是,这种技术在WinRT中看起来不起作用,所以你可能是正确的,宽度不是“有生命力的”。 谢谢 – 2012-08-06 19:08:37

+0

@phoog:你指向的文档实际上是说Width实际上是一个继承自FrameworkElement的DependencyProperty,所​​以这绝对不是该属性无法动画的原因。 http://msdn.microsoft.com/en-us/library/system.windows.frameworkelement.width – Murven 2013-07-25 03:00:39

+0

与Line.X1/Line.X2等相同的问题。(Windows.UI.Xaml.Shapes),在WPF中工作,不能在8.1下制作。 – 2014-02-01 01:06:33

我能够使它发挥作用启用EnableDependentAnimation

public static async Task Width(FrameworkElement obj, double doubleValue, int milliseconds) 
    { 
     var animation= new DoubleAnimation 
     { 
      To = doubleValue, 
      Duration = TimeSpan.FromMilliseconds(milliseconds), 
      EnableDependentAnimation = true// <== here 
     }; 

     Storyboard.SetTarget(animation, obj); 
     Storyboard.SetTargetProperty(animation, "Width"); 

     var sb = new Storyboard(); 
     sb.Children.Add(animation); 
     await sb.BeginAsync(); 
    } 

享受!