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

时间:2016-02-02 19:28:39

标签: c# windows-phone-8 xamarin xamarin.forms

我正在使用Xamarin Forms选择器控件并需要设置文本颜色,但是没有这样的属性。我已经尝试制作一个自定义渲染器,它在android和ios中为我设计(我最终重绘了控件)。在wp8.1平台中没有Draw事件,并且渲染器中的控件本身似乎没有设置文本颜色的属性。我还试图将选择器绑定的控件更改为失败。

目前我已经在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 个答案:

答案 0 :(得分:7)

您提及的TextColor中没有Picker属性。

即使是这种情况,我们仍然可以更改Picker的{​​{1}}文字颜色。

我假设你继承了WindowsPhone,因为你的代码示例中缺少了它,我添加了一些额外的东西,所以这对其他人更有帮助: -

PickerRenderer中定义界面: -

PCL

扩展public interface ICustomPicker2 { Xamarin.Forms.Color MyBackgroundColor { get; set; } Xamarin.Forms.Color MyTextColor { get; set; } } 中的Xamarin.Forms Picker: -

PCL

在类库中创建您的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);
        }
    }