Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在Xamarin Forms for Windows Phone 8.1中更改选择器控件的默认文本颜色_C#_Windows Phone 8_Xamarin_Xamarin.forms - Fatal编程技术网

C# 在Xamarin Forms for Windows Phone 8.1中更改选择器控件的默认文本颜色

C# 在Xamarin Forms for Windows Phone 8.1中更改选择器控件的默认文本颜色,c#,windows-phone-8,xamarin,xamarin.forms,C#,Windows Phone 8,Xamarin,Xamarin.forms,我使用的是Xamarin表单选择器控件,需要设置文本颜色,但是没有这样的属性。我曾经尝试过在android和ios上制作一个自定义渲染器(我最终重新绘制了控件)。在wp8.1平台中,没有绘制事件,渲染器中的控件本身似乎没有设置文本颜色的属性。我还尝试更改选择器绑定到的控件,但未成功 目前,我已经在正在工作的PCL中创建了可绑定属性TextColor。我的渲染器的代码如下所示(我剥离了所有测试代码,只放了基本代码,因为我还没有发现任何有用的东西,我放代码只是为了让每个人都了解上下文)还要注意,属性

我使用的是Xamarin表单选择器控件,需要设置文本颜色,但是没有这样的属性。我曾经尝试过在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;
            }
        }
    }
}
使用Namespace.CustomControls;
使用Namespace.WinPhone.renders;
使用Xamarin.Forms;
使用Xamarin.Forms.Platform.WinPhone;
[程序集:ExportRenderAttribute(typeof(BindablePicker)、typeof(BindablePickerRenderer))]
命名空间Namspace.WinPhone.Renderers
{
公共类BindablePickerRenderer:PickerRenderer
{
受保护的覆盖无效OnElementChanged(ElementChangedEventArgs e)
{
基础。一个要素发生变化(e);
var-picker=e.NewElement;
BindablePicker bp=(BindablePicker)this.Element;
if(this.Control!=null)
{
var pickerStyle=新样式(typeof(Picker))
{
设定器={
新Setter{Property=Picker.backgroundcolorperty,Value=bp.BackgroundColor},
新设置器{Property=Picker.TextColorProperty,Value=bp.TextColor}
}
};
picker.Style=pickerStyle;
}
}
}
}

无论如何,我想知道是否有人对如何做这件事有更多的了解,并能给我一些启示。

选择器中没有你提到的
TextColor
属性

即使在这种情况下,我们仍然可以为
WindowsPhone
更改
Picker
文本颜色

我假设您继承的是
PickerRenderer
,因为它在您的代码示例中缺失,并且我添加了一些额外的内容,因此这对其他人更有帮助:-

PCL
中定义接口:-

public interface ICustomPicker2
{
    Xamarin.Forms.Color MyBackgroundColor { get; set; }
    Xamarin.Forms.Color MyTextColor { get; set; }
}
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); }
    }
}
扩展
PCL
中的
Xamarin.Forms
Picker
:-

public interface ICustomPicker2
{
    Xamarin.Forms.Color MyBackgroundColor { get; set; }
    Xamarin.Forms.Color MyTextColor { get; set; }
}
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); }
    }
}
注意,如果您只想将文本颜色设置一次,以上就是您所需要的

但是,如果要在初始设置颜色后更改颜色,则需要听取属性更改并按如下所示进行操作:-

    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元素上可能存在的任何其他样式。相反,您应该只设置单个背景颜色属性。