首页 > 解决方案 > 在 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在我想要的地方订阅 's。

[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");
        });
    }
}

标签: c#xamarinxamarin.formscustom-renderer

解决方案


更好的方法是在自定义渲染器中进行测试,并且仅当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");

推荐阅读