Обработать событие закрытия всех окон в wpf

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

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

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


person n3verLieMe    schedule 12.11.2018    source источник
comment
Вы ищете что-то вроде этого: stackoverflow.com/questions/8969846/?   -  person anangupadhyaya    schedule 12.11.2018
comment
@user3164323 user3164323 На самом деле я ищу что-то, что улавливает закрытие всех окон, а не только элементы управления внутри одного окна.   -  person n3verLieMe    schedule 12.11.2018


Ответы (2)


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

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

ИЗМЕНИТЬ

Это можно сделать и с поведением. Убедитесь, что вы установили пакет 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>
person Rob    schedule 12.11.2018
comment
Хотя наследование кажется нисходящим способом, но я ненавижу делать это для визуализированных классов (таких как окно, кнопка и т. Д.), Потому что накладные расходы на наследование могут ощущаться в UX, особенно когда у пользователя нет нормального графического процессора. - person n3verLieMe; 12.11.2018
comment
Я тоже ненавижу это, поскольку в XAML не существует визуального наследования. Единственная другая вещь, о которой я могу думать, - это прикрепленное поведение, которое вы бы прикрепили к каждому окну. - person Rob; 12.11.2018

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

EventManager.RegisterClassHandler(typeof(Window), PreviewMouseDownEvent, new MouseButtonEventHandler(OnPreviewMouseDown));
EventManager.RegisterClassHandler(typeof(Window), UnloadedEvent, new RoutedEventArgs( ... ));
person pjrki    schedule 12.11.2018
comment
к сожалению, я не могу использовать событие выгрузки, потому что я хочу отменить закрытие в событии закрытия - person n3verLieMe; 12.11.2018