挂在申请中。退出

时间:2018-03-22 09:13:34

标签: c# wpf controls resource-cleanup application-shutdown

这是我的问题:

在我的WPF应用程序中,我有一个MyBaseControl(派生自System.Windows.Controls.ContentControls)和许多来自MyCustomControls的{​​{1}}。我需要为我的所有MyBaseControl做一些存储和清理操作,因为应用程序已关闭。 这是一些代码:

MyCustomControls

public abstract class MyBaseControl : ContentControl { // Do some smart stuff. } App.Exit += new System.Windows.ExitEventHandler(App.App_OnExit); 我做了最后需要完成的操作。 我试图在App_OnExit()的析构函数中执行清理操作,但这是在MyBaseControl之后调用的。与App_OnExit()相同的问题。

当我通过ALT + F4退出应用程序时,AppDomain.CurrentDomain.ProcessExitContentControl.Closed事件不会发生。

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

2 个答案:

答案 0 :(得分:2)

  

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

在控件的父窗口的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...
    }
}

答案 1 :(得分:0)

您可以将它放到您的应用程序类中:

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;
    }
}