2012-12-11 42 views
11

当我加载页面UserLogin时,我想检查用户数据库,如果它不存在或无法读取,我希望将它指向NewUser页面。无法使用c导航到Windows Metro应用程序上的页面#

protected override void OnNavigatedTo(NavigationEventArgs e) 
{ 
    CheckForUser(); 
    if (UserExists == false) 
     this.Frame.Navigate(typeof(NewUser)); 
} 

的问题是,它从来没有定位到NewUser,甚至当我注释掉if条件。

+2

你检查MSDN **这里是一个链接http://msdn.microsoft.com/en-us/library/windows/apps/br211386.aspx ** – MethodMan

+0

我不认为你可以在导航'OnNavigatedTo'方法,因为你仍然在导航中。 – Trisped

回答

14

Navigate不能被称为直接形成OnNavigatedTo方法。你应该通过Dispatcher调用你的代码,它会工作:

protected override void OnNavigatedTo(NavigationEventArgs e) 
{ 
    base.OnNavigatedTo(e); 
    CheckForUser(); 
    if (UserExists == false) 
     Dispatcher.RunAsync(CoreDispatcherPriority.Normal, 
          () => this.Frame.Navigate(typeof(NewUser))); 
} 
+0

请务必在被覆盖的方法调用的顶部调用base.OnNavigatedTo(e)。我有这个相同的代码,减去base.OnNavigatedTo(e),我仍然得到一个异常。这个答案帮了我,谢谢! –

0

,你可以,如果你想使用第三方工具,如Telerik的尝试此链接,以及试试这个,看看这个工程

frame.Navigate(typeof(myPage)); // the name of your page replace with myPage 

完整的例子

var cntnt = Window.Current.Content; 
    var frame = cntnt as Frame; 

    if (frame != null) 
    { 
     frame.Navigate(typeof(myPage)); 
    } 
    Window.Current.Activate(); 

Classic Windows Forms, Stunning User Interface

0

我看到你重写OnNavigatedTo方法,但不要调用基方法。这可能是问题的根源。 尝试任何逻辑之前调用基方法:

protected override void OnNavigatedTo(NavigationEventArgs e) 
{ 
    base.OnNavigatedTo(e); 
    CheckForUser(); 
    if (UserExists == false) 
     this.Frame.Navigate(typeof(NewUser)); 
} 
0

使用Dispatcher.RunIdleAsync推迟您导航到另一个页面,直到用户登陆页面完全加载。

0

其他是正确的,但由于Dispatcher不会从视图模型的工作,这里是如何做到这一点有:

SynchronizationContext.Current.Post((o) => 
{ 
    // navigate here 
}, null); 
1

这是因为你的应用程序试图在当前帧完全加载之前进行导航。调度员可能是一个很好的解决方案,但是你必须遵循下面的语法。

using Windows.UI.Core;

private async void to_navigate() 
    { 
     await Dispatcher.RunAsync(CoreDispatcherPriority.Normal,() => this.Frame.Navigate(typeof(MainPage))); 
    } 
  1. 与你想要的页面名称替换的MainPage。
  2. 称此为to_navigate()函数。
相关问题