问题描述
我一直在关注这个答案,以便知道我的 Xamarin 页面何时加载。 https://stackoverflow.com/a/63592259/560476
粗略的想法是,一旦 PageRenderer
附加到窗口,它就会将 PageLoaded
消息触发到 MessagingCenter
和我订阅的 MainPage
然后消息会做出反应。
然而,此实现的问题在于,只要 ContentPage
触发 OnAppearing
,它都会触发 PageLoaded
被发送,而不管 ContentPage
,因为它适用于所有这些。
我想知道是否有可能获得调用 ExportRenderer
的类型,因为我可以执行类似 MessagingCenter.Send(new object(),$"{typeof(MainPage)}Loaded");
的操作,然后我只会订阅 ContentPage
我想要这个。
[assembly: ExportRenderer(typeof(ContentPage),typeof(AdvancedPageRenderer))]
namespace Myruncompanion.Droid.Renderer
{
public class AdvancedPageRenderer : PageRenderer
{
public AdvancedPageRenderer(Context context) : base(context)
{
Autopackage = false;
}
protected override void OnAttachedToWindow()
{
base.OnAttachedToWindow();
MessagingCenter.Send(new object(),"PageLoaded");
}
}
}
public partial class MainPage : ContentPage
{
public MainPage()
{
InitializeComponent();
}
protected override void OnAppearing()
{
base.OnAppearing();
MessagingCenter.Subscribe<object>(new object(),"PageLoaded",(sender) =>
{
// Do something whenever the "PageLoaded" message is received
Console.WriteLine("Do something whenever the PageLoaded message is received");
});
}
}
解决方法
更好的方法是在自定义渲染器中进行测试,并且仅在被渲染的 ContentPage
是 MainPage
类(所需类)实例时才发送消息。这可以使用 Element
属性来实现:
protected override void OnAttachedToWindow()
{
base.OnAttachedToWindow();
if (Element is MainPage)
MessagingCenter.Send(new object(),"PageLoaded");
}
但是如果由于某些原因您想坚持您在问题中描述的内容,那么您可以使用:
MessagingCenter.Send(new object(),Element.GetType().Name + "Loaded");