自定义渲染器中的xamarin表单按钮背景颜色

时间:2016-11-04 13:41:21

标签: windows-phone-8.1 xamarin.forms

我正在尝试以xamarin形式设置背景颜色。为了达到这个目的,我想我可能会使用CustomRenderer。我想从Hex值设置背景颜色。下面是我的代码,我发现很难设置背景颜色。我想在Windows 8.1和UWP中设置它。我真的很感激,如果有人可以告诉我它在Android中的表现如何。

[assembly: ExportRendererAttribute(typeof(PrimaryButton), typeof(PrimaryButtonRenderer))]

namespace ShareSpecial.Windows
{
    public class PrimaryButtonRenderer : ButtonRenderer
    {
        protected override void OnElementChanged(ElementChangedEventArgs<Button> e)
        {
            base.OnElementChanged(e);
            if (Control != null)
            {
                Control.BackgroundColor = //some color from hex string
            }
        }
    }
}

3 个答案:

答案 0 :(得分:2)

Xamarin Forms中的Color类有一个方法FromHex,您可以轻松地在每个平台中实现颜色转换的扩展方法。在Android中,已经有一个名为ToAndroid()的默认实现。

对于WP8和UWP:

定义此扩展名:

   static class ConvertExtensions
    {
        public static Windows.UI.Color ToWindowsColor(this Color color)

        {

            return Windows.UI.Color.FromArgb((byte)(color.A * 255), (byte)(color.R * 255), (byte)(color.G * 255), (byte)(color.B * 255));
        }
    }

渲染器的代码是:

Control.BackgroundColor = new SolidColorBrush(Color.FromHex("ffffffff").ToWindowsColor());

适用于Android

如果使用 SetBackgroundColor()方法更改backgroundColor,您将失去click的效果,为了保留它,请使用以下代码:

            Color backgroundColor = Color.FromHex("ffffffff");
            int num = backgroundColor.ToAndroid().ToArgb();
            int num2 = backgroundColor.MultiplyAlpha(0.5).ToAndroid().ToArgb();
            base.Control.SupportBackgroundTintList = new ColorStateList(ColorExtensions.States, new int[] {
            num,
            num2
        });

您必须扩展您的渲染器: Xamarin.Forms.Platform.Android.AppCompat.ButtonRenderer

答案 1 :(得分:0)

您应该使用SolidColorBrush来设置Windows平台元素的颜色。

Control.BackgroundColor = ToWindowsBrush(Color.Red);

以下是将Xamarin.Froms.Color转换为SolidColorBrush

的方法
    public static SolidColorBrush ToWindowsBrush(Xamarin.Forms.Color color)
    {
        if (color.A < 0)
            return new SolidColorBrush(Windows.UI.Colors.Transparent);

        var winColor = Windows.UI.Color.FromArgb((byte)(color.A * 255), 
                                                 (byte)(color.R * 255),
                                                 (byte)(color.G * 255),
                                                 (byte)(color.B * 255));
        return new SolidColorBrush(winColor);
    }

答案 2 :(得分:0)

得到了@Hichaam的帮助,并发布了有效的Android解决方案

using Xamarin.Forms.Platform.Android;
using Xamarin.Forms;
using ShareSpecial.Utils.Controls;
using ShareSpecial.Droid.Custom.Control.Buttons;
using Android.Content.Res;

[assembly: ExportRendererAttribute(typeof(SuccessButton), typeof(SuccessButtonRenderer))]
namespace ShareSpecial.Droid.Custom.Control.Buttons
{
    public class SuccessButtonRenderer : Xamarin.Forms.Platform.Android.AppCompat.ButtonRenderer
    {
        public SuccessButtonRenderer() { }

        protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.Button> changeEvent)
        {
            base.OnElementChanged(changeEvent);

            var backgroundColor = Color.FromHex("43ac6a");

            int num = backgroundColor.ToAndroid().ToArgb();

            int num2 = backgroundColor.MultiplyAlpha(0.5).ToAndroid().ToArgb();

            Control.SupportBackgroundTintList = new ColorStateList(ColorExtensions.States, new int[] { num, num2 });

            Control.SetTextColor(Color.FromHex("#ffffff").ToAndroid());
        }
    }
}