Windows Universal Apps中的Suspension Manager在快速应用切换方面没有做任何事情

时间:2014-08-14 23:25:27

标签: c# xaml windows-phone-8.1 win-universal-app fast-app-switching

我很难理解如何在进行快速应用切换时执行代码(例如,按下Windows /开始按钮以在电话模拟器上显示“开始”屏幕,然后按“返回”按钮返回应用程序)。

为了简化这个问题,我启动了一个新的Windows通用应用程序,它使用“Visual C#Hub App(通用应用程序)”模板作为基本代码(因为它包含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中的Lifecycle Events来模拟Suspend,当我发送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按钮然后点击后退按钮时,这些暂停/恢复事件不会被触发。

实际上,我无法识别在执行那种快速应用切换时执行的单个方法。这就是我对Universal App感兴趣的场景。

当导航从“开始”屏幕通过“返回”按钮将我们带回应用程序时,是否有捕获方法?我错过了处理这种情况的代码吗?

谢谢!

1 个答案:

答案 0 :(得分:2)

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