UriMapper和重写的URI问题

时间:2013-02-26 20:36:45

标签: c# silverlight windows-phone-7 windows-phone-8

对于蹩脚的问题标题,很难用一句话来描述这个问题。问题如下:

我需要确保用户在开始使用该应用之前已经接受了许可协议。我的想法是使用UriMapper,它将检查用户之前是否已接受协议,如果没有,则将他或她重定向到许可协议页面。

public override Uri MapUri(Uri uri)
    {
        if(!settingsStorage.IsLicenseAgreementAccepted)
            return LicenseAgreementPage;
        return uri;
    }

但是,在许可协议页面上,如果我覆盖OnNavigatedTo,我看到导航URI不是当前页面的URI,而是非映射URI,例如我的主页的地址。因此,当我尝试导航到该主页时,没有任何反应,因为导航服务认为我已经在那里了。

public partial class LicenseAgreementPage : PhoneApplicationPage
{
    protected override void OnNavigatedTo(NavigationEventArgs e)
    {
        base.OnNavigatedTo(e); // somehow e.Uri equals to /MainPage.xaml, instead of /LicenseAgreementPage.xaml
    }
}

那么如何克服这个? UriMapper不适用于此吗?或者有一些解决方法吗?

感谢。

1 个答案:

答案 0 :(得分:0)

我遇到了类似的问题,其中一些页面要求用户登录。如果用户尝试转到需要登录的页面,则会将其重定向到登录页面,然后再发回。也许你可以使用相同的策略?

    protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
    {
        base.OnNavigatedTo(e);

        if (Requirelogin && !CurrentAppManager.IsUserLoggedIn)
        { 

           // Transfer URI to the login page and save it, after successful login, 
           // the login page navigate back to the stored URI
            ((PhoneApplicationFrame)Application.Current.RootVisual).Navigate(new Uri("Login?" + Helpers.URI + "=" + e.Uri.ToString(), UriKind.Relative));
        }

        // if the user has just come from Login
        // remove it from the stack so they dont hit when pressing back
        var entry = NavigationService.BackStack.FirstOrDefault();

        if (entry != null && entry.Source.OriginalString.Contains("Login"))
        {
            NavigationService.RemoveBackEntry();
        }
    }