2011-07-12 18 views
0

有一些真正的头部划伤在这里,因为我似乎无法想象为什么我得到的动画目标没有指定的错误。我创建了一个静态类,用于展示出许多小火灾“刻录”的故事板。然后,我会根据用户的需求创建尽可能多的火灾,并为其分配一个新的故事板,全部在Csharp中。然后,我开始故事板,但正如我所说,我不断收到这个错误,我不明白为什么。这是故事板创建类,当我尝试调用它时。动画目标未指定问题 - Silverlight故事板

public static class FireStoryboard 
{ 
    public static Storyboard fireStoryboard(UIElement target) 
    { 
     Storyboard s = new Storyboard(); 
     s.RepeatBehavior = RepeatBehavior.Forever; 

     DoubleAnimationUsingKeyFrames scaleY = new DoubleAnimationUsingKeyFrames(); 
     Storyboard.SetTarget(scaleY, target); 
     scaleY.SetValue(Storyboard.TargetPropertyProperty, new PropertyPath("(UIElement.RenderTransform).(CompositeTransform.ScaleY)"));    
     EasingDoubleKeyFrame e1 = new EasingDoubleKeyFrame(); 
     e1.KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromSeconds(1)); 
     e1.Value = 1.8; 
     e1.EasingFunction = new BounceEase() { EasingMode = System.Windows.Media.Animation.EasingMode.EaseInOut }; 
     EasingDoubleKeyFrame e2 = new EasingDoubleKeyFrame(); 
     e2.KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromSeconds(2)); 
     e1.Value = 1; 
     e2.EasingFunction = new BounceEase() { EasingMode = System.Windows.Media.Animation.EasingMode.EaseInOut }; 
     scaleY.KeyFrames.Add(e1); 
     scaleY.KeyFrames.Add(e2); 

     DoubleAnimationUsingKeyFrames translateY = new DoubleAnimationUsingKeyFrames(); 
     Storyboard.SetTarget(translateY, target); 
     translateY.SetValue(Storyboard.TargetPropertyProperty, new PropertyPath("(UIElement.RenderTransform).(CompositeTransform.TranslateY)"));    
     EasingDoubleKeyFrame e3 = new EasingDoubleKeyFrame(); 
     e3.KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromSeconds(1)); 
     e3.Value = -4; 
     e3.EasingFunction = new BounceEase() { EasingMode = System.Windows.Media.Animation.EasingMode.EaseInOut }; 
     EasingDoubleKeyFrame e4 = new EasingDoubleKeyFrame(); 
     e4.KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromSeconds(2)); 
     e4.Value = 0; 
     e4.EasingFunction = new BounceEase() { EasingMode = System.Windows.Media.Animation.EasingMode.EaseInOut }; 
     translateY.KeyFrames.Add(e3); 
     translateY.KeyFrames.Add(e4); 

     DoubleAnimationUsingKeyFrames opacity = new DoubleAnimationUsingKeyFrames(); 
     Storyboard.SetTarget(opacity, target); 
     opacity.SetValue(Storyboard.TargetPropertyProperty, new PropertyPath("UIElement.Opacity")); 
     EasingDoubleKeyFrame e5 = new EasingDoubleKeyFrame(); 
     e5.KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromSeconds(0)); 
     e5.Value = 0.7; 
     EasingDoubleKeyFrame e6 = new EasingDoubleKeyFrame(); 
     e6.KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromSeconds(1)); 
     e6.Value = 1; 
     EasingDoubleKeyFrame e7 = new EasingDoubleKeyFrame(); 
     e7.KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromSeconds(2)); 
     e7.Value = 0.7; 
     opacity.KeyFrames.Add(e5); 
     opacity.KeyFrames.Add(e6); 
     opacity.KeyFrames.Add(e7); 

     DoubleAnimationUsingKeyFrames shadowDirection = new DoubleAnimationUsingKeyFrames(); 
     Storyboard.SetTarget(shadowDirection, target); 
     shadowDirection.SetValue(Storyboard.TargetPropertyProperty, new PropertyPath("(UIElement.Effect).(DropShadowEffect.Direction)")); 
     EasingDoubleKeyFrame eShad1 = new EasingDoubleKeyFrame(); 
     eShad1.KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromSeconds(0)); 
     eShad1.Value = 449; 
     EasingDoubleKeyFrame eShad2 = new EasingDoubleKeyFrame(); 
     eShad2.KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromSeconds(1)); 
     eShad2.Value = 449; 
     shadowDirection.KeyFrames.Add(eShad1); 
     shadowDirection.KeyFrames.Add(eShad2); 

     DoubleAnimationUsingKeyFrames shadowDepth = new DoubleAnimationUsingKeyFrames(); 
     Storyboard.SetTarget(shadowDepth, target); 
     shadowDirection.SetValue(Storyboard.TargetPropertyProperty, new PropertyPath("(UIElement.Effect).(DropShadowEffect.ShadowDepth)"));   
     EasingDoubleKeyFrame eShad3 = new EasingDoubleKeyFrame(); 
     eShad3.KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromSeconds(0)); 
     eShad3.Value = 0; 
     EasingDoubleKeyFrame eShad4 = new EasingDoubleKeyFrame(); 
     eShad4.KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromSeconds(1)); 
     eShad4.Value = 5; 
     EasingDoubleKeyFrame eShad5 = new EasingDoubleKeyFrame(); 
     eShad5.KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromSeconds(2)); 
     eShad5.Value = 20; 
     shadowDirection.KeyFrames.Add(eShad3); 
     shadowDirection.KeyFrames.Add(eShad4); 
     shadowDirection.KeyFrames.Add(eShad5); 

     DoubleAnimationUsingKeyFrames shadowOpacity = new DoubleAnimationUsingKeyFrames(); 
     Storyboard.SetTarget(shadowOpacity, target); 
     shadowDirection.SetValue(Storyboard.TargetPropertyProperty, new PropertyPath("(UIElement.Effect).(DropShadowEffect.Opacity)"));   
     EasingDoubleKeyFrame eShad6 = new EasingDoubleKeyFrame(); 
     eShad6.KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromSeconds(1)); 
     eShad6.Value = 1; 
     EasingDoubleKeyFrame eShad7 = new EasingDoubleKeyFrame(); 
     eShad7.KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromSeconds(2)); 
     eShad7.Value = 0; 
     shadowDirection.KeyFrames.Add(eShad6); 
     shadowDirection.KeyFrames.Add(eShad7); 

     DoubleAnimationUsingKeyFrames skewX = new DoubleAnimationUsingKeyFrames(); 
     Storyboard.SetTarget(skewX, target); 
     skewX.SetValue(Storyboard.TargetPropertyProperty, new PropertyPath("(UIElement.RenderTransform).(CompositeTransform.SkewX)"));   
     EasingDoubleKeyFrame eSkew1 = new EasingDoubleKeyFrame(); 
     eSkew1.KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromSeconds(0)); 
     eSkew1.Value = 0; 
     eSkew1.EasingFunction = new BounceEase() { EasingMode = System.Windows.Media.Animation.EasingMode.EaseInOut }; 
     EasingDoubleKeyFrame eSkew2 = new EasingDoubleKeyFrame(); 
     eSkew2.KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromSeconds(0.5)); 
     eSkew2.Value = -5; 
     eSkew2.EasingFunction = new BounceEase() { EasingMode = System.Windows.Media.Animation.EasingMode.EaseInOut }; 
     EasingDoubleKeyFrame eSkew3 = new EasingDoubleKeyFrame(); 
     eSkew3.KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromSeconds(1)); 
     eSkew3.Value = 5; 
     eSkew3.EasingFunction = new BounceEase() { EasingMode = System.Windows.Media.Animation.EasingMode.EaseInOut }; 
     EasingDoubleKeyFrame eSkew4 = new EasingDoubleKeyFrame(); 
     eSkew4.KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromSeconds(1.5)); 
     eSkew4.Value = -5; 
     eSkew4.EasingFunction = new BounceEase() { EasingMode = System.Windows.Media.Animation.EasingMode.EaseInOut }; 
     EasingDoubleKeyFrame eSkew5 = new EasingDoubleKeyFrame(); 
     eSkew5.KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromSeconds(2)); 
     eSkew5.Value = 0; 
     eSkew5.EasingFunction = new BounceEase() { EasingMode = System.Windows.Media.Animation.EasingMode.EaseInOut }; 
     skewX.KeyFrames.Add(eSkew1); 
     skewX.KeyFrames.Add(eSkew2); 
     skewX.KeyFrames.Add(eSkew3); 
     skewX.KeyFrames.Add(eSkew4); 
     skewX.KeyFrames.Add(eSkew5); 

     ColorAnimationUsingKeyFrames shadowColor = new ColorAnimationUsingKeyFrames(); 
     Storyboard.SetTarget(shadowColor, target); 
     shadowColor.SetValue(Storyboard.TargetPropertyProperty, new PropertyPath("(UIElement.Effect).(DropShadowEffect.Color)"));    
     EasingColorKeyFrame eColor1 = new EasingColorKeyFrame(); 
     eColor1.KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromSeconds(0)); 
     eColor1.Value = Colors.Red; 
     EasingColorKeyFrame eColor2 = new EasingColorKeyFrame(); 
     eColor2.KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromSeconds(0.5)); 
     eColor2.Value = Color.FromArgb(255, 254, 31, 0); 
     EasingColorKeyFrame eColor3 = new EasingColorKeyFrame(); 
     eColor3.KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromSeconds(0.7)); 
     eColor3.Value = Color.FromArgb(255, 254, 255, 0); 
     EasingColorKeyFrame eColor4 = new EasingColorKeyFrame(); 
     eColor4.KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromSeconds(0.8)); 
     eColor4.Value = Colors.Black; 
     shadowColor.KeyFrames.Add(eColor1); 
     shadowColor.KeyFrames.Add(eColor2); 
     shadowColor.KeyFrames.Add(eColor3); 
     shadowColor.KeyFrames.Add(eColor4); 

     s.Children.Add(scaleY); 
     s.Children.Add(translateY); 
     s.Children.Add(opacity); 
     s.Children.Add(shadowDirection); 
     s.Children.Add(shadowDepth); 
     s.Children.Add(shadowOpacity); 
     s.Children.Add(skewX); 
     s.Children.Add(shadowColor); 


     Storyboard.SetTarget(s, target); 
     return s; 
    } 
} 

