处理WPF中所有窗口的关闭事件

时间:2018-11-12 09:22:45

标签: c# .net wpf events eventhandler

在WPF中为所有窗口注册事件,应在App类中编写如下内容:

EventManager.RegisterClassHandler(typeof(Window), Window.PreviewMouseDownEvent, new MouseButtonEventHandler(OnPreviewMouseDown));

但是Window类没有任何用于处理Closing事件的属性

2 个答案:

答案 0 :(得分:1)

窗口确实有一个关闭事件,您可以取消该事件,但它不是RoutedEvent,因此您不能以这种方式订阅它。

您始终可以继承Window并在一个位置订阅关闭。所有继承的Windows也会继承此行为。

编辑

这也可以通过行为来完成。 确保安装名为Expression.Blend.Sdk的NuGet软件包。 比创建如下附加行为:

using System.Windows;
using System.Windows.Interactivity;

namespace testtestz
{
    public class ClosingBehavior : Behavior<Window>
    {
        protected override void OnAttached()
        {
            AssociatedObject.Closing += AssociatedObject_Closing;
        }

        protected override void OnDetaching()
        {
            AssociatedObject.Closing -= AssociatedObject_Closing;
        }

        private void AssociatedObject_Closing(object sender, System.ComponentModel.CancelEventArgs e)
        {
            e.Cancel = MessageBox.Show("Close the window?", AssociatedObject.Title, MessageBoxButton.OKCancel) == MessageBoxResult.Cancel;
        }
    }
}

在您的XAML中添加如下行为:

<Window x:Class="testtestz.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow"
        xmlns:local="clr-namespace:testtestz"
        xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity">
    <i:Interaction.Behaviors>
        <local:ClosingBehavior/>
    </i:Interaction.Behaviors>
    <Grid>
    </Grid>
</Window>

答案 1 :(得分:0)

如何注册到Unloaded事件?拥有自己的财产。例如:

EventManager.RegisterClassHandler(typeof(Window), PreviewMouseDownEvent, new MouseButtonEventHandler(OnPreviewMouseDown));
EventManager.RegisterClassHandler(typeof(Window), UnloadedEvent, new RoutedEventArgs( ... ));