c# - 在 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");
});
}
}
解决方案
更好的方法是在自定义渲染器中进行测试,并且仅当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");
推荐阅读
- javascript - 关闭 Javascript 警报后阻止关闭 Chrome 扩展弹出窗口
- python - 从字典中设置函数重复值
- python - 在 Flask 分页上刷新页面后 URL 搜索参数丢失
- argo-workflows - argo 工作流 retryStrategy 覆盖
- excel - 用于返回具有多个单元格的每一行的部分文本搜索的第一个实例的公式
- java - 如何在Java中读取外部文件
- vue.js - 使用 Vue.js 计算屏幕大小
- reactjs - 如何在反应中将openweather数据从组件渲染到子组件?
- google-sheets - 谷歌表格查询日期/时间范围
- php - 如何在带有 Laravel 8.x 的 Blade 中使用特定参数检查 Route 是否存在?