有人可以帮助我了解如何将自定义渲染器正确转换为 .NET MAUI 处理程序吗?
在 Xamarin.Forms 中,我有一个通用渲染器,可以将其附加到任何用户控件。我重写诸如 public override
void Draw(Android.Graphics.Canvas canvas)
之类的方法,以直接在控件上绘制自定义内容。这种方法很方便,因为它不需要用附加视图包装控件 - 它简单且高效。
现在,我正在尝试将其迁移到 .NET MAUI。我尝试过使用
ElementHandler<XF, A>
和 ViewHandler<XF, A>
,但这两种方法似乎都需要创建平台视图,这增加了复杂性。
您能否提供有关如何在 .NET MAUI 中实现类似功能而不需要创建额外平台视图的指导?在 MAUI 中这种情况的最佳实践是什么?
[assembly: ExportRenderer(typeof(XFUserControl1), typeof(MyEffectRenderer<Xamarin.Forms.View, Android.Views.View>))]
[assembly: ExportRenderer(typeof(XFUserControl2), typeof(MyEffectRenderer<Xamarin.Forms.View, Android.Views.View>))]
[assembly: ExportRenderer(typeof(XFUserControl3), typeof(MyEffectRenderer<Xamarin.Forms.View, Android.Views.View>))]
[assembly: ExportRenderer(typeof(XFUserControl4), typeof(MyEffectRenderer<Xamarin.Forms.View, Android.Views.View>))]
[assembly: ExportRenderer(typeof(XFUserControl5), typeof(MyEffectRenderer<Xamarin.Forms.View, Android.Views.View>))]
namespace MyApp.Droid.CustomRenderers
{
public class MyEffectRenderer<XF, A>
: ViewRenderer<XF, A>
where XF : Xamarin.Forms.View
where A : Android.Views.View
{
public MyEffectRenderer(Context context)
: base(context)
{
}
public override void Draw(Android.Graphics.Canvas canvas)
{
base.Draw(canvas);
// do my custom magic here
}
}
}
我发现这可以通过两种方式实现:
继续使用
Maui.Controls.Handlers.Compatibility.ViewRenderer<XF, A>
(不需要.UseMauiCompatibility()
)并使用自定义渲染器作为处理程序handlers.AddHandler<XFUserControl1, MyEffectRenderer<XFUserControl1, Android.Views.View>>();
。
如果你的控件是基于ContentView的话,实现ContentViewGroup,这样更符合MAUI的做法。
ContentViewHandler.PlatformViewFactory = (viewHandler) => {
if (viewHandler.VirtualView is XFUserControl1)
return new CustomContentViewGroup(viewHandler.Context);
else
return null;
};
public class CustomContentViewGroup : ContentViewGroup
{
public CustomContentViewGroup(Context context)
: base(context)
{
}
protected override void OnDraw(Canvas canvas)
{
base.OnDraw(canvas);
}
}