渐变堆栈OnElementPropertyChanged在Xamarin表单中不起作用

问题描述

我正在尝试通过我的方法更改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()强制进行重新绘制。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...