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

时间:2012-09-05 20:00:01

标签: windows-runtime windows-store-apps

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

3 个答案:

答案 0 :(得分:4)

不是我的具体问题的确切答案,而是解决我发布问题的具体问题的方法。也许它可以帮助别人:

注册Window.CoreWindow.VisibilityChanged

Window.Current.CoreWindow.VisibilityChanged += CoreWindow_VisibilityChanged;

如果可见性已更改为false,则可能是由于关闭了应用。请注意,事件也会因许多其他原因而触发,例如通过ALT-Tab更改窗口:

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

请注意:我怀疑MS明确没有提供我正在寻找的事件,因为在用户关闭应用程序时恰好进行大量操作将导致用户体验不那么流畅。但是我认为有符合条件的情况下这样的事件是有道理的,因此人们会使用我在这里提供的解决方法。如果您使用此方法或其他解决方法,请注意不要给系统造成沉重的负担。

答案 1 :(得分:3)

根据Application Lifecycle文档,无法检测此事件(请参阅“App close”下的部分)。使用ApplicationData类可以最好地管理这种类型的状态。

答案 2 :(得分:1)

毫无疑问,如果应用程序被暂停,您不希望一直保存状态。这不会被称为“民意调查”(在其他方面有点不好和浪费)?在我的场景中,我有一个跟踪剩余时间的计时器,这是应用程序状态的一部分,但我不想将其存储在每个刻度线上。

所以,要做到这一点,你需要:

  1. 跟踪VisibilityChanged(如原始海报所述)
  2. 跟踪已卸载(无论何时从页面导航返回等)
  3. 跟踪页面何时被卸载,因此您不会保存可能会闲置的陈旧缓存页面
  4. 详细说明上面的#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;