Xamarin.Forms 中的适当 Page.Loaded 事件
Proper Page.Loaded event in Xamarin.Forms
在过去的 2 个月里,我一直在孜孜不倦地寻找一种方法来在使用 Xamarin.Forms 时实现适当的 Page.Loaded
事件,但我无法实现或找不到实现它的方法。
大多数人建议覆盖 Page.OnAppearing
或为 Page.Appearing
添加事件处理程序,这两者都不是答案或实现预期效果的正确方法,并且事件不会像真正的Page.Loaded
事件会。
我想了解以下内容:
- 为什么 Xamarin.Forms 没有内置
Page.Loaded
事件?
- 有解决办法吗?
- 我可以从原生端实现吗?
编辑:
我所说的“正确的 Page.Loaded
”事件是指:
它必须被调用一次,并且只能在页面加载所有控件、布置它们、初始化它们并首次呈现它们时调用。
从模态页面返回时不得调用它。
目前Xamarin.Forms不提供proper/complete生命周期事件来满足所有特定要求,但情况正在改善,开发团队目前正在努力解决这个问题,如下所述官方 GitHub Repos 上的问题和最近的拉取请求(您可以关注,获得想法并可能在他们发布之前自己实施),他们肯定会提供未来,虽然还不清楚什么时候准备好。
1.Why不加载ContentPage
的constructor
中的data/controls? constructor
方法仅调用一次,在 Page.OnAppearing
.
之前也被调用
Can I implement it from the native side?
是的,我想你可以。
在 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();
}
}
}
在过去的 2 个月里,我一直在孜孜不倦地寻找一种方法来在使用 Xamarin.Forms 时实现适当的 Page.Loaded
事件,但我无法实现或找不到实现它的方法。
大多数人建议覆盖 Page.OnAppearing
或为 Page.Appearing
添加事件处理程序,这两者都不是答案或实现预期效果的正确方法,并且事件不会像真正的Page.Loaded
事件会。
我想了解以下内容:
- 为什么 Xamarin.Forms 没有内置
Page.Loaded
事件? - 有解决办法吗?
- 我可以从原生端实现吗?
编辑:
我所说的“正确的 Page.Loaded
”事件是指:
它必须被调用一次,并且只能在页面加载所有控件、布置它们、初始化它们并首次呈现它们时调用。
从模态页面返回时不得调用它。
目前Xamarin.Forms不提供proper/complete生命周期事件来满足所有特定要求,但情况正在改善,开发团队目前正在努力解决这个问题,如下所述官方 GitHub Repos 上的问题和最近的拉取请求(您可以关注,获得想法并可能在他们发布之前自己实施),他们肯定会提供未来,虽然还不清楚什么时候准备好。
1.Why不加载ContentPage
的constructor
中的data/controls? constructor
方法仅调用一次,在 Page.OnAppearing
.
Can I implement it from the native side?
是的,我想你可以。
在 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();
}
}
}