Not able to navigate to pages on Windows Metro App

2019-02-09 03:10发布

When my UserLogin page loads, i want to check for user database, and if it doesn't exist, or can't be read, i want to direct it to NewUser page.

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

The problem is that it never navigates to NewUser, even when i comment out the if condition.

6条回答
一纸荒年 Trace。
2楼-- · 2019-02-09 03:48

This happens because your app tries to navigate before the current frame completely loaded. Dispatcher could be a nice solution, but you have to follow the syntax bellow.

using Windows.UI.Core;

    private async void to_navigate()
    {
        await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => this.Frame.Navigate(typeof(MainPage)));
    }
  1. Replace MainPage with your desired page name.
  2. Call this to_navigate() function.
查看更多
仙女界的扛把子
3楼-- · 2019-02-09 03:50

The others are correct, but since Dispatcher doesn't work from the view model, here's how to do it there:

SynchronizationContext.Current.Post((o) =>
{
    // navigate here
}, null);
查看更多
Luminary・发光体
4楼-- · 2019-02-09 03:52

you can try this and see if this works

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

full example

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

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

or

if you want to use a 3rd party tool like Telerik try this link as well

Classic Windows Forms, Stunning User Interface

查看更多
唯我独甜
5楼-- · 2019-02-09 03:52

I see you override OnNavigatedTo method but do not call base method. It may be the source of problem. Try calling base method before any logic:

protected override void OnNavigatedTo(NavigationEventArgs e)
{
    base.OnNavigatedTo(e);
    CheckForUser();
    if (UserExists == false)
        this.Frame.Navigate(typeof(NewUser));
}
查看更多
戒情不戒烟
6楼-- · 2019-02-09 03:54

Use Dispatcher.RunIdleAsync to postpone your navigation to another page until UserLogin page is completely loaded.

查看更多
乱世女痞
7楼-- · 2019-02-09 03:59

Navigate can't be called directly form OnNavigatedTo method. You should invoke your code through Dispatcher and it will work:

protected override void OnNavigatedTo(NavigationEventArgs e)
{
    base.OnNavigatedTo(e);
    CheckForUser();
    if (UserExists == false)
        Dispatcher.RunAsync(CoreDispatcherPriority.Normal, 
                            () => this.Frame.Navigate(typeof(NewUser)));
}
查看更多
登录 后发表回答