UWP: страница изменения страницы с вкладками Xamarin Forms не вызывает OnAppearing

В проекте Xamarin Forms я создал TabbedPage, внутри которого я добавил 5 дочерних страниц навигации.

{
    Children.Add(new NavigationPage(new A()));
    Children.Add(new NavigationPage(new B()));
    Children.Add(new NavigationPage(new C()));
    Children.Add(new NavigationPage(new D()));
    Children.Add(new NavigationPage(new E()));
}

Когда я нажимаю вручную вкладку B из вкладки A; Метод B OnAppearing вызывается должным образом. Однако, когда я программно меняю вкладку, используя

tabbedPage.CurrentPage = tabbedPage.Children[index]

Затем метод B OnAppearing никогда не вызывается. Это происходит в UWP.


person patel kavit    schedule 15.06.2017    source источник
comment
Похоже, у меня похожая проблема, ваша модель просмотра на каждой странице выполняет нелокальные данные?   -  person Ganesh Cauda    schedule 16.06.2017
comment
Для этого мы не используем MVVM, мы просто используем MVC. Когда мы вручную меняем вкладку, вызывается метод появления выбранной вкладки, однако, когда мы программно изменяем вкладку, тогда появляющийся метод не вызывается для выбранной вкладки.   -  person patel kavit    schedule 16.06.2017
comment
Я поместил этот код строки (this.CurrentPage = this.Children[2];) в метод конструктора TabbedPage. Но я не смог воспроизвести вашу проблему на своей стороне. Это мой образец кода. Пожалуйста, проверьте.   -  person Nico Zhu - MSFT    schedule 16.06.2017
comment
@ NicoZhu-MSFT Спасибо, ваш код работает в этом сценарии. При запуске приложения он выбирает третью страницу и вызывает ее OnAppearing. Однако я изменил ваш код, чтобы воспроизвести свой сценарий. На первой странице есть кнопка "Щелкните меня". Я помещаю код для отображения Третьей страницы при нажатии этой кнопки. При нажатии кнопки пользователь перенаправляется на Третью страницу с Первой, но метод OnAppearing () Третьей страницы вообще не вызывается. Пожалуйста, проверьте. (Сообщите мне, могу ли я зафиксировать свои изменения в вашем репо, чтобы вы их протестировали)   -  person patel kavit    schedule 16.06.2017
comment
@ NicoZhu-MSFT У вас была возможность найти проблему?   -  person patel kavit    schedule 21.06.2017


Ответы (1)


Что касается Xamarin Forms 3.4.0.1008975 и UWP 6.1.5, это все еще кажется проблемой. Я решил это так:

Сделайте интерфейс под названием IAppearable:

internal interface IAppearable
{
    void HandleAppearing();
}

Попросите свою страницу содержимого реализовать этот интерфейс:

public partial class MyContentPage : ContentPage, IAppearable

В HandleAppearing сделайте то, что вы сделали бы в OnAppearing:

public void HandleAppearing()
    {
        // do appearing stuff here
    }

После того, как вы программно настроили свою вкладку, используйте этот код:

CurrentPage = Children[pageIndex];

if (Device.RuntimePlatform == Device.UWP)
{
    if (CurrentPage is IAppearable appearablePage)
    {
        appearablePage.HandleAppearing();
    }
}
person Kip Morgan    schedule 04.03.2019
comment
У меня такая проблема с XF v4.0. У вас есть ссылка на обнаруженную ошибку? - person IRONicMAN; 26.06.2019
comment
То же самое и в июле 2019 года. Сообщили о какой-либо ошибке? - person IRONicMAN; 29.07.2019
comment
Это все еще актуально в 2021 году. Проблема создается github.com/xamarin/Xamarin.Forms / issues / 3855 сложно исправить на стороне Xamarin. Тем не менее, подход @kip-morgan здесь кажется лучшим. Вопрос только в том, кто должен нести ответственность за срабатывание HandleAppearing(). В моем случае я сделал это за OnCurrentPageChanged. - person krs; 19.02.2021