0

我正在开发应使用密码保护的 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 时最大的问题: 当应用程序从休眠状态重新激活时,没有可以映射或重定向的导航......

4

1 回答 1

1

(我编辑了以前的答案,而不是添加新的答案)
我花了一些时间试图找到解决方案,但我不明白为什么您的代码无法运行。就我而言,如果我在 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));
  }

这适用于我的示例,该示例位于链接http://sdrv.ms/1ajH40E
下但是 - 当用户按下按钮并选择返回哪个应用程序时,我无法阻止用户看到最后一个屏幕,然后眨眼间他可以看到离开应用程序之前的最后一页。
我不知道单击 MS 按钮后是否可以更改此行为:
windows phone change deactivated app image

第二次编辑
好的-也许我找到了解决方案,为什么它有时会起作用,有时却不在您的代码中。按开始或搜索按钮后,应用程序可以转到两种情况:墓碑和非墓碑。返回后会发生不同的事件。上面的代码适用于 Tombstone 案例,但不适用于非 tombstone。要与您需要添加的第二个一起工作(因为页面没有再次初始化) - (当然它可以是不同的解决方案):

  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));
     }
  }

还请确保您在 VS 中的调试属性:Project->Properties->Debug->Tombstone on deactivation 复选框。
您还可以在这里找到一些信息(如果您以前没有看过):http:
//blogs.msdn.com/b/ptorr/archive/2010/12/11/how-to-correctly-handle-application-停用和重新激活.aspx

于 2013-11-01T21:51:33.893 回答