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

Get the type of calling ContentPage of a PageRenderer within a ExportRenderer

我一直在关注这个答案,以便在我的 Xamarin 页面加载时告诉我。

粗略的想法是,一旦 PageRenderer 附加到 Window,它就会将 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 Class(需要 class) 实例。这可以使用 Element 属性:

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

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

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