而且这里是我把它分配给每个火图像:

Storyboard fireStoryboard = FireStoryboard.fireStoryboard(fire); 
     fireStoryboard.Begin(); 

任何帮助将不胜感激。我是否错过在某处设置目标?我真的不知道在哪里:(。

+0

我现在得到一个新的错误,指出“无法解析指定对象上的TargetProperty(UIElement.RenderTransform)。(CompositeTransform.ScaleY)”。我认为scaleY将可能与图像? – Christian

回答

1

当元素名称x:Name可以在其资源中具有Storyboard的元素中找到时,以下工作正常:实现MVVM时,您还可以设置名称因为你不需要X:名称大部分时间以任何方式请参见以下;

private void GoShowUpElement(FrameworkElement element, double opacity) 
    { 
     if (element != null) 
     { 
      string guidString = Guid.NewGuid().ToString(); 
      element.SetValue(NameProperty, guidString);// When you don't use x:Name in Xaml (with MVVM normally not nessasary) 

      if (!this.LayoutRoot.Resources.Contains(guidString)) 
      { 
       this.LayoutRoot.Resources.Add(guidString, ShowUpElement(opacity, 1000, guidString)); // when you do use x:Name replace guidString with the x:Name you used. 
       Storyboard simultaniousStoryboard = this.LayoutRoot.Resources[guidString] as Storyboard; 
       simultaniousStoryboard.Completed += new EventHandler(simultaniousStoryboard_Completed); 
       simultaniousStoryboard.Begin(); 
      } 
     } 
    } 

当故事板完成后,我使用越来越多的故事板时清理资源,这显著提高性能。 ;)

