Переключение между страницами вызывает сбои в Windows 10 Mobile

Я использую Xamarin Forms (2.3.4.247), и мое приложение использует «HamburgerMenu». Для переключения между страницами я использую его код:

private FirstPage firstPage; //it's i get from the constructor
private SecondPage secondPage = new SecondPage();
private ThirdPage thirdPage = new ThirdPage(); 
private async void ItemSelectedMethod()
{
        var root = App.NavigationPage.Navigation.NavigationStack[0];
        if (SelectedItem == Items[0])
        {
            if (!IsFirstChoose)
            {
                App.NavigationPage.Navigation.InsertPageBefore(firstPage, root);
                await App.NavigationPage.PopToRootAsync(false);
            }
        }
        if (SelectedItem == Items[1])
        {
            App.NavigationPage.Navigation.InsertPageBefore(secondPage, root);
            await App.NavigationPage.PopToRootAsync(false);
        }
        if (SelectedItem == Items[2])
        {
            App.NavigationPage.Navigation.InsertPageBefore(thirdPage, root);
            await App.NavigationPage.PopToRootAsync(false);
        }

        IsFirstChoose = false;
        rootPageViewModel.IsPresented = false;
}

Все работает хорошо на рабочем столе Android и Windows 10, в симуляторе Windows 10 Mobile мое приложение вылетает, когда я переключаюсь между третьей страницей и первой страницей. Первая страница является корневой:

FirstPage firstPage = new FirstPage();
NavigationPage = new NavigationPage(firstPage);

Не знаю почему... Симулятор не позволяет отлаживать...

Второе: когда я обновляю Xamarin Forms до версии 2.3.5.256-pre6, мое приложение вызывает исключение «System.ArgumentException: «Невозможно вставить страницу, которая уже находится в стеке навигации»... Но когда я меняю код на:

App.NavigationPage.Navigation.InsertPageBefore(new ThirdPage(), root);
App.NavigationPage.Navigation.InsertPageBefore(new SecondPage(), root);
//etc

все работает... Кто-нибудь знает, почему это происходит? Я не хочу создавать новые объекты при переключении страниц...


person luki    schedule 01.07.2017    source источник


Ответы (1)


Вы ответили на вопрос, поэтому я могу только подтвердить это:

System.ArgumentException: 'Cannot insert page which is already in the navigation stack'

Как видите, у вас уже есть страница firstPage в App.NavigationPage.Navigation, поэтому вставка другой приводит к сбою приложения. Вы просто не можете сделать это, как вы объяснили - либо вам нужно создать новый экземпляр, либо вам нужно удалить предыдущий экземпляр из стека.

person Ivan Ičin    schedule 01.07.2017
comment
Да, а почему не кидает на версию 2.3.4.247? И почему приложение вылетало только на Win10Mobile? - person luki; 02.07.2017
comment
Xamarin преобразует ваши вызовы в нативные классы. В каждой ОС есть собственные классы, поддерживающие навигацию, и они могут действовать по-разному. Это явно не работает на Windows 10 Mobile. Почему его не перекидывают в предыдущей версии Xamarin? Вероятно, потому что что-то не работало должным образом, это одна из причин появления обновлений Xamarin. - person Ivan Ičin; 02.07.2017
comment
Возможно Вы правы. Итак... Какой код должен быть для работы на Android и Windows Mobile? (теперь мой код работает только на рабочем столе Android и Windows). - person luki; 02.07.2017
comment
Как сказано, если вы не хотите создавать новый экземпляр, вы можете проверить, присутствует ли текущий экземпляр в стеке, и удалить его. - person Ivan Ičin; 02.07.2017