在 WP 应用程序中,我们需要提供用户选项来使用密码锁定应用程序。
据我了解 WP 应用程序生命周期,我需要在 App.Application_Activated、App.Application_Deactivated 和起始页中将导航放到 LockPage,但我不能在 App 类中使用 NavigationService...
我不想将导航代码锁定在其他页面中,或者没有其他选项?
在 WP 应用程序中,我们需要提供用户选项来使用密码锁定应用程序。
据我了解 WP 应用程序生命周期,我需要在 App.Application_Activated、App.Application_Deactivated 和起始页中将导航放到 LockPage,但我不能在 App 类中使用 NavigationService...
我不想将导航代码锁定在其他页面中,或者没有其他选项?
我编写了自己的解决方案,但可能没有它可以的那么优雅。
应用锁定逻辑:用户使用密码启用应用锁定,我们在 App 类中处理 Application_Deactivated 和 Application_Closing 事件,如果用户启用此选项,则将应用标记为锁定。然后,在每个页面上,我们应该检查:应用程序当前是否被锁定,如果是,我们应该导航到 AppLockedWithPasswordPage。在 AppLockedWithPasswordPage 上,我们需要检查用户的密码,如果正确则调用 NavigationService.GoBack()。
所以我们需要做6个步骤:
您应该选择保存IsAppCurrentlyLocked(布尔标志)、AppLockPassword(字符串)和IsUserEnabledAppLockWithPassword(布尔标志)的位置。我选择了独立存储设置
创建 AppLockedWithPassword 页面,您需要在其中显示 TextBox 和 Button,不要忘记为用户提供重置 AppLock 的选项,当然还有删除应用程序数据
AppLockedWithPasswordPage 应该阻止 BackButton 导航,因此阻止它:
// AppLockedWithPasswordPage
protected override void OnBackKeyPress(CancelEventArgs e)
{
// Preventing back key navigation
e.Cancel = true;
}
单击按钮检查密码
// AppLockedWithPasswordPage
private void UnlockAppButton_Click(object sender, RoutedEventArgs e)
{
if (PasswordBox.Password.Equals(IsolatedStorageSettings["AppLockPassword"]))
{
NavigationService.GoBack();
}
else
{
// Say user, that password incorrect, etc...
}
}
在 App 类中找到 Application_Deactivated(处理应用程序最小化(Windows 按钮))和 Application_Closing(处理用户关闭应用程序)方法,如果用户在此事件发生时启用此选项,我们应该将应用程序标记为已锁定
private void SetIsAppCurrentlyLockedFlagIfUserEnabledAppLocking()
{
if ((bool)IsolatedStorageSettings["IsUserEnabledAppLockWithPassword"])
{
IsolatedStorageSettings["IsAppCurrentlyLocked"] = true;
}
}
private void Application_Deactivated(object sender, DeactivatedEventArgs e)
{
SetIsAppCurrentlyLockedFlagIfUserEnabledAppLocking();
}
private void Application_Closing(object sender, ClosingEventArgs e)
{
SetIsAppCurrentlyLockedFlagIfUserEnabledAppLocking();
}
最后一步,在您要锁定的所有页面上,您应该在 OnNavigatedTo 方法中添加检查,如果应用程序当前被锁定,该方法将导航到 AppLockedWithPasswordPage
// Create some class, like PagesUtils or so on with check method
private static Uri uriToAppLockedWithPasswordPage = new Uri("pathToAppLockedWithPasswordPage", UriKind.Relative);
public static void NavigateToAppLockedWithPasswordPageIfAppLocked(PhoneApplicationPage page)
{
if ((bool)IsolatedStorageSettings["IsAppCurrentlyLocked"])
{
page.NavigationService.Navigate(uriToAppLockedWithPasswordPage);
}
}
// In each page you want to lock add
protected override void OnNavigatedTo(NavigationEventArgs e)
{
PagesUtils.NavigateToAppLockedWithPasswordPageIfAppLocked();
base.OnNavigatedTo();
}
PS当然真实代码要好很多,这只是简单的例子,希望对你有帮助
您应该在Application_Launching
和Application_Activated
事件中添加检查。
首次打开应用程序时的启动事件和用户离开做其他事情后返回应用程序时的激活事件。
让这些事件都设置一个标志并让所有页面继承的基本页面在导航到时检查此标志。检查是否设置了标志,如果设置了,则显示登录提示,然后在成功输入密码后清除标志。
除了正常启动应用程序之外,这种方法还将处理 FAS、FAR 和深度链接。
注意一些选择器在返回应用程序时会触发激活事件。根据需要/如有必要,为这些添加额外的处理。
为什么不创建一个输入密码的起始页面?
对于您拥有 MainPage.xaml 的实例,请创建一个 InsertPasswordPage.xaml 在 WMAppManifest 上引用它作为起始页:
<DefaultTask Name="_default" NavigationPage="InsertPasswordPage.xaml" />
并在 InsertPasswordPage.xaml 上插入所有密码逻辑,当用户成功登录时,只需导航到您的主页;)
编辑:正如 Gambit 所说,如果用户按下后退按钮,他将返回插入密码页面,但您可以通过在用户登录后从后台删除页面来解决此问题。