Обрабатывать событие закрытия всех окон в wpf - PullRequest
0 голосов
/ 12 ноября 2018

В WPF для регистрации события для всех окон что-то вроде этого должно быть написано в классе приложения:

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

Но класс Window не имеет никакого свойства для обработки Closing события

Ответы [ 2 ]

0 голосов
/ 12 ноября 2018

Окно имеет событие закрытия, которое вы можете отменить, но оно не RoutedEvent, поэтому вы не можете подписаться на него таким образом.

Вы всегда можете унаследовать Окно и подписаться на закрытие в одном месте. Все наследующие Windows также наследуют это поведение.

EDIT

Это можно сделать и с помощью поведения. Убедитесь, что вы установили пакет NuGet с именем Expression.Blend.Sdk . Чем создать прикрепленное поведение, например, так:

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>
0 голосов
/ 12 ноября 2018

А как насчет регистрации на событие Unloaded? у которого есть своя собственность. Например:

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