Правильное событие Page.Loaded в Xamarin.Forms

Последние 2 месяца я неустанно искал способ реализовать правильное событие Page.Loaded при использовании Xamarin.Forms, но не смог реализовать или найти способ сделать это.

Большинство людей предлагают переопределить Page.OnAppearing или добавить обработчик событий для Page.Appearing, оба из которых не являются ответами или правильным способом достижения желаемого эффекта, и событие не ведет себя так, как настоящее Page.Loaded событие.

Я хотел бы знать следующее:

  • Почему в Xamarin.Forms нет встроенного события Page.Loaded?
  • Есть обходной путь?
  • Могу ли я реализовать это с нативной стороны?

Редактировать:

Что я имею в виду под «правильным Page.Loaded» событием:

  • Он должен быть вызван ОДИН И ТОЛЬКО КОГДА страница загрузит все свои элементы управления, разместит их, инициализирует и отобразит в первый раз.

  • Его НЕ следует вызывать при возврате с модальных страниц.

как конкретно «правильное» событие Loaded будет вести себя иначе, чем OnAppearing? Есть ли в Android или iOS нативное событие страницы, соответствующее вашим критериям?

Jason 12.12.2020 21:24

Не могли бы вы попытаться описать больше, что вы пытаетесь сделать? чтобы мы могли указать вам правильное направление?

Scarnet 12.12.2020 21:29

Правильное событие load будет вызываться только один раз после того, как содержимое страницы будет загружено и инициализировано (например, WPF, UWP или WinForms), а не до того, как содержимое появится или когда я вернусь на страницу после открытия модального окна. Да, в Android есть OnCreate. Я не работаю с iOS, поэтому я не знаю об этом.

Abdelfattah Radwan 12.12.2020 21:30

@AbdelFattahRadwan Я хорошо знаю, что делает событие загрузки страницы, вы можете попытаться переопределить метод LayoutChildren, хотя он не для этого создан, поэтому я бы предпочел, чтобы вы упомянули, что вы пытаетесь сделать

Scarnet 12.12.2020 21:39

Я не хотел сказать, что вы не знали, извините, этот комментарий был предназначен для @Jason, чтобы прояснить то, что мне нужно. и LayoutChildren также не является решением, поскольку он вызывается несколько раз за жизненный цикл страницы...

Abdelfattah Radwan 12.12.2020 21:41

«Правильно загруженное событие будет вызываться только один раз после того, как содержимое страницы будет загружено и инициализировано» — OnCreate вызывается до того, как это произойдет.

Jason 12.12.2020 22:22

но в OnCreate вы можете вызвать SetContentView, что позволит вам загрузить контент, а затем инициализировать его.

Abdelfattah Radwan 12.12.2020 22:25
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
7
7 970
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

В настоящее время Xamarin.Forms не обеспечивает правильных/полных событий жизненного цикла для выполнения всех конкретных требований, но ситуация улучшается, команда разработчиков в настоящее время работает над решением этой проблемы, ниже упомянутых проблем и недавнего запроса на включение на официальном GitHub Репозитории (вы можете следить, получать идеи и, возможно, реализовывать их самостоятельно, прежде чем они даже отправят их), они наверняка предоставят это в будущем, хотя неясно, когда это будет готово.

Ответ принят как подходящий

1. Почему бы не загрузить данные/элементы управления в constructor из ContentPage? Метод constructor вызывается только один раз и также вызывается перед Page.OnAppearing.

Могу ли я реализовать это с нативной стороны?

Да, я думаю, вы можете.

В iOS переопределите метод ViewDidLoad в пользовательском рендерере:

[assembly:ExportRenderer (typeof(ContentPage), typeof(MyPageRenderer))]
namespace App487.iOS
{
    public class MyPageRenderer : PageRenderer
    {

        protected override void OnElementChanged(VisualElementChangedEventArgs e)
        {
            base.OnElementChanged(e);
        }
        public override void ViewDidLoad()
        {
            base.ViewDidLoad();
            //call before ViewWillAppear and only called once
        }

        public override void ViewWillAppear(bool animated)
        {
            base.ViewWillAppear(animated);
        }
    }
}

В Android попробуйте переопределить метод OnAttachedToWindow:

[assembly: ExportRenderer(typeof(ContentPage), typeof(MyPageRenderer))]
namespace App487.Droid
{
    public class MyPageRenderer : PageRenderer
    {
        public MyPageRenderer(Context context) : base(context)
        {
        }

        protected override void OnElementChanged(ElementChangedEventArgs<Page> e)
        {
            base.OnElementChanged(e);
        }

        protected override void OnAttachedToWindow()
        {
            base.OnAttachedToWindow();
        }
    }
}

Я уже начал помещать свой код инициализации в конструктор, пока не будет реализовано событие Loaded, в любом случае спасибо за вашу помощь.

Abdelfattah Radwan 14.12.2020 10:34

Ничего страшного, можно попробовать нативные способы.

nevermore 14.12.2020 10:44

@AbdelFattahRadwan Мое решение работает для вас? Если да, не могли бы вы принять его (нажмите ☑️ в верхнем левом углу этого ответа), чтобы мы могли помочь большему количеству людей с такой же проблемой :).

nevermore 15.12.2020 02:30

Другие вопросы по теме