C# WPF淡出动画-可以';不要再改变不透明度了
我有一个带有标签控件的WPF窗口,用于向用户发送消息。几秒钟后,我希望信息消失。为此,我创建了一个C# WPF淡出动画-可以';不要再改变不透明度了,c#,wpf,C#,Wpf,我有一个带有标签控件的WPF窗口,用于向用户发送消息。几秒钟后,我希望信息消失。为此,我创建了一个调度程序和一个故事板。(计时器延迟5秒,然后触发滴答事件,消息消失。)它成功地消失,但下一条消息的不透明度仍设置为0。(因此用户看不见。)显然,我尝试将不透明度设置回1,但没有例外,这失败了。(也就是说,我可以毫无问题地跳过那行代码,但执行后不透明度仍然为0。)有人能告诉我我做错了什么吗?下面是一个测试项目中的一些代码,其中只有一个标签控件、一个用于设置标签内容和淡入淡出动画的按钮,以及一个用于尝试
调度程序和一个故事板。(计时器延迟5秒,然后触发滴答事件,消息消失。)它成功地消失,但下一条消息的不透明度仍设置为0。(因此用户看不见。)显然,我尝试将不透明度设置回1,但没有例外,这失败了。(也就是说,我可以毫无问题地跳过那行代码,但执行后不透明度仍然为0。)有人能告诉我我做错了什么吗?下面是一个测试项目中的一些代码,其中只有一个标签控件、一个用于设置标签内容和淡入淡出动画的按钮,以及一个用于尝试重置不透明度的按钮
XAML:
默认情况下,动画的FillBehavior
设置为HoldEnd
,这意味着动画保留目标属性的最终值。如果以后要重置该值,则需要删除动画,或者将FillBehavior设置为停止
。然后可以为动画的Completed
事件添加处理程序,以手动保留最终值
还请注意,不需要计时器来延迟动画的开始。您可以改为设置其BeginTime
属性
最后,不需要故事板来设置单个属性的动画。您可以调用UIElement.BeginAnimation
private void btnChangeLabel_Click(object sender, RoutedEventArgs e)
{
var animation = new DoubleAnimation
{
To = 0,
BeginTime = TimeSpan.FromSeconds(5),
Duration = TimeSpan.FromSeconds(2),
FillBehavior = FillBehavior.Stop
};
animation.Completed += (s, a) => lblTest.Opacity = 0;
lblTest.BeginAnimation(UIElement.OpacityProperty, animation);
}
private void btnResetOpacity_Click(object sender, RoutedEventArgs e)
{
lblTest.Opacity = 1;
}
这是由于动画的“填充行为”。它有效地保持动画后的值,并且不放弃,防止它被更新
这是一个简单的修复方法,将填充行为更改为“停止”,并添加一个事件处理程序,以便在动画之后将不透明度值更改为0(否则将返回1)
我已经用你的代码测试过了,效果很好
本谢谢你,这非常有效。关于WPF,我还有很多东西要学,这会有所帮助。
private void btnChangeLabel_Click(object sender, RoutedEventArgs e)
{
lblTest.Content = "Testing1...Testing2...Testing3";
lblTest.Opacity = 1;
// Create a storyboard to contain the animations.
Storyboard storyboard = new Storyboard();
TimeSpan duration = new TimeSpan(0, 0, 2);
// Create a DoubleAnimation to fade the not selected option control
DoubleAnimation animation = new DoubleAnimation();
animation.From = 1.0;
animation.To = 0.0;
animation.Duration = new Duration(duration);
// Configure the animation to target de property Opacity
Storyboard.SetTargetName(animation, lblTest.Name);
Storyboard.SetTargetProperty(animation, new PropertyPath(Control.OpacityProperty));
// Add the animation to the storyboard
storyboard.Children.Add(animation);
// Begin the storyboard
storyboard.Begin(this);
}
private void btnResetOpacity_Click(object sender, RoutedEventArgs e)
{
lblTest.Opacity = 1;
}
private void btnChangeLabel_Click(object sender, RoutedEventArgs e)
{
var animation = new DoubleAnimation
{
To = 0,
BeginTime = TimeSpan.FromSeconds(5),
Duration = TimeSpan.FromSeconds(2),
FillBehavior = FillBehavior.Stop
};
animation.Completed += (s, a) => lblTest.Opacity = 0;
lblTest.BeginAnimation(UIElement.OpacityProperty, animation);
}
private void btnResetOpacity_Click(object sender, RoutedEventArgs e)
{
lblTest.Opacity = 1;
}
animation.FillBehavior = FillBehavior.Stop;
animation.Completed += delegate
{
lblTest.Opacity = 0;
};