我正在开发应使用密码保护的 Windows Phone 8 应用程序。每次启动或激活应用程序时显示密码屏幕的最佳方式是什么?
我认为行动的中心点应该是 App.xaml.cs 及其 Launch 和 Activation 事件处理程序。但是我如何才能显示密码屏幕呢?
问题是,人们永远不知道应用程序启动或重新激活时会显示哪些页面。它是应用程序停用时最后显示的主页或任何其他页面。
我试图拦截到第一页的导航,取消它并显示密码页面:
// App.xaml.cs
private void InitializePhoneApplication() {
...
RootFrame.Navigating += HandleFirstNavigation;
...
}
private void HandleFirstNavigation(object sender, NavigatingCancelEventArgs e) {
RootFrame.Navigating -= HandleFirstNavigation;
e.Cancel = true;
RootFrame.Dispatcher.BeginInvoke(new Action(this.OpenPasscodePage));
}
private void OpenPasscodePage() {
RootFrame.Navigate(PasscodePageUri);
}
这有效,但仅当应用程序启动时。当应用程序重新激活(休眠或墓碑)时,e.Cancel 将被忽略。虽然导航到密码页面被称为原始页面。
将密码页面的导航从 Navigating 移动到 Navigated 也不值得:
private void InitializePhoneApplication() {
...
RootFrame.Navigated += PasscodePageAfterFirstNavigation;
...
}
private void PasscodePageAfterFirstNavigation(object sender, EventArgs e) {
RootFrame.Navigated-= PasscodePageAfterFirstNavigation;
RootFrame.Navigate(PasscodePageUri);
}
这似乎是某种竞争条件:有时显示密码页面,有时显示原始页面。即使出现密码页面,这看起来也很糟糕,因为在应用程序进一步导航到密码页面之前,人们首先会在几分之一秒内看到原始页面。
两种解决方案都不起作用。知道什么是实现这一点的正确方法吗?
编辑:同时我尝试了第三种解决方案,它也不起作用。此解决方案使用 Uri Mapper:
应用程序.xaml.cs
public bool PasscodeWasConfirmed; private void Application_Launching(object sender, LaunchingEventArgs e) {
...
PasscodeWasConfirmed = false;
...
}
private void Application_Activated(object sender, ActivatedEventArgs e) {
...
PasscodeWasConfirmed = false;
...
}
public Uri InitialPageUri;
public bool ShouldRedirectToPasscodePage(Uri uri) {
if (PasswordWasConfirmend == false) {
InitialPageUri = uri;
return true;
}
return false;
}
UriMapper
public class AppUriMapper : UriMapperBase {
public override Uri MapUri(Uri uri) {
App app = (Application.Current as App);
if (app != null) {
if (app.ShouldRedirectToPasscodePage(uri))
return PasscodeQueryPage.PageUri;
}
// default
return uri;
}
}
密码页
public partial class PasscodePage : PhoneApplicationPage {
...
private void PasscodeConfirmed() {
App app = (Application.Current as App);
app.PasscodeWasConfirmed = true;
NavigationService.Navigate(app.InitialPageUri);
}
}
Logic 正常工作,但在确认密码后应用程序未导航到 InitialPageUri。Uri Mapper 被正确调用并返回 InitialPageUri(不再重定向)。但是没有导航发生...
没有错误、异常或调试输出。简直什么都没发生……
使用 Uri Mapper 时最大的问题: 当应用程序从休眠状态重新激活时,没有可以映射或重定向的导航......