关闭时淡出wpf窗口

我想在我的应用程序中淡入/淡出一个窗口。
Window.Loaded上发生淡入淡出,我想在关闭时淡出( Window.ClosedWindow.Closing )。 淡入效果很好,但RoutedEvent属性不允许使用Window.Closing值。
我应该使用什么RoutedEvent进行关闭?

                  

我收到错误,值’Window.Closing’无法分配给属性’RoutedEvent’。 无效的活动名称。

结束不是路由事件,因此您无法在EventTrigger中使用它。 也许你可以在代码隐藏中的ClosingEvent的处理程序中启动故事板并取消事件……类似的东西:

 private bool closeStoryBoardCompleted = false; private void Window_Closing(object sender, CancelEventArgs e) { if (!closeStoryBoardCompleted) { closeStoryBoard.Begin(); e.Cancel = true; } } private void closeStoryBoard_Completed(object sender, EventArgs e) { closeStoryBoardCompleted = true; this.Close(); } 

我想我会添加另一个解决方案,使用Expression SDK中的行为并将其与@Thomas的解决方案相结合。 使用它,我们可以定义一个“CloseBehavior”来处理启动故事板并在完成后关闭窗口的代码。

 using System.ComponentModel; using System.Windows; using System.Windows.Interactivity; using System.Windows.Media.Animation; namespace Presentation.Behaviours { public class CloseBehavior : Behavior { public static readonly DependencyProperty StoryboardProperty = DependencyProperty.Register("Storyboard", typeof(Storyboard), typeof(CloseBehavior), new PropertyMetadata(default(Storyboard))); public Storyboard Storyboard { get { return (Storyboard)GetValue(StoryboardProperty); } set { SetValue(StoryboardProperty, value); } } protected override void OnAttached() { base.OnAttached(); AssociatedObject.Closing += onWindowClosing; } private void onWindowClosing(object sender, CancelEventArgs e) { if (Storyboard == null) { return; } e.Cancel = true; AssociatedObject.Closing -= onWindowClosing; Storyboard.Completed += (o, a) => AssociatedObject.Close(); Storyboard.Begin(AssociatedObject); } } } 

该行为将故事板定义为依赖项属性,因此我们可以在xaml中设置它,并且当AssociatedObject (我们定义行为的窗口)关闭时,此故事板将使用Storyboard.Begin()启动。 现在,在xaml中,我们只需使用以下xaml将行为添加到窗口中

             

请注意System.Windows.Interactivity dll中的xml命名空间i ,以及引用窗口,因此必须分配x:Name 。 现在,我们只需将行为添加到我们希望在关闭应用程序之前执行故事板的每个窗口,而不是将逻辑复制到每个窗口中的每个代码隐藏。

我不是WPF的专家,但我相信除非你取消最初的Closing事件,否则窗口将在动画开始之前消失。

收到Window.Closing事件后,您应该取消该事件并启动动画。 动画完成后,您可以关闭窗口。

这更简单,更短。 添加如下行为:

 public class WindowClosingBehavior : Behavior { protected override void OnAttached() { AssociatedObject.Closing += AssociatedObject_Closing; } private void AssociatedObject_Closing(object sender, System.ComponentModel.CancelEventArgs e) { Window window = sender as Window; window.Closing -= AssociatedObject_Closing; e.Cancel = true; var anim = new DoubleAnimation(0, (Duration)TimeSpan.FromSeconds(0.5)); anim.Completed += (s, _) => window.Close(); window.BeginAnimation(UIElement.OpacityProperty, anim); } protected override void OnDetaching() { AssociatedObject.Closing -= AssociatedObject_Closing; } } 

然后在你的窗口中添加一个引用:

 xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" xmlns:wt="clr-namespace:Desktop.Themes.WindowTask;assembly=Desktop.Themes" 

插入行为:

    

将AutoReverse设置为“True”