Windows runtime 如何检测用户是否已关闭winrt应用程序

Windows runtime 如何检测用户是否已关闭winrt应用程序,windows-runtime,windows-store-apps,Windows Runtime,Windows Store Apps,什么是可靠(立即)检测用户是否已使用ALT-F4或关闭手势关闭应用程序的方法?根据文档,无法检测此事件(请参阅“应用程序关闭”下的部分)。使用该类可以最好地管理这种状态。这不是对我的具体问题的确切回答,而是解决我的具体问题的方法,我发布了我的问题。也许它能帮助其他人: 注册到Window.CoreWindow.VisibilityChanged: Window.Current.CoreWindow.VisibilityChanged += CoreWindow_VisibilityChanged

什么是可靠(立即)检测用户是否已使用ALT-F4或关闭手势关闭应用程序的方法?

根据文档,无法检测此事件(请参阅“应用程序关闭”下的部分)。使用该类可以最好地管理这种状态。

这不是对我的具体问题的确切回答,而是解决我的具体问题的方法,我发布了我的问题。也许它能帮助其他人:

注册到
Window.CoreWindow.VisibilityChanged

Window.Current.CoreWindow.VisibilityChanged += CoreWindow_VisibilityChanged;
如果可见性已更改为false,则这可能是由于应用程序关闭所致。请注意,事件还将因许多其他原因触发,例如通过ALT Tab更改窗口:

 void CoreWindow_VisibilityChanged(CoreWindow sender, VisibilityChangedEventArgs args) {
        if(!args.Visible){
           // Action here
        }
 }

请注意:我怀疑微软没有明确提供我正在寻找的事件,因为在用户关闭应用程序的那一刻进行繁重的操作会导致用户体验不那么流畅。然而,我认为在一些符合条件的情况下,这样的事件是有意义的,因此人们会使用我在这里提供的解决方法。如果使用此解决方案或其他解决方案,请注意不要给系统造成沉重的负载。

毫无疑问,在应用程序挂起的情况下,您不希望一直保存状态。这不叫“投票”(在其他方面有点糟糕和浪费)吗?在我的场景中,我有一个计时器来跟踪剩余时间,这是应用程序状态的一部分,但我不想在每个滴答声中都存储这个

因此,要正确执行此操作,您需要:

  • 轨道可视性改变(如原始海报所述)
  • 跟踪卸载(无论何时从页面返回,等等)
  • 跟踪页面卸载的时间,这样就不会保存可能挂起的过时缓存页面
  • 为了更详细地阐述上面的#3,我发现如果我从A->B向前导航,然后返回到A,然后再次导航到B,我最终会看到另一个缓存页面B挂起。然后当用户离开应用程序时,我会触发多个VisibilityChanged事件,其中一些事件包括我认为可能已被销毁但没有的旧缓存页面

    以下是对我有效的代码:

    public void MyPage() // Constructor
    {
      Loaded += (sender, e) =>
      {
        if(!m_isLoaded)
        {
          m_isLoaded = true;
    
          Window.Current.CoreWindow.VisibilityChanged +=
              OnVisibilityChanged;
        }
      };
    
      Unloaded += async (sender, e) => 
      {
        if (m_isLoaded)
        {
          m_isLoaded = false;
    
          Window.Current.CoreWindow.VisibilityChanged -= 
              OnVisibilityChanged;
    
          await SaveStuff();
        }
      };
    }
    
    protected void OnVisibilityChanged(object sender,
      Windows.UI.Core.VisibilityChangedEventArgs e)
    {
      if (!e.Visible && m_isLoaded)
      {
        var dontAwait = SaveStuff();
      }
    }
    
    // Called whenever the page is unloaded and state needs to be saved.
    protected async Task SaveStuff()
    {
      await ThreadUtility.voidTask();
    }
    
    // Set to false when the page is unloaded (paused).
    private bool m_isLoaded = false;
    

    你的意思是在用户关闭代码后运行代码?@SLaks,是的,直接在用户关闭代码后,在系统引发挂起事件之前,两者之间有区别吗?@Filip:后者在十秒钟后调用。真的吗?有趣。它到底改变了什么?我不得不同意这个答案。但是,我发现您还需要使用unload事件,否则您可能会发现自己正在保存旧页面的状态。我将添加注释作为可读性的答案。而不是Windows.UI.Xaml.Window.Current.VisibilityChanged