Windows phone 8 每次启动/激活应用程序时显示密码屏幕的最佳方式

Windows phone 8 每次启动/激活应用程序时显示密码屏幕的最佳方式,windows-phone-8,Windows Phone 8,我正在使用Windows Phone 8应用程序,该应用程序应使用密码进行保护。每次启动或激活应用程序时,显示密码屏幕的最佳方式是什么 我认为行动的中心点应该是App.xaml.cs及其启动和激活事件处理程序。但是我怎样才能准确地显示密码屏幕呢 问题是,人们永远不知道应用程序启动或重新激活时会显示哪些页面。它是应用程序停用时最后一次显示的主页或任何其他页面 我试图截取到第一页的导航,取消它并显示密码页: // App.xaml.cs private void InitializePhoneApp

我正在使用Windows Phone 8应用程序,该应用程序应使用密码进行保护。每次启动或激活应用程序时,显示密码屏幕的最佳方式是什么

我认为行动的中心点应该是App.xaml.cs及其启动和激活事件处理程序。但是我怎样才能准确地显示密码屏幕呢

问题是,人们永远不知道应用程序启动或重新激活时会显示哪些页面。它是应用程序停用时最后一次显示的主页或任何其他页面

我试图截取到第一页的导航,取消它并显示密码页:

// 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将被禁用。虽然到密码页的导航称为“原始”页,但仍会显示原始页

将导航从“导航”页移动到“导航”页不值得:

private void InitializePhoneApplication() {
   ...
   RootFrame.Navigated += PasscodePageAfterFirstNavigation;
   ...
}

private void PasscodePageAfterFirstNavigation(object sender, EventArgs e) {
   RootFrame.Navigated-= PasscodePageAfterFirstNavigation;       
   RootFrame.Navigate(PasscodePageUri);
}
这似乎是某种竞争条件:有时显示密码页,有时显示原始页。即使出现了密码页面,这看起来也很糟糕,因为在应用程序进一步导航到密码页面之前,人们会先看到原始页面几秒钟

这两种解决方案都不起作用。你知道什么是实现这一目标的正确方法吗

编辑:与此同时,我尝试了第三种解决方案,但也不起作用。此解决方案使用Uri映射器:

App.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);
    }
}
逻辑工作正常,但在确认密码后,应用程序不会导航到InitialPageUri。Uri映射器被正确调用并返回InitialPageUri(不再重定向)。但是没有导航发生

没有错误、异常或调试输出。只是什么都没发生

使用Uri映射器时的最大问题: 当应用程序从休眠状态重新激活时,没有可以映射或重定向的导航…

(我编辑了以前的答案,而不是添加新答案)
我花了一点时间试图找到一个解决方案,我不明白为什么你的代码不能运行。 就我而言,如果我在App.xaml中做这样的更改就足够了:

  private void CompleteInitializePhoneApplication(object sender, NavigationEventArgs e)
  {
     // Set the root visual to allow the application to render
     if (RootVisual != RootFrame)
        RootVisual = RootFrame;

     // Remove this handler since it is no longer needed
     RootFrame.Navigated -= CompleteInitializePhoneApplication;
     App.RootFrame.Navigate(new Uri("/passPage.xaml", UriKind.RelativeOrAbsolute));
  }
这适用于链接下的我的示例
但是-我无法阻止用户在按住buton并选择返回哪个应用程序时看到最后一个屏幕,然后在离开应用程序之前眨眼就能看到最后一页
我不知道单击MS按钮后是否可以更改此行为:

第二次编辑
好的-也许我已经找到了解决方案,为什么它在某些情况下有效,但有时不在代码中。按Start或Search按钮后,应用程序上的buton可进入两种情况:墓碑和非墓碑。返回后会发生不同的事件。上述代码适用于墓碑案例,但不适用于非墓碑案例。要处理第二个问题,您需要添加(因为页面没有再次初始化)-(当然可以是不同的解决方案):

还请确保在VS:Project->properties->debug->Tombstone on deactiovation复选框中显示调试属性。
您也可以在这里找到一些信息(如果您以前没有看到过):

我看不出这应该怎么做。我的例子有什么不同?CompleteInitializePhoneApplication和CheckForResetNavigation都是RootFrame.Navigated的处理程序。在我的示例中使用的PasscodePageAfterFirstNavigation与PasscodePageAfterFirstNavigation有何区别?我已经用上面的方法编写了一个特殊的示例,它可以工作——在激活应用程序后,我每次看到的第一件事就是PassPage。我必须承认,我没有太多的时间来分析你的代码(我会尽量在晚上做)——我刚刚编写了适合我的代码。你试过了吗?是的,我试过你的代码(在我第一次评论之前),但它不起作用。请注意,问题不在于应用程序启动,而在于应用程序重新激活。当从休眠状态重新激活时,没有可以重定向的导航,因此代码无法工作。当从墓碑状态重新激活时,应用程序会自动导航到最后一个活动页面。看起来,这种重新激活导航的工作方式与启动时的导航有所不同。在本例中,存在我的帖子中描述的竞争条件:有时应用程序会导航到PasscodePage,有时它不会……正如我所说,我已经编写了一段代码。请检查它是否如您所期望的那样运行:这是一个短的一到两页和通过页。当我打开应用程序时,pass page显示(这很好),接下来我进入第二页,然后按start buton导航离开,当我返回时,我会看到pass page。您在使用XNA吗?非常感谢您的反馈和示例项目。我会看一看,试着找出我的代码不起作用的原因。
  bool afterActivation = false;
  private void Application_Activated(object sender, ActivatedEventArgs e)
  {
     afterActivation = true;
  }
  private void CheckForResetNavigation(object sender, NavigationEventArgs e)
  {
     // If the app has received a 'reset' navigation, then we need to check
     // on the next navigation to see if the page stack should be reset
     if (e.NavigationMode == NavigationMode.Reset)
        RootFrame.Navigated += ClearBackStackAfterReset;

     if (afterActivation)
     {
        afterActivation = false;
        App.RootFrame.Navigate(new Uri("/passPage.xaml", UriKind.RelativeOrAbsolute));
     }
  }