【问题标题】:WP7 - Using Storyboard defined in Application.ResourcesWP7 - 使用 Application.Resources 中定义的 Storyboard
【发布时间】:2014-09-04 21:35:47
【问题描述】:

在我的Application.Resources 中,我定义了以下Storyboard

<Application.Resources>
  <!--Storyboard animation for fading out a UI element-->
  <Storyboard x:Key="FadeOutAnimation">
    <DoubleAnimation From="1"
                     To="0"
                     Duration="0:0:0.25"
                     Storyboard.TargetProperty="Opacity"
                     AutoReverse="False" />
  </Storyboard>
</Application.Resources>

在代码隐藏中,当用户点击它们时,我使用它来淡出一些 TextBlocks。

// Get the storyboard from application resources
Storyboard sb = (Storyboard)App.Current.Resources["FadeOutAnimation"];
// Setup the animation target for fade out
Storyboard.SetTarget( sb.Children.ElementAt( 0 ) as DoubleAnimation, myTextBlock );
// Set the animation completed handler
sb.Completed += ( s, e1 ) => {
  // Stop the Storyboard
  sb.Stop();
  // Hide the TextBlock
  myTextBlock.Visibility = Visibility.Collapsed;
};
// Start the Storyboard
sb.begin();

问题是,我是否需要以某种方式“解除”myTextBlock 成为DoubleAnimation 的目标?

如果是,我该怎么做?

我问的原因是我担心在再次使用此 Storyboard 之前会一直引用 TextBlock

感谢您的帮助!

【问题讨论】:

    标签: wpf silverlight windows-phone-7


    【解决方案1】:

    如果 Xaml 妨碍我们,我们不必总是在 sliverlight 中使用它:-

      public static AnimationHelper
      {
           public static void FadeOutAndCollapse(UIElement target)
           {
               DoubleAnimation da = new DoubleAnimation();
               da.From = 1.0;
               da.To = 0.0;
               da.Duration = TimeSpan.FromSeconds(0.25);
               da.AutoReverse = false;
    
               StoryBoard.SetTargetProperty(da, new PropertyPath("Opacity"));
               StoryBoard.SetTarget(da, target);
    
               StoryBoard sb = new StoryBoard();
               sb.Children.Add(da);
    
               EventHandler eh = null;
               eh = (s, args) =>
               {
                    target.Visiblity = Visibility.Collapsed;
                    sb.Stop();
                    sb.Completed -= eh;
               }
               sb.Completed += eh;
    
               sb.Begin();
           }
    }
    

    有了这个,你可以淡出和折叠任何 UI 元素:-

    AnimationHelper.FadeOutAndCollapse(myTextBox);
    

    我一直倾向于删除 From = 1.0 以使其更通用,以便具有较低初始不透明度的元素在消失之前不会突然闪烁到完全不透明度。

    【讨论】:

    • @Praetorian:并非所有代码都是“代码隐藏”,上面不是。您可以想象一个具有许多有用的此类方法的辅助类。它只是成为您自己工具包的一部分。
    • 使用情节提要实例需要什么?
    • 在 Windows Phone 8 上,我还必须在调用 sb.Begin() 之前明确设置情节提要持续时间以使其工作,例如 sb.Duration = new Duration(TimeSpan.FromSeconds(0.25));
    【解决方案2】:

    不用担心对轻量级用户界面元素的悬空引用;当没有更多引用时,它们将被垃圾收集。您更紧迫的问题是单个故事板被用于多个文本对象,如果它们重叠,它将做错事。

    例如,如果您开始一个动画然后开始另一个,那么它们将同时停止,因为只有一个情节提要并且您的处理程序调用了 stop。将单独的故事板与 XAML 中的每个文本元素相关联,或者在代码隐藏中为您想要执行的每个动画创建一个新的故事板。

    此外,如果您要使用单个故事板,则应小心删除已完成的事件处理程序,因为目前您将继续累积它们,并且当故事板重新完成时将调用旧的处理程序。

    【讨论】:

    • 由于情节提要是由点击事件启动的,并且只持续四分之一秒,我不太担心同时触发多个情节。但是您确实对 Completed 处理程序有很好的看法。我怎样才能删除最后一个?因为我使用的是 lambda,所以我不知道该怎么做。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-16
    • 1970-01-01
    • 1970-01-01
    • 2012-03-18
    • 1970-01-01
    • 1970-01-01
    • 2012-12-14
    相关资源
    最近更新 更多