【发布时间】: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