private void simultaniousStoryboard_Completed(object sender, EventArgs e) 
    { 
     Storyboard storyboard = sender as Storyboard; 
     foreach (DictionaryEntry dictionaryEntry in this.LayoutRoot.Resources) 
     { 
      Storyboard resourceStoryboard = dictionaryEntry.Value as Storyboard; 
      if (resourceStoryboard != null) 
      { 
       if (resourceStoryboard.GetValue(NameProperty) == storyboard.GetValue(NameProperty)) 
        this.LayoutRoot.Resources.Remove(dictionaryEntry.Key); 
      } 
     } 
    } 

这里是t他为我创建了一个可重用故事板的静态方法。

public static Storyboard ShowUpElement(double opacity, int milliseconds, string elementName) 
    { 
     Storyboard storyboard = new Storyboard(); 
     storyboard.Children.Add(StoryboardBasic.KeyFramedAnimation(opacity, 0.9, 0, milliseconds, elementName, "Opacity")); 
     //storyboard.Children.Add(StoryboardBasic.KeyFramedAnimation.... Add more if you want 
     return storyboard; 
    } 

而DoubleAnimationUsingKeyFrames也可以是其他类型的动画,只要你喜欢。

public static DoubleAnimationUsingKeyFrames KeyFramedAnimation(double fromValue, double toValue, int startMilliSeconds, int endMilliseconds, string targetElementName, PropertyPath propertyPath) 
    { 
     List<SplineDoubleKeyFrame> splineDoubleKeyFrames = new List<SplineDoubleKeyFrame>() 
      { 
       new SplineDoubleKeyFrame() { KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromMilliseconds(startMilliSeconds)), Value = fromValue, KeySpline = new KeySpline() { ControlPoint1 = new Point(0,0), ControlPoint2= new Point(1,0)} }, 
       new SplineDoubleKeyFrame() { KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromMilliseconds(endMilliseconds)), Value = toValue, KeySpline = new KeySpline() { ControlPoint1 = new Point(0,0), ControlPoint2= new Point(0,1)} }, 
      }; 

     DoubleAnimationUsingKeyFrames animation = new DoubleAnimationUsingKeyFrames(); 
     foreach (SplineDoubleKeyFrame linearDoubleKeyFrame in splineDoubleKeyFrames) 
      animation.KeyFrames.Add(linearDoubleKeyFrame); 

     Storyboard.SetTargetName(animation, targetElementName); 
     Storyboard.SetTargetProperty(animation, propertyPath); 

     return animation; 
    } 

让我知道如果这是有用的,在此先感谢。

+0

那里有一些非常方便的信息。谢谢! – Christian