首页 > 解决方案 > Application.Current 在关机前返回 null

问题描述

我在 WPF 的 NavigationWindow 中有一个页面。当我按下关闭按钮(X)时,我需要在页面关闭时执行一些代码。现在在我的代码隐藏中我有这个:

public partial class CompactLayout : Page
{
    private readonly CompactLayoutViewModel _viewModel;

    public CompactLayout()
    {
        InitializeComponent();
        DataContext = _viewModel = new CompactLayoutViewModel();
        Dispatcher.ShutdownStarted += OnShutdownStarted;
        //instead of Dispatcher.ShutdownStarted I've also tried: this.Unloaded += OnShutdownStarted;         
    }
    
    private void OnShutdownStarted(object sender, EventArgs e)
    {
        _viewModel.releaseServerViewModel();
    }
}

在我的 ViewModel 构造函数中,我有一个名为的事件处理程序ImageUpdateClientProxy是我引发事件的类):

ClientProxy.ImageUpdate += async (sender, args) => await ImageUpdateAsync(args.image,args.fps);

ImageUpdateAsyncViewModel 中的声明:

private Task ImageUpdateAsync(byte[] img, int fps)
{
    Application.Current.Dispatcher.Invoke(new Action(() =>
    {
        try
        {
            // things occurr
        }
        catch (Exception ex)
        {
            // things occurr v2
        }
    }));
    return Task.CompletedTask;
}

我在调用之前的调用中收到错误System.Windows.Application.Current.get returned null。如果不是我甚至在执行之前使用错误发生。Application.Current.Dispatcher.InvokeImageUpdateAsync_viewModel.releaseServerViewModelDispatcher.ShutdownStartedthis.Unloaded += OnShutdownStartedOnShutdownStarted

如何修复此代码,以便在此错误发生之前卸载页面?

标签: c#.netwpf.net-5

解决方案


class ViewModel
{
  private readonly Dispatcher _dispatcher = Application.Current.Dispatcher;

  private Task ImageUpdateAsync(byte[] img, int fps)
  {
    _dispatcher.Invoke(() => {/*...*/});
    return Task.CompletedTask;
  }
}

推荐阅读