【问题标题】:Changing the default text color of a Picker control in Xamarin Forms for Windows Phone 8.1在 Xamarin Forms for Windows Phone 8.1 中更改 Picker 控件的默认文本颜色
【发布时间】:2016-02-02 19:28:39
【问题描述】:

我正在使用 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;
            }
        }
    }
}

无论如何,我想知道是否有人可能对如何做到这一点有更多的了解,并且可以对我有所启发。

【问题讨论】:

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


    【解决方案1】:

    您提到的Picker 中没有可用的TextColor 属性。

    即使是这样,我们仍然可以实现将Picker 的文本颜色更改为WindowsPhone

    我假设您是从 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 继承的类声明(似乎我不小心覆盖了它),以防有人偶然发现这个问题。
    • 这很棒 (+1),但有一件事 - 为什么要使用样式来覆盖背景颜色?这意味着您还将覆盖 Xamarin 元素上可能存在的任何其他样式。相反,您应该只设置单独的背景颜色属性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多