我很难理解如何在进行快速应用切换时执行代码(例如,按下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感兴趣的场景。
当导航从“开始”屏幕通过“返回”按钮将我们带回应用程序时,是否有捕获方法?我错过了处理这种情况的代码吗?
谢谢!
答案 0 :(得分:2)
这里没有错。这是默认行为。从Visual Studio调试Windows Phone 8.1应用程序时,触发Suspend / Resume事件的唯一方法是使用VS中的Lifecycle Events。但是当您在没有VS的情况下运行应用程序时,这些方法将按预期触发。 :)