Не удается перейти на страницы в приложении 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);