Не удается перейти на страницы в приложении Metro Metro с помощью С#

Когда моя страница UserLogin загружается, я хочу проверить базу данных пользователя, а если она не существует или не может быть прочитана, я хочу направить ее на страницу NewUser.

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

Проблема заключается в том, что он никогда не переходит в NewUser, даже когда я комментирую условие if.

Ответ 1

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)));
}

Ответ 2

Это происходит из-за того, что ваше приложение пытается перейти до полной загрузки текущего фрейма. Диспетчер может быть хорошим решением, но вы должны следовать синтаксису ниже.

с использованием Windows.UI.Core;

    private async void to_navigate()
    {
        await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => this.Frame.Navigate(typeof(MainPage)));
    }
  • Замените MainPage на нужное имя страницы.
  • Вызов этой функции to_navigate().

Ответ 3

вы можете попробовать это и посмотреть, работает ли это

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();

или

если вы хотите использовать сторонний инструмент, например Telerik, попробуйте эту ссылку.

Классические формы Windows, потрясающий пользовательский интерфейс

Ответ 4

Я вижу, что вы переопределяете метод OnNavigatedTo, но не вызываете базовый метод. Это может быть источником проблемы. Попробуйте вызвать базовый метод перед любой логикой:

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

Ответ 5

Используйте Dispatcher.RunIdleAsync, чтобы отложить навигацию на другую страницу, пока страница UserLogin не будет полностью загружена.

Ответ 6

Другие правильны, но поскольку диспетчер не работает с моделью просмотра, вот как это сделать:

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