我正在尝试自定义一些标签在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);
}
}
}
谢谢!
文件CustLabelRenderer
似乎没问题,只需检查一次ExportRenderer
。您的CustLabel
类应该在您的共享项目中看起来像这样
public class CustLabel : Label
{
}
现在在你的CustLabel
中使用xaml
<localPath:CustLabel
HorizontalOptions="Center" Text="Something"
VerticalOptions="CenterAndExpand" />
在你的顶级xaml标签中声明localPath
。 xmlns:local2="clr-namespace:MyApp.CustomRenderers.CustLabel"
在宣布localPath
时要小心。
现在它应该工作。
首先,我运行截图的结果。
我把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
太短。 Paint由BackgroundColor覆盖,这里是运行截图。
这是我的演示,你可以参考它。希望它可以帮到你。