【问题标题】:Xamarin - Custom Frame Renderer shadow not changingXamarin - 自定义帧渲染器阴影不改变
【发布时间】:2020-11-24 03:07:20
【问题描述】:

我正在尝试为 iOS 和 Android 自定义 ListView 元素的阴影效果,但我尝试的一切都没有效果。

这是我在 ListView 中使用的 DataTemplate:

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

这是我的自定义渲染器:

[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;
                }
            }
        }
    }
}

我以多种方式更改渲染,我可以在网上找到所有内容,但没有任何东西改变初始阴影。

【问题讨论】:

  • 可以吗?
  • 我最终使用了第三方库,因为似乎没有任何效果。 redcorners.com/forms

标签: listview xamarin xamarin.forms custom-renderer


【解决方案1】:

尝试将您的 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;
    }
  }
}

效果如下:

更新

安卓

[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;
           
        }
    }
  }
}

【讨论】:

  • 能否请您也为 android 添加渲染?我发现 Droid shadow 总是很难做到。
  • @VisualSharp Android shadow 类似于上面的更新。
猜你喜欢
  • 2019-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-06
  • 1970-01-01
  • 2021-10-05
  • 1970-01-01
  • 2020-03-16
相关资源
最近更新 更多