Windows Phone 7,登录屏幕重定向和.exit的案例?

我知道这已被讨论过,但我想提出我的情况….

  1. 我的应用程序中的起始页面是login.xaml。 用户登录,用户名和密码通过我的WCF服务进行身份validation,用户名保存在独立存储中,然后用户被重定向到mainpage.xaml。

  2. 当用户启动我的应用程序时,他们已经在隔离存储中保存了用户名,他们将被重定向到mainpage.xaml

  3. 如果用户从mainpage.xaml点击“返回”硬按钮,则会重定向到登录屏幕,登录屏幕又将其重定向回mainpage.xaml,因为他们已经保存了本地用户名。 这导致我的应用程序目前无法通过认证,因为用户无法点击“返回”按钮从mainpage.xaml退出应用程序。

我的直觉是覆盖mainpage.xaml中的BackKeyPress并以某种方式退出应用程序。 通过阅读其他post,我可以看到此方法不可用。 我的第二个想法是以某种方式在app.xaml.cs页面中存储一个属性,它会告诉应用程序在加载登录页面时退出并且该属性设置为true,但这似乎有点hacky ….

这里有什么想法?

使用的更新解决方案:

最终工作的是使登录页面成为mainpage.xaml中的一个透视项目。 当用户在未登录的情况下打开应用程序时,当前选定的数据透视表项将更改为登录数据透视表项。 如果用户打开了应用程序并且已登录,则将选择正常的透视项目。

我这样做是通过将登录页面和主页面组合成一个页面,在堆栈面板中有两个网格,并操纵网格的可见性,以便在匿名用户和经过身份validation的用户所需的UI之间切换。 这使得问题消失,无需干掉历史或摆弄旗帜。

使用合适的转换器和可见性属性的适当绑定,我可以在没有显式代码的情况下运行整个节目,但这将是聪明和聪明之间差异的一个很好的例子 – 它工作得很好,迟早我会忘记它是怎么回事工作(好吧,我承认,我这样做,忘了它是如何工作的)。

您可能应该更改流程以自动启动MainPage.xaml,如果用户尚未登录,它将在第一次加载时重定向到登录页面。 然后你设置一个标志不自动重定向到登录页面,所以如果用户回击中止登录,他们最终会在MainPage.xaml,这可能只是“请登录以使其有用”。 而且你永远不会阻止MainPage.xaml的后退按钮。

所以你的问题(据我所知)是:

  • LOGIN.XAML – > LoggedInUser.XAML
  • —-> HIT BACK BUTTON <----
  • – >然后返回LOGIN.XAML
  • – >然后返回LoggedInUser.XAML然后返回…

您可以在用户登录后设置一个标志,然后在OnNavigated事件上可以检查该标志以确定是否要重定向? 如果没有某种旗帜,我不确定你将如何做到这一点并通过认证。 尽管如此,我个人不会这样做。 我很确定自动重定向不是高度重视(主要是因为认证过程和UX)。 您可能需要考虑使用带登录按钮的主屏幕。 然后登录屏幕将执行您需要的操作,然后如果它通过,则转到您的应用程序的下一步。

只需2美分。

如果您使用的是Mango,请在mainpage.xaml上执行此操作。 这将弹出堆栈的login.xaml。 希望有所帮助。

protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e) { PhoneApplicationFrame RootFrame = Application.Current.RootVisual as PhoneApplicationFrame; if (RootFrame != null) { if (RootFrame.BackStack.Count() > 0) { RootFrame.RemoveBackEntry(); } } } 

我认为这里的问题是,登录屏幕,不应该是一个页面(我的意思是PhoneApplicationPage或任何扩展它的类)。 在我看来,登录屏幕应该只是任何页面的子窗口,这需要用户登录一些如何。

因此,这里的方法是将登录屏幕作为用户控件,并将其添加到需要用户登录的页面上的Popup控件。然后在页面的Loaded事件上或在需要身份validation的任何操作之前,您只需检查如果用户已登录,如果不是,则只需更改视觉状态(使用登录打开弹出窗口,当然使用ubercool动画:))就是这样。 用户登录弹出窗口关闭,您回到页面,无需重定向或任何其他黑客攻击。

PS:我鼓励你和阅读这篇文章的所有人阅读Peter Torr关于地方概念的post,这里>> http://blogs.msdn.com/b/ptorr/archive/2010/08/28/introducing-the-概念的-places.aspx

我还没有提交我的应用程序以供审批,但我没有理由相信它不会根据我对返回导航规则的理解以及到目前为止提交应用程序的经验。

我选择了类似于Peter Torr的方法: http : //blogs.msdn.com/b/ptorr/archive/2010/08/28/redirecting-an-initial-navigation.aspx?wa=wsignin1.0

我最初的问题是从登录页面到MainPage的重定向无法正常工作。 这需要(a)在登录后再次更新UriMapper并且(b)在来自登录时添加到MainPage.xaml的查询字符串只是为了更改Uri,因此操作系统认为它是导航到的不同页面。

更多信息, 请访问http://www.geoffhudik.com/tech/2012/2/19/windows-phone-login-navigation.html 。 我会更新,如果由于某种原因它没有得到批准或其他更好的东西显示。

我在这里的问题中解决了它。

基本上,从您想要的任何页面开始,并抛出您在Application的UnhandledException处理程序中捕获的特定exception(在我的情况下为AuthFailedException )。 然后重定向到登录页面并执行常规身份validation。

成功后, GoBack到你来自的页面。 如果在登录屏幕上按下后退按钮,则在BackKeyPressed处理程序中监听它,清除后台堆栈(可选:直到您点击不需要身份validation的页面)并让事件通过。 这应该退出你的应用程序或至少发送回你开始的地方。

关于用户体验,不是真正的模态,而是不透明的。

对Amer Gill的回答更合乎逻辑的替代方法是在Login页面中覆盖OnNavigatedFrom并在导航到Main页面时清除backstack:

 protected override void OnNavigatedFrom(NavigationEventArgs e) { while (NavigationService.BackStack.Any()) { NavigationService.RemoveBackEntry(); } } 

好吧,即使你创建了一个有效的解决方案,让我给你另一个建议:)我发现最好的方法是使用UriMapper

不要重新发明轮子,这里有一个很好的例子提交给StackOverflow: 如果应用程序首次启动,如何显示页面