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