问题描述
我正在尝试通过我的方法更改Gradient的背景颜色,但是它不起作用。应用启动时会出现背景色,但问题是我之后无法更改它。
我的自定义GradientColorStackRenderer:
[assembly: ExportRenderer(typeof(GradientColorStack),typeof(GradientColorStackRenderer))]
namespace GradientColor.Droid
{
public class GradientColorStackRenderer : VisualElementRenderer<StackLayout>
{
public Color StartColor { get; set; }
public Color EndColor { get; set; }
protected override void DispatchDraw(global::Android.Graphics.Canvas canvas)
{
#region for Vertical Gradient
var gradient = new Android.Graphics.LinearGradient(0,Height,#endregion
#region for Horizontal Gradient
// var gradient = new Android.Graphics.LinearGradient(0,Width,#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);
}
}
protected override void OnElementPropertyChanged(object sender,PropertyChangedEventArgs e)
{
base.OnElementPropertyChanged(sender,e);
if (e.PropertyName == "StartColor" || e.PropertyName == "EndColor")
{
var stack = sender as GradientColorStack;
this.StartColor = stack.StartColor;
this.EndColor = stack.EndColor;
}
}
}
}
我的方法
private void Button_Clicked(object sender,EventArgs e)
{
lytBack.StartColor = Color.Red;
lytBack.EndColor = Color.Blue;
lytBack.Opacity = 1;
}
我的XAML
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="Randomage.MainPage"
xmlns:local="clr-namespace:GradientColor; assembly:GradientColor"
>
<local:GradientColorStack x:Name="lytBack" StartColor="#ffc3a0" EndColor="#ffafbd" Spacing="0" VerticalOptions="FillAndExpand" HorizontalOptions="FillAndExpand">
</local:GradientColorStack>
</ContentPage>
应用程序启动时会出现背景色,但问题是我之后无法更改它。应用启动时会出现背景色,但问题是我之后无法更改它。
解决方法
您检测到 Android Renderer 中的属性更改,但是您并没有发布重新绘制以便可以使用。
更改:-
protected override void OnElementPropertyChanged(object sender,PropertyChangedEventArgs e)
{
base.OnElementPropertyChanged(sender,e);
if (e.PropertyName == "StartColor" || e.PropertyName == "EndColor")
{
var stack = sender as GradientColorStack;
this.StartColor = stack.StartColor;
this.EndColor = stack.EndColor;
}
}
至:-
protected override void OnElementPropertyChanged(object sender,e);
if (e.PropertyName == "StartColor" || e.PropertyName == "EndColor")
{
var stack = sender as GradientColorStack;
this.StartColor = stack.StartColor;
this.EndColor = stack.EndColor;
}
}
this.Invalidate()强制进行重新绘制。