在 ExportRenderer 中获取调用 PageRenderer 的 ContentPage 的类型

问题描述

我一直在关注这个答案,以便知道我的 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");
        });
    }
}

解决方法

更好的方法是在自定义渲染器中进行测试,并且仅在被渲染的 ContentPageMainPage 类(所需类)实例时才发送消息。这可以使用 Element 属性来实现:

protected override void OnAttachedToWindow()
{
    base.OnAttachedToWindow();
    if (Element is MainPage)
        MessagingCenter.Send(new object(),"PageLoaded");
}

但是如果由于某些原因您想坚持您在问题中描述的内容,那么您可以使用:

MessagingCenter.Send(new object(),Element.GetType().Name + "Loaded");

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...