WPF淡出控件

在我的WPF应用程序中,我有一个反馈控件,我希望在用户操作完成后显示(保存数据,删除…)。 可见性设置为隐藏开始,样式设置为定义为资源的animateFadeOut样式(参见下文)。 然后我想在我的C#代码中设置文本并控制Visibility可见,并让反馈控件显示消息并在5秒后淡出并保持隐藏状态(Visibility.Hidden)。

以下XAML在我第一次调用control.Visiblity = Visibility.Visible时工作,但控件第二次不再出现。 我想这是因为动画仍然在运行,它可以控制反馈控制。 然后我尝试将FillBehavior设置为“停止”,但这只是使控件再次可见,我想隐藏它。 然后,使用FillBehavior =“Stop”,我试图设置一个触发器“当Opacity = 0时,将Visibility设置为Hidden”。 触发器似乎没有触发,动画完成后我再次看到了可视控件。

请帮助指出我在这里做错了什么。

或者,如果您可以建议一种更好的方法来显示一个在5秒后消失并且可以反复调用的控件,我将不胜感激。

谢谢!

             

问题是,在动画完成后,您的控件仍然具有Visibility = Visible,因此无法再次输入。
我宁愿使用完成整个事情的动画,首先显示控件,然后隐藏它。

     Visible         Hidden     

并使用如下:

 ((Storyboard)FindResource("animate")).Begin(someControl); 

Liz对于Visibility仍然可见是正确的。 alpha-mouse也是正确的,您需要在某些时候将其设置为隐藏。 但是如果在动画完成之前将其设置回来,它将无法工作,如下所示:

 MyControl.Visibility = System.Windows.Visibility.Visible; MyControl.Visibility = System.Windows.Visibility.Hidden; 

因为动画具有更高的优先级( MSDN )

您可以将其设置回Storyboard中的Hidden.Completed事件:

 private void Show() { MyControl.Visibility = System.Windows.Visibility.Visible; var a = new DoubleAnimation { From = 1.0, To = 0.0, FillBehavior= FillBehavior.Stop, BeginTime = TimeSpan.FromSeconds(2), Duration = new Duration(TimeSpan.FromSeconds(0.5)) }; var storyboard = new Storyboard(); storyboard.Children.Add(a); Storyboard.SetTarget(a, MyControl); Storyboard.SetTargetProperty(a, new PropertyPath(OpacityProperty)); storyboard.Completed += delegate { MyControl.Visibility = System.Windows.Visibility.Hidden; }; storyboard.Begin(); } 

这是我的工作。 这会使控件逐渐消失并再次退出。 我没有玩Visibility,而只是玩Opacity来处理它。

感谢Kane在这篇关于原始代码的post中: 使用WPF动画淡化任何控件

 Storyboard storyboard = new Storyboard(); TimeSpan duration = TimeSpan.FromMilliseconds(500); // DoubleAnimation fadeInAnimation = new DoubleAnimation() { From = 0.0, To = 1.0, Duration = new Duration(duration) }; DoubleAnimation fadeOutAnimation = new DoubleAnimation() { From = 1.0, To = 0.0, Duration = new Duration(duration) }; fadeOutAnimation.BeginTime = TimeSpan.FromSeconds(5); Storyboard.SetTargetName(fadeInAnimation, element.Name); Storyboard.SetTargetProperty(fadeInAnimation, new PropertyPath("Opacity", 1)); storyboard.Children.Add(fadeInAnimation); storyboard.Begin(element); Storyboard.SetTargetName(fadeOutAnimation, element.Name); Storyboard.SetTargetProperty(fadeOutAnimation, new PropertyPath("Opacity", 0)); storyboard.Children.Add(fadeOutAnimation); storyboard.Begin(element); 

我的上帝永远。 看看这个,它解决了使用alpha将可见性更改为“可见”和“隐藏”时动画制作的问题,动画不会冻结。

 using System.Windows; namespace WpfApplication4 { ///  /// Interaction logic for MainWindow.xaml ///  public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } private void button1_Click(object sender, RoutedEventArgs e) { button.Visibility = Visibility.Hidden; } private void button2_Click(object sender, RoutedEventArgs e) { button.Visibility = Visibility.Visible; } } } 

XAML:

             

这应该可以修复你的故事板。

但是,请记住,一旦动画完成,您的控件将完全不透明 – 不可见,但您的Visibility属性仍设置为Visible。 因此,您必须确保将Visibility属性重置为隐藏或折叠到某处。