在Xamarin Forms中更改Windows Phone 8.1 Picker控件的默认文本颜色

6

我正在使用Xamarin Forms选择器控件,并需要设置文本颜色,但是没有这样的属性。我尝试制作了一个自定义渲染器,在Android和iOS上都可以正常工作(最终我重新绘制了控件)。在wp8.1平台上,没有绘制事件,而且渲染器中的控件本身似乎没有设置文本颜色的属性。我还尝试过不成功地更改选择器绑定到的控件。

目前,我已经在PCL中创建了可绑定属性TextColor,它有效地工作。我的渲染器代码如下所示(我已剥离了所有测试代码,并仅放置基本代码,因为我尚未找到任何有用的东西,并且只是为了让每个人保持上下文,请注意属性Picker.TextColorProperty不存在,这就是我想要做的...

using Namespace.CustomControls;
using Namespace.WinPhone.Renderers;
using Xamarin.Forms;
using Xamarin.Forms.Platform.WinPhone;

[assembly: ExportRendererAttribute(typeof(BindablePicker), typeof(BindablePickerRenderer))]
namespace Namspace.WinPhone.Renderers
{
    public class BindablePickerRenderer : PickerRenderer
    {
        protected override void OnElementChanged(ElementChangedEventArgs<Picker> e)
        {
            base.OnElementChanged(e);

            var picker = e.NewElement;
            BindablePicker bp = (BindablePicker)this.Element;

            if (this.Control != null)
            {
                var pickerStyle = new Style(typeof(Picker))
                {
                    Setters = {
                        new Setter {Property = Picker.BackgroundColorProperty, Value = bp.BackgroundColor},
                        new Setter {Property = Picker.TextColorProperty, Value = bp.TextColor}
                    }
                };

                picker.Style = pickerStyle;
            }
        }
    }
}

无论如何,我想知道是否有人对如何做到这一点有更多的了解,并能为我解惑。

1个回答

7

像你所提到的,Picker 中没有可用的 TextColor 属性。

尽管如此,我们仍然可以实现在 WindowsPhone 上改变 Picker 文本颜色。

我假设你从 PickerRenderer 继承,因为它在你的代码示例中缺失,我添加了一些额外的内容以便帮助其他人:

PCL 中定义接口:

public interface ICustomPicker2
{
    Xamarin.Forms.Color MyBackgroundColor { get; set; }
    Xamarin.Forms.Color MyTextColor { get; set; }
}

在PCL中扩展Xamarin.FormsPicker

public class CustomPicker2
    : Xamarin.Forms.Picker
    , ICustomPicker2
{

    public static readonly BindableProperty MyBackgroundColorProperty = BindableProperty.Create<CustomPicker2, Xamarin.Forms.Color>(p => p.MyBackgroundColor, default(Xamarin.Forms.Color));

    public static readonly BindableProperty MyTextColorProperty = BindableProperty.Create<CustomPicker2, Xamarin.Forms.Color>(p => p.MyTextColor, default(Xamarin.Forms.Color));

    public Xamarin.Forms.Color MyTextColor
    {
        get { return (Xamarin.Forms.Color)GetValue(MyTextColorProperty); }
        set { SetValue(MyTextColorProperty, value); }
    }

    public Xamarin.Forms.Color MyBackgroundColor
    {
        get { return (Xamarin.Forms.Color)GetValue(MyBackgroundColorProperty); }
        set { SetValue(MyBackgroundColorProperty, value); }
    }
}

在一个类库中创建你的WindowsPhone渲染器,如下所示:

public class CustomPicker2Renderer
    : PickerRenderer
{

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

        var picker = e.NewElement;
        CustomPicker2 bp = (CustomPicker2)this.Element;

        if (this.Control != null)
        {
            var pickerStyle = new Style(typeof(Picker))
            {
                Setters = {
                     new Setter {Property = Picker.BackgroundColorProperty, Value = bp.MyBackgroundColor},
                }
            };

            SetPickerTextColor(bp.MyTextColor); 

            picker.Style = pickerStyle;
        }       
     }

    private void SetPickerTextColor(Xamarin.Forms.Color pobjColor)
    {
        byte bytR = (byte)(pobjColor.R * 255);
        byte bytG = (byte)(pobjColor.G * 255);
        byte bytB = (byte)(pobjColor.B * 255);
        byte bytA = (byte)(pobjColor.A * 255);
        //
        ((System.Windows.Controls.Control)(((System.Windows.Controls.Panel)this.Control).Children[0])).Foreground = new SolidColorBrush(System.Windows.Media.Color.FromArgb(bytA, bytR, bytG, bytB));
    }

注意,如果您只想设置文本颜色一次,则以上内容已经足够。

但是,如果您希望在初始设置后更改颜色,则需要监听属性更改并根据以下示例进行操作:

    protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        base.OnElementPropertyChanged(sender, e);
        //
        if (e.PropertyName == "MyTextColor")
        {
            SetPickerTextColor((this.Element as CustomPicker2).MyTextColor);
        }
    }

您还需要从类库中导出渲染器:-
[assembly: ExportRendererAttribute(typeof(CustomPicker2), typeof(CustomPicker2Renderer))]

谢谢,那个完美地解决了!我修复了代码,并添加了PickerRenderer继承的类声明(似乎是我不小心覆盖了它),以防其他人遇到这个问题。 - Orlando
这很棒(+1),但有一件事 - 为什么要使用样式来覆盖背景颜色?这意味着您也会覆盖可能存在于Xamarin元素上的任何其他样式。相反,您应该只设置单个背景颜色属性。 - jbyrd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接