Рендерер пользовательских меток в формах Xamarin: OnDraw никогда не запускался - PullRequest
0 голосов
/ 11 марта 2019

Я пытаюсь настроить отображение некоторых ярлыков в проекте 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);
        }

    }
}

Спасибо!

Ответы [ 2 ]

0 голосов
/ 12 марта 2019

Прежде всего, это результат моего текущего скриншота.

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 на Aqua, paint.StrokeWidth слишком мал, а DrawLine слишком короток,Краска была покрыта BackgroundColor, здесь работает скриншот.enter image description here

Вот мое демо, вы можете обратиться к нему.Надеюсь, это поможет вам.

https://github.com/851265601/CustomizeLabel

0 голосов
/ 11 марта 2019

Файл CustLabelRenderer кажется нормальным, просто проверьте один раз ExportRenderer. Ваш CustLabel класс должен выглядеть следующим образом в вашем общем проекте

 public  class CustLabel : Label
 {
 }

Теперь используйте CustLabel в вашем xaml, как это

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

Объявите localPath как это в вашем верхнем теге xaml. xmlns:local2="clr-namespace:MyApp.CustomRenderers.CustLabel"

Будьте осторожны при объявлении localPath.

Теперь это должно работать.

...