Последние 2 месяца я неустанно искал способ реализовать правильное событие Page.Loaded
при использовании Xamarin.Forms, но не смог реализовать или найти способ сделать это.
Большинство людей предлагают переопределить Page.OnAppearing
или добавить обработчик событий для Page.Appearing
, оба из которых не являются ответами или правильным способом достижения желаемого эффекта, и событие не ведет себя так, как настоящее Page.Loaded
событие.
Я хотел бы знать следующее:
Page.Loaded
?Редактировать:
Что я имею в виду под «правильным Page.Loaded
» событием:
Он должен быть вызван ОДИН И ТОЛЬКО КОГДА страница загрузит все свои элементы управления, разместит их, инициализирует и отобразит в первый раз.
Его НЕ следует вызывать при возврате с модальных страниц.
Не могли бы вы попытаться описать больше, что вы пытаетесь сделать? чтобы мы могли указать вам правильное направление?
Правильное событие load будет вызываться только один раз после того, как содержимое страницы будет загружено и инициализировано (например, WPF, UWP или WinForms), а не до того, как содержимое появится или когда я вернусь на страницу после открытия модального окна. Да, в Android есть OnCreate. Я не работаю с iOS, поэтому я не знаю об этом.
@AbdelFattahRadwan Я хорошо знаю, что делает событие загрузки страницы, вы можете попытаться переопределить метод LayoutChildren, хотя он не для этого создан, поэтому я бы предпочел, чтобы вы упомянули, что вы пытаетесь сделать
Я не хотел сказать, что вы не знали, извините, этот комментарий был предназначен для @Jason, чтобы прояснить то, что мне нужно. и LayoutChildren также не является решением, поскольку он вызывается несколько раз за жизненный цикл страницы...
«Правильно загруженное событие будет вызываться только один раз после того, как содержимое страницы будет загружено и инициализировано» — OnCreate
вызывается до того, как это произойдет.
но в OnCreate
вы можете вызвать SetContentView
, что позволит вам загрузить контент, а затем инициализировать его.
В настоящее время 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
, в любом случае спасибо за вашу помощь.
Ничего страшного, можно попробовать нативные способы.
@AbdelFattahRadwan Мое решение работает для вас? Если да, не могли бы вы принять его (нажмите ☑️ в верхнем левом углу этого ответа), чтобы мы могли помочь большему количеству людей с такой же проблемой :).
как конкретно «правильное» событие Loaded будет вести себя иначе, чем OnAppearing? Есть ли в Android или iOS нативное событие страницы, соответствующее вашим критериям?