在WP应用程序中,我们需要提供用户选项以使用密码锁定应用程序。
据我了解WP app生命周期,我需要在App.Application_Activated,App.Application_Deactivated和启动页面中将导航放到LockPage,但我不能在App类中使用NavigationService ...
我不想将导航代码放在每个其他页面的锁定页面中,或者没有其他选项?
答案 0 :(得分:1)
我写了自己的解决方案,但可能不是那么优雅。
应用程序锁定逻辑:用户启用应用程序锁定密码,我们在App类中处理Application_Deactivated和Application_Closing事件,并在用户启用此选项时将应用程序标记为已锁定。然后,在每个页面上我们应该检查:当前是否已锁定应用程序,如果是,我们应该导航到AppLockedWithPasswordPage。在AppLockedWithPasswordPage上我们需要检查用户的密码,如果是正确的,请调用NavigationService.GoBack()。
所以我们需要做6个步骤:
您应该选择保存 IsAppCurrentlyLocked (bool标志), AppLockPassword (字符串)和 IsUserEnabledAppLockWithPassword (bool标志)的位置。我选择了IsolatedStorageSettings
创建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(用于处理用户关闭应用程序时)方法,如果用户在此事件发生时启用此选项,则应将app标记为已锁定
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方法,如果app当前被锁定,它将导航到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();
}
P.S。当然真正的代码要好得多,这只是一个简单的例子,我希望它能帮到你
答案 1 :(得分:0)
您应该在Application_Launching
和Application_Activated
事件中添加支票。
首次打开应用时的启动事件,以及用户在离开后执行其他操作后返回应用时的启动事件。
让这些事件都设置一个标志,并且在导航到的时候,让所有页面都继承的基页检查此标志。如果设置了标志,则检查应该是,如果是,则显示登录提示,然后在成功输入密码后清除标志。
这种方法将处理FAS,FAR&深层链接,除了正常启动应用程序外。
小心某些选择器会在返回应用时触发激活的事件。如果需要,可以根据需要为这些添加额外的处理。
答案 2 :(得分:-1)
为什么不创建输入密码的起始页?
对于拥有MainPage.xaml的实例,在WMAppManifest上创建一个InsertPasswordPage.xaml引用作为起始页面:
<DefaultTask Name="_default" NavigationPage="InsertPasswordPage.xaml" />
并在InsertPasswordPage.xaml上插入所有密码逻辑,当用户成功登录时,只需导航到您的主页;)
编辑:正如Gambit所说,如果用户按下后退按钮,他将返回插入密码页面,但您可以通过在用户登录后从后台堆叠中删除页面来解决此问题。