Xamarin.forms 如何自定义按钮,使其具有渐变色背景?

Xamarin.forms 如何自定义按钮,使其具有渐变色背景?,xamarin.forms,Xamarin.forms,关于如何创建具有渐变色背景的布局,但当我尝试实现它时,它告诉我Android渲染器已经过时,我应该使用Xamarin.Forms.Platform.Android.fastrenders中的渲染器 如果我把代码改成 public class GradientStackLayout : StackLayout { // ... } 而不是 public class GradientStackLayout : VisualElementRenderer<StackLayout>

关于如何创建具有渐变色背景的布局,但当我尝试实现它时,它告诉我Android渲染器已经过时,我应该使用
Xamarin.Forms.Platform.Android.fastrenders中的渲染器

如果我把代码改成

public class GradientStackLayout : StackLayout 
{
    // ...
}
而不是

public class GradientStackLayout : VisualElementRenderer<StackLayout>
{
    // ...
}
公共类GradientStackLayout:VisualElementRenderer
{
// ...
}
编译器会抱怨没有
DispatchDraw
OnElementChanged
方法


我应该使用过时的渲染器吗?有没有新的方法来实现自定义渲染器?

您只需在Xamarin android的类
GradientColorStackRenderer
中添加一个构造函数

public GradientColorStackRenderer(Context context):base(context)
    {
    }
因此,整个代码如下所示:

[assembly: ExportRenderer(typeof(GradientColorStack), typeof(GradientColorStackRenderer))]
namespace GradientBackgroundApp.Droid
{
 public class GradientColorStackRenderer: VisualElementRenderer<StackLayout>
{

    private Color StartColor { get; set; }
    private Color EndColor { get; set; }

    // add the construct here
    public GradientColorStackRenderer(Context context):base(context)
    {
    }

    protected override void DispatchDraw(global::Android.Graphics.Canvas canvas)
    {
        #region for Vertical Gradient
        //var gradient = new Android.Graphics.LinearGradient(0, 0, 0, Height,
        #endregion

        #region for Horizontal Gradient
        var gradient = new Android.Graphics.LinearGradient(0, 0, Width, 0,
        #endregion

               this.StartColor.ToAndroid(),
               this.EndColor.ToAndroid(),
               Android.Graphics.Shader.TileMode.Mirror);

        var paint = new Android.Graphics.Paint()
        {
            Dither = true,
        };
        paint.SetShader(gradient);
        canvas.DrawPaint(paint);
        base.DispatchDraw(canvas);
    }

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

        if (e.OldElement != null || Element == null)
        {
            return;
        }
        try
        {
            var stack = e.NewElement as GradientColorStack;
            this.StartColor = stack.StartColor;
            this.EndColor = stack.EndColor;
        }
        catch (Exception ex)
        {
            System.Diagnostics.Debug.WriteLine(@"ERROR:", ex.Message);
        }
    }
  }
 }
[程序集:ExportRenderer(typeof(GradientColorStack)、typeof(GradientColorStackRenderer))]
命名空间GradientBackgroundApp.Droid
{
公共类GradientColorStackRenderer:VisualElementRenderer
{
专用颜色StartColor{get;set;}
专用颜色EndColor{get;set;}
//在这里添加构造
公共GradientColorStackRenderer(上下文):基础(上下文)
{
}
受保护的覆盖void DispatchDraw(全局::Android.Graphics.Canvas画布)
{
#垂直梯度区域
//var gradient=new Android.Graphics.LinearGradient(0,0,0,Height,
#端区
#水平梯度区域
var gradient=new Android.Graphics.LinearGradient(0,0,Width,0,
#端区
this.StartColor.ToAndroid(),
this.EndColor.ToAndroid(),
Android.Graphics.Shader.TileMode.Mirror);
var paint=new Android.Graphics.paint()
{
抖动=正确,
};
油漆.固色剂(梯度);
帆布.拉丝漆(油漆);
base.DispatchDraw(画布);
}
受保护的覆盖无效OnElementChanged(ElementChangedEventArgs e)
{
基础。一个要素发生变化(e);
if(e.OldElement!=null | | Element==null)
{
返回;
}
尝试
{
var stack=e.NewElement作为GradientColorStack;
this.StartColor=stack.StartColor;
this.EndColor=stack.EndColor;
}
捕获(例外情况除外)
{
System.Diagnostics.Debug.WriteLine(@“错误:”,例如消息);
}
}
}
}

是的,它起作用了。你是怎么发现的?如果我再次有问题,我该怎么办?当我们遇到问题时,通常会先分析日志,如果找不到原因,我们可以尝试在谷歌上搜索日志。对于一般问题,会有一些解决方案。:)好的。谢谢。顺便问一下。在哪里可以看到xamarin中元素的代码,如标签、图像。我在github中看不到它。你是说这个链接吗?