Xamarin表单中的自定义标签渲染器:OnDraw从未触发过

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

我正在尝试自定义一些标签在Xamarin Forms项目中的呈现方式。更具体地说,我正在尝试在控件上进行自定义绘图。

为此,我创建了一个自定义渲染器,我覆盖了OnDraw方法。

我可以在xaml代码中使用我的标签,它显示在自定义rendrer内的OnElementChanged中执行代码。

不幸的是,我的OnDraw函数从未被调用过。

我在Google(和StackOverflow)上发现了很多关于这种情况的引用,但我仍然无法解决问题。

这是我的共享项目代码:

public class CustLabel : Label
{

    public CustLabel()
    {
        // THIS IS WORKING: LABEL HAS RED TEXT
        TextColor = Color.Red;
    }

}

这是自定义渲染器代码:

using Android.Content;
using Android.Graphics;
using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;

[assembly: ExportRenderer(typeof(MyApp.CustomRenderers.CustLabel), typeof(MyApp.Droid.CustomRenderers.CustLabelRenderer))]
namespace MyApp.Droid.CustomRenderers
{
    public class CustLabelRenderer : LabelRenderer
    {

        public CustLabelRenderer(Context context) : base(context)
        {
            this.SetWillNotDraw(false);
        }


        // I DON'T ACTUALLY NEED OnElementChanged, I USE IT JUST TO SEE IF LABEL GETS CUSTOMIZED IN SOME WAY
        protected override void OnElementChanged(ElementChangedEventArgs<Label> e)
        {
            base.OnElementChanged(e);

            if (Control != null)
            {
                // THIS IS WORKING: LABEL HAS AQUA BACKGROUND
                Control.SetBackgroundColor(Android.Graphics.Color.Aqua);
            }
        }


        // THIS IS NEVER EXECUTED
        protected override void OnDraw(Canvas canvas)
        { // <-- BREAKPOINT HERE, NEVER REACHED
            base.OnDraw(canvas);

            var paint = new Paint();
            paint.Color = Android.Graphics.Color.Blue;
            paint.StrokeWidth = 2;

            canvas.DrawLine(0, 0, 10, 10, paint);
        }

    }
}

谢谢!

xamarin.forms xamarin.android ondraw custom-renderer
2个回答
0
投票

文件CustLabelRenderer似乎没问题,只需检查一次ExportRenderer。您的CustLabel类应该在您的共享项目中看起来像这样

 public  class CustLabel : Label
 {
 }

现在在你的CustLabel中使用xaml

<localPath:CustLabel  
   HorizontalOptions="Center" Text="Something"
   VerticalOptions="CenterAndExpand" />

在你的顶级xaml标签中声明localPathxmlns:local2="clr-namespace:MyApp.CustomRenderers.CustLabel"

在宣布localPath时要小心。

现在它应该工作。


0
投票

首先,我运行截图的结果。

enter image description here

我把StrokeWidth从2改为20,canvas.DrawLine(0, 0, 100, 100, paint);

protected override void OnDraw(Canvas canvas)
    { // <-- BREAKPOINT HERE, NEVER REACHED
        base.OnDraw(canvas);

        var paint = new Paint();
        paint.Color = Android.Graphics.Color.Blue;
        paint.StrokeWidth = 20;

        canvas.DrawLine(0, 0, 100, 100, paint);
    }

并改变了CustLabel

   public class CustLabel : Label
{


}

你的CusLabel将BackgroundColor设置为Aquapaint.StrokeWidth太小而DrawLine太短。 Paint由BackgroundColor覆盖,这里是运行截图。 enter image description here

这是我的演示,你可以参考它。希望它可以帮到你。

https://github.com/851265601/CustomizeLabel

© www.soinside.com 2019 - 2024. All rights reserved.