检测用户是否使用 ALT-F4 或关闭手势关闭应用程序的可靠(且立即)方法是什么?
3 回答
并不是对我的具体问题的确切答案,而是一种解决我发布问题的具体问题的方法。也许它可以帮助别人:
注册到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 没有明确提供我正在寻找的事件,因为在用户关闭应用程序的那一刻进行的繁重操作会导致用户体验不太流畅。但是,我认为在某些符合条件的情况下,这样的事件是有意义的,因此人们会使用我在此处提供的解决方法。如果您使用此解决方法或其他解决方法,请注意不要给系统造成沉重负载。
根据应用程序生命周期文档,无法检测到此事件(请参阅“应用程序关闭”部分)。使用ApplicationData类可以最好地管理这种类型的状态。
毫无疑问,您不想一直保存状态以防应用程序被挂起。难道这不会被称为“轮询”(这在其他方面有点糟糕和浪费)?在我的场景中,我有一个跟踪剩余时间的计时器,这是应用程序状态的一部分,但我不想在每次滴答时都存储它。
因此,要正确执行此操作,您需要:
- 跟踪 VisibilityChanged(如原始海报所述)
- 跟踪卸载(每当您从页面导航返回等时)
- 跟踪页面何时被卸载,这样您就不会保存可能挂起的陈旧缓存页面
要详细说明上面的#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;