Xamarin.Forms 中正确的 Page.Loaded 事件

Abd*_*wan 4 lifecycle xamarin.forms

在过去的两个月里,我一直在不知疲倦地寻找一种Page.Loaded在使用 Xamarin.Forms 时实现正确事件的方法,但我无法实现或找到一种方法来实现它。

大多数人建议重写Page.OnAppearing或添加事件处理程序,Page.Appearing这两者都不是答案或实现所需效果的正确方法,并且事件的行为不像真实Page.Loaded事件那样。

我想了解以下信息:

  • 为什么 Xamarin.Forms 没有内置Page.Loaded事件?
  • 有解决办法吗?
  • 我可以从本机端实现它吗?

编辑:

我所说的“适当的Page.Loaded”事件是指:

  • 它必须被调用一次,且仅当页面加载了所有控件、布置它们、初始化它们并首次呈现它们时。

  • 从模态页面返回时不得调用它。

Jac*_*Hua 5

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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)