如何将我的通用 Xamarin.Forms 渲染器转换为 MAUI 处理程序?

问题描述 投票:0回答:1

有人可以帮助我了解如何将自定义渲染器正确转换为 .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
        }

    } 
}
xamarin xamarin.forms maui
1个回答
0
投票

我发现这可以通过两种方式实现:

  1. 继续使用

    Maui.Controls.Handlers.Compatibility.ViewRenderer<XF, A>
    (不需要
    .UseMauiCompatibility()
    )并使用自定义渲染器作为处理程序
    handlers.AddHandler<XFUserControl1, MyEffectRenderer<XFUserControl1, Android.Views.View>>();

  2. 如果你的控件是基于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);
                    }   
                }
© www.soinside.com 2019 - 2024. All rights reserved.