【问题标题】:Custom Label Renderer in Xamarin Forms: OnDraw never firedXamarin 表单中的自定义标签渲染器:OnDraw 从未触发
【发布时间】:2019-08-01 18:10:32
【问题描述】:

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

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

我可以在 xaml 代码中使用我的标签,它会显示并执行自定义渲染器中 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


    【解决方案1】:

    文件CustLabelRenderer 似乎没问题,只需检查一次ExportRenderer。在您的共享项目中,您的 CustLabel 类应如下所示

     public  class CustLabel : Label
     {
     }
    

    现在像这样在你的xaml中使用CustLabel

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

    在您的顶部 xaml 标记中像这样声明 localPath。 xmlns:local2="clr-namespace:MyApp.CustomRenderers.CustLabel"

    声明localPath时要小心。

    现在应该可以了。

    【讨论】:

    • 感谢您的回答。我可以在 xaml 代码中使用标签,它会显示出来,并且在共享项目中进行的示例自定义正在运行。此外,还会调用自定义渲染器:正确应用 OnElementChanged 中的示例自定义。唯一不起作用的是 OnDraw(这也是我真正需要的唯一一个)。我更新了我的问题以更好地澄清这一点。
    【解决方案2】:

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

    我把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 设置为 Aqua,paint.StrokeWidth 太小,DrawLine 太短。油漆被 BackgroundColor 覆盖,这里是运行截图。

    这是我的演示,你可以参考。希望对你有帮助。

    https://github.com/851265601/CustomizeLabel

    【讨论】:

    • @Disti 你有更新吗?如果回复对您有帮助,请将回复标记为答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-24
    • 1970-01-01
    • 2016-04-26
    相关资源
    最近更新 更多