Xamarin - настраиваемая тень средства визуализации кадров не меняется - PullRequest
0 голосов
/ 04 августа 2020

Я пытаюсь настроить эффект тени элементов ListView как для iOS, так и для Android, но все, что я пробую, не оказывает никакого эффекта.

Вот мой шаблон DataTemplate, используемый в ListView:

<DataTemplate x:Key="greenProductTemplate">
                <ViewCell>
                    <customcontrols:CustomFrame
                        Margin="10"
                        Padding="10"
                        CornerRadius="6">

А это мой Custom Renderer:

[assembly: ExportRenderer(typeof(Frame), typeof(CustomFrameRenderer))]
namespace Prods.iOS
{
    class CustomFrameRenderer: FrameRenderer
    {
        protected override void OnElementChanged(ElementChangedEventArgs<Frame> e)
        {
            base.OnElementChanged(e);
            if (Element != null)
            {
                if (Element.HasShadow)
                {
                    this.Layer.ShadowRadius = 2.0f;
                    this.Layer.ShadowColor = UIColor.Gray.CGColor;
                    this.Layer.ShadowOffset = new CGSize(2, 2);
                    this.Layer.ShadowOpacity = 0.20f;
                    this.Layer.ShadowPath = UIBezierPath.FromRect(Layer.Bounds).CGPath;
                    this.Layer.MasksToBounds = false;
                }
            }
        }
    }
}

Я меняю рендеринг разными способами, все, что смог найти в сети, но ничто не меняет исходную тень.

1 Ответ

3 голосов
/ 04 августа 2020

Попробуйте обновить версию XF до последней и измените свою тень с помощью метода Draw.

ios:

[assembly: ExportRenderer(typeof(Frame), typeof(CustomFrameRenderer))]
namespace Prods.iOS   
{
  class CustomFrameRenderer : FrameRenderer
  {
 
    public override void Draw(CGRect rect)
    {
        base.Draw(rect);
        base.LayoutSubviews();
        this.Layer.ShadowRadius = 2.0f;
        this.Layer.ShadowColor = UIColor.Red.CGColor;
        this.Layer.ShadowOffset = new CGSize(2, 2);
        this.Layer.ShadowOpacity = 1.0f;
        this.Layer.ShadowPath = UIBezierPath.FromRect(Layer.Bounds).CGPath;
        this.Layer.MasksToBounds = false;
    }
  }
}

эффект, например :

введите описание изображения здесь

Обновление :

Android:

[assembly: ExportRenderer(typeof(Frame), typeof(CustomFrameRenderer))]
namespace Prods.Droid
{
  public class CustomFrameRenderer : Xamarin.Forms.Platform.Android.AppCompat.FrameRenderer
  {
     public CustomFrameRenderer(Context context) : base(context)
     {
     }

     protected override void OnElementChanged(ElementChangedEventArgs<Frame> e)
     {
        base.OnElementChanged(e);

        if (e.NewElement.HasShadow)
        {
            SetOutlineSpotShadowColor(Android.Graphics.Color.Red);
            Elevation = 10.0f;
            TranslationZ = 10.0f;
           
        }
    }
  }
}
...