2013-03-18 61 views
0

在WP应用程序中,我们需要提供用户选项以使用密码锁定应用程序。使用密码锁定应用程序

据我了解WP应用程序生命周期,我需要把导航LockPage在App.Application_Activated,App.Application_Deactivated开始页面,但我不能在App类使用的NavigationService ...

我不想把导航代码锁定在其他页面的页面,或者没有其他选项?

回答

1

我所著自己的解决方案,但可能也不是那么优雅,因为它可以。

应用锁定逻辑:用户能够应用与密码锁,我们在处理Application_Deactivated并在App类Application_Closing事件和锁定用户,如果启用此选项标记的应用程序。然后,在每个页面上,我们应该检查:应用程序当前是否被锁定,如果是,我们应该导航到AppLockedWithPasswordPage。在AppLockedWithPasswordPage上,我们需要检查用户的密码,如果它是正确的,调用NavigationService.GoBack()。

因此,我们需要做的6个步骤:

  1. 你应该选择在哪里保存IsAppCurrentlyLocked(布尔标志),AppLockPassword(串)和IsUserEnabledAppLockWithPassword(布尔标志)。我选择了IsolatedStorageSettings

  2. 创建AppLockedWithPassword页面,在这里你需要显示文本框和按钮,不要忘记提供选项供用户当然有删除的应用程序数据

  3. AppLockedWithPasswordPage应防止后退按钮导航重置的AppLock,所以防止它:

    // AppLockedWithPasswordPage 
    protected override void OnBackKeyPress(CancelEventArgs e) 
    { 
        // Preventing back key navigation 
        e.Cancel = true; 
    } 
    
  4. 按钮确认密码点击

    // AppLockedWithPasswordPage 
    private void UnlockAppButton_Click(object sender, RoutedEventArgs e) 
    { 
        if (PasswordBox.Password.Equals(IsolatedStorageSettings["AppLockPassword"])) 
        { 
         NavigationService.GoBack(); 
        } 
        else 
        { 
         // Say user, that password incorrect, etc... 
        } 
    } 
    
  5. 在App类找到Application_Deactivated(用于处理应用程序最小化(windows键)),并在该事件发生

    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(); 
    } 
    
  6. 为锁定,如果用户启用该选项Application_Closing(处理当用户关闭应用程序)的方法,我们应该纪念的应用
  7. ,也是最后一步,在所有网页上,你想锁定你应该加入的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(); 
    } 
    

P.S.当然,真正的代码要好得多,这只是简单的例子,我希望它会帮助你

+2

我会使用一个基类页面调用'PagesUtils.NavigateToAppLockedWithPasswordPageIfAppLocked()'所以你不必添加它每一页上。 – 2013-03-20 14:42:14

-1

为什么不创造一个输入密码的开始页面?

对于情况下,你有你的MainPage.xaml中,创建一个InsertPasswordPage.xaml引用它WMAppManifest作为起始页:

<DefaultTask Name="_default" NavigationPage="InsertPasswordPage.xaml" /> 

而且插入的InsertPasswordPage.xaml所有密码逻辑,当用户成功登录只是导航到您的主页;)

编辑:由于Gambit说如果用户按下后退按钮,他将返回到插入密码页面,但您可以通过从后台堆栈中删除用户登录后的页面英寸

+2

问题这种方法是,当用户点击的MainPage从后退按钮,他会再次遇到密码页面。另外,如果用户从某个任意页面跳出应用程序,当他们跳回应用程序时,密码页面将不会显示以阻止它们。 – Gambit 2013-03-18 17:33:16

+0

错误,您可以从后面的堆栈中解决该问题。谢谢你的提示编辑吼声后;) – DVD 2013-03-18 22:03:43

+1

从后面堆栈中删除的页面不会解决通过Home键跳出应用程序,然后通过返回按钮返回到应用程序的用户的问题。即使在这种应用切换场景中,用户也需要被密码页面阻止。 – Gambit 2013-03-18 22:31:00

0

您应该在Application_LaunchingApplication_Activated事件中添加支票。

当应用程序第一次打开并激活一个用于当用户返回到应用程序在离开后做别的东西的发射活动。

有这些事件都设置一个标志,并有基页时,浏览到您的所有网页的检查继承了这个标志。如果设置了该标志,则应该进行检查,如果是,则显示登录提示,然后在成功输入密码后清除该标志。
这种做法将处理FAS,FAR &深层链接,除了正常启动的应用程序。

当心有些选择器会在返回到应用程序时触发激活的事件。根据需要为这些添加额外的处理/如有必要。

+0

我处理Application_Deactivated和Application_Closing事件,并设置该应用程序被锁定标志,然后每一页我都检查,将打开LockPage如果标志为true – 2013-03-19 05:05:09

+0

@ArtemZinnatullin你只是说,你做了什么我建议,或者你的评论还有另外一个问题吗?如果我的回答解决了你的问题,你应该接受答案并且赞成。 – 2013-03-20 09:26:01

+0

不,我想说的话,那Application_Launching和Application_Activated事件不是有用的,因为我不能把导航代码AppLockedWithPassword页面在此事件。正如你所看到的,我已经解决了我的问题,并且写了自己的答案 – 2013-03-20 11:13:58