0

我无法理解在进行快速应用程序切换时如何执行代码(即按 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 按钮然后点击后退按钮时,这些暂停/恢复事件不会被触发。

实际上,我无法确定在执行这种快速应用程序切换时执行的单一方法。这就是我对我的通用应用程序真正感兴趣的场景。

当导航通过“后退”按钮将我们从“开始”屏幕带回到应用程序时,有没有办法捕捉到?我是否缺少任何代码来处理这种情况?

谢谢!

4

1 回答 1

2

这里没有错。这是默认行为。从 Visual Studio 调试 Windows Phone 8.1 应用程序时,触发挂起/恢复事件的唯一方法是使用 VS 中的生命周期事件。但是当您在没有 VS 的情况下运行应用程序时,这些方法将按预期触发。:)

于 2014-10-19T07:51:52.560 回答