在 App.Exit 之前挂钩

Hook in befor App.Exit

这是我的问题:

在我的 WPF 应用程序中,我有一个 MyBaseControl(派生自 System.Windows.Controls.ContentControls)和许多派生自 MyBaseControlMyCustomControls。在关闭应用程序之前,我需要对所有 MyCustomControls 执行一些存储和清理操作。 这是一些代码:

public abstract class MyBaseControl : ContentControl
{
// Do some smart stuff.
}

App.Exit += new System.Windows.ExitEventHandler(App.App_OnExit);

App_OnExit() 中,我执行了最后需要完成的操作。 我尝试在 MyBaseControl 的析构函数中执行清理操作,但这是在 App_OnExit() 之后调用的。 AppDomain.CurrentDomain.ProcessExit.

同样的问题

当我通过 ALT+F4 退出应用程序时,ContentControl.ClosedContentControl.Unloaded 事件没有发生。

我可以在哪里进行清理操作?

Where can I hook in to do my cleanup operations?

在控件的父 window 的 Closing 事件处理程序中:

public abstract class MyBaseControl : ContentControl
{
    public MyBaseControl()
    {
        Loaded += MyBaseControl_Loaded;
    }

    private void MyBaseControl_Loaded(object sender, RoutedEventArgs e)
    {
        Window parentWindow = Window.GetWindow(this);
        parentWindow.Closing += ParentWindow_Closing;
        Loaded -= MyBaseControl_Loaded;
    }

    private void ParentWindow_Closing(object sender, System.ComponentModel.CancelEventArgs e)
    {
        //cleanup...
    }
}

你可以把它放到你的应用程序中 class:

public delegate void TimeToCleanUpEventHandler();
public event TimeToCleanUpEventHandler TimeToCleanUp;

修改退出事件处理程序:

App.Current.Exit += ((o, e) => { TimeToCleanUp?.Invoke(); App.App_OnExit(o, e); });

并修改您的基础控件:

public abstract class MyBaseControl : ContentControl
{
    public MyBaseControl()
    {
        (App.Current as MyApp).TimeToCleanUp += CleanItUp;
    }

    public virtual void CleanItUp()
    {
        (App.Current as MyApp).TimeToCleanUp -= CleanItUp;
        //do stuff;
    }
}