我无法理解在进行快速应用程序切换时如何执行代码(即按 Windows/开始按钮以在电话模拟器上显示开始屏幕,然后按返回按钮返回应用程序)。
为了简化问题,我启动了一个新的 Windows 通用应用程序,它使用“Visual C# Hub 应用程序(通用应用程序)”模板作为基本代码(因为它包括 SuspensionManager 和 NavigationHelper)。由于我对 Hub 本身不感兴趣,因此我从 HubPage.xaml 中删除了所有 Grid 内容,并简单地添加了一个名为 TimeTextBox 的 TextBox:
...
<Grid x:Name="LayoutRoot">
<TextBox Name="TimeTextBox"/>
</Grid>
</Page>
然后,在 HubPage.xaml.cs 中,我将以下简单行添加到方法 NavigationHelper_LoadState:
private async void NavigationHelper_LoadState(object sender, LoadStateEventArgs e)
{
var sampleDataGroups = await SampleDataSource.GetGroupsAsync();
this.DefaultViewModel["Groups"] = sampleDataGroups;
TimeTextBox.Text = DateTime.Now.TimeOfDay.ToString();
}
如果我在应用这些简单更改后在手机模拟器上执行应用程序,应用程序将在加载页面时显示一天中的时间,例如:16:08:53.4390827。
我想要的是每次导航到该页面时都会更新该时间。但是我如果使用 Visual Studio 中的生命周期事件来模拟暂停,当我发送 Resume 事件时,时间仍然相同:16:08:53.4390827,并且该行中的断点将确认 NavigationHelper_LoadState 方法没有得到恢复时执行。
对此的解释是,模板中的 App.xaml.cs 没有为 Resume 事件提供任何侦听器,因此不会执行任何操作。添加接下来的几行修复了:
public App()
{
this.InitializeComponent();
this.Suspending += this.OnSuspending;
this.Resuming += App_Resuming;
}
async void App_Resuming(object sender, object e)
{
await SuspensionManager.RestoreAsync();
}
因此,如果我在电话模拟器上再次运行该应用程序,现在我会在恢复后获得实际时间。伟大的!问题是当我简单地点击手机的 Windows 按钮然后点击后退按钮时,这些暂停/恢复事件不会被触发。
实际上,我无法确定在执行这种快速应用程序切换时执行的单一方法。这就是我对我的通用应用程序真正感兴趣的场景。
当导航通过“后退”按钮将我们从“开始”屏幕带回到应用程序时,有没有办法捕捉到?我是否缺少任何代码来处理这种情况?
谢谢!