在我的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>
在代码隐藏中,当用户点击它时,我会使用它来淡出一些TextBlock
。
// 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
的目标?
如果是,我该怎么办?
我问的原因是我担心在{Story}再次使用故事板之前会引用TextBlock
。
感谢您的帮助!
答案 0 :(得分:12)
如果它妨碍我们,我们并不总是在银色灯光中使用Xaml: -
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
以使其更加通用,以便具有较低起始不透明度的元素在消失之前不会突然闪烁到完全不透明。
答案 1 :(得分:0)
不要担心悬挂对轻量级用户界面元素的引用;当没有更多的引用时,它们将被垃圾收集。更紧迫的问题是单个故事板被用于多个文本对象,如果它们重叠,它将做错事。
例如,如果您启动一个动画然后启动另一个动画,那么它们将同时停止,因为只有一个故事板并且您的处理程序调用停止。将单独的故事板与XAML中的每个文本元素相关联,或者在代码隐藏中为您要执行的每个动画创建一个新的故事板。
此外,如果您要使用单个故事板,则应该小心删除已完成的事件处理程序,因为当前您将继续累积它们,并且在故事板重新完成时将调用旧处理程序。