【问题标题】:How to change Picker bottom line color in xamarin forms如何在 xamarin 表单中更改 Picker 底线颜色
【发布时间】:2018-02-22 06:35:00
【问题描述】:

我需要更改picker的底线颜色,并更改picker中显示的项目列表的背景颜色。我可以设置picker的背景颜色。但是picker中项目的背景颜色默认为白色。是有任何自定义渲染器或任何其他解决方案吗?我在选择器中添加项目如下。

血型列表显示为白色。我需要更改该颜色。如何设置项目列表背景颜色?

public List<string> _bloodGroups = new List<string>() { "A+ve", "A-ve", "B+ve", "B-Ve", "O+ve", "O-ve", "AB+ve", "AB_ve" };

public void GetDistrictAsync()
{            
    foreach (string districts in _districts)
    {
        Picker_District.Items.Add(districts);
    }
}

在 XAML 页面中,代码如下

<StackLayout Orientation="Horizontal" 
    HorizontalOptions="FillAndExpand" 
    VerticalOptions="FillAndExpand" 
    HeightRequest="10"
    Margin="20,10,20,0"  
    BackgroundColor="#91BC47">
    <Picker 
        x:Name="Picker_BloodGroup" 
        HorizontalOptions="FillAndExpand"  
        TextColor="White" 
        BackgroundColor="#91BC47">
        <Picker.Items>
            <x:String>Select Blood Group</x:String>                           
        </Picker.Items>
    </Picker>
</StackLayout>

【问题讨论】:

  • 很遗憾,默认选择器上没有暴露itemtemplate,充其量可以绑定文本颜色。
  • @SpookKruger 是否有任何自定义渲染器来更改项目列表背景颜色
  • 据我所知,没有什么可以下载,但我相信您可以创建自己的 =)
  • @SpookKruger 有什么办法可以去除选取器底线的颜色吗?默认为黑色。

标签: c# xaml xamarin


【解决方案1】:

嗨 @jasminemathew 在 xamarin ios 部分添加这个自定义渲染器 记得在命名空间之前添加这一行 [程序集:ExportRenderer(typeof(Picker), typeof(CustomPickerRenderer))]

 public class CustomPickerRenderer : PickerRenderer
{
    private CALayer _borderLayer;
    protected override void OnElementChanged(ElementChangedEventArgs<Picker> e)
    {
        base.OnElementChanged(e);

        if (Control == null)
            return;

        Control.BorderStyle = UITextBorderStyle.None;

        var element = Element as Picker;
        if (element == null)
            return;

        //DrawBorder(element.BorderColor.ToCGColor());
        DrawBorder(UIColor.FromRGB(156, 156, 156));

        e.NewElement.Unfocused += (sender, evt) =>
        {
            DrawBorder(UIColor.FromRGB(156, 156, 156)); // unfocused, set color

        };
        e.NewElement.Focused += (sender, evt) =>
        {
            DrawBorder(UIColor.FromRGB(245, 0, 47)); ; // focused, set color
        };
    }
    protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        base.OnElementPropertyChanged(sender, e);

        var element = Element as Picker;
        if (element == null)
            return;

        DrawBorder(UIColor.FromRGB(156, 156, 156));
    }
    public override CGRect Frame
    {
        get { return base.Frame; }
        set
        {
            base.Frame = value;

            var element = Element as Picker;
            if (element == null)
                return;

            // DrawBorder(element.BorderColor.ToCGColor());
            DrawBorder(UIColor.FromRGB(156, 156, 156));
        }
    }
    private void DrawBorder(UIColor borderColor)
    {
        if (Frame.Height <= 0 || Frame.Width <= 0)
            return;

        if (_borderLayer == null)
        {
            _borderLayer = new CALayer
            {
                MasksToBounds = true,
                Frame = new CGRect(0f, Frame.Height - 1, Frame.Width, 1f),
                BorderColor = borderColor.CGColor,
                BorderWidth = 1.0f
            };

            Control.Layer.AddSublayer(_borderLayer);
            Control.BorderStyle = UITextBorderStyle.None;
        }
        else
        {
            _borderLayer.BorderColor = borderColor.CGColor;
            _borderLayer.Frame = new CGRect(0f, Frame.Height - 1, Frame.Width, 1f);
        }
    }
}.   

【讨论】:

    【解决方案2】:
    protected override void OnElementChanged(ElementChangedEventArgs<Picker> e)
    {
        base.OnElementChanged(e);
    
        if (Control != null && Element != null)
        {
            Control.Background = new SolidColorBrush(Colors.Transparent);
    
            Control.PlaceholderText = "Select";
            Control.BorderBrush = new SolidColorBrush(Colors.Transparent);
            Control.VerticalContentAlignment = VerticalAlignment.Center;
            Control.HorizontalContentAlignment = HorizontalAlignment.Left;
            Control.Foreground = new SolidColorBrush(Colors.Black);         
            var element = Element as BurndyRegPicker; 
            element.Title = string.Empty;?                
    
            element.Margin = new Xamarin.Forms.Thickness(-10, -6, -28, 4);
    
            }
        }
    }
    

    【讨论】:

    • 以上代码不工作。 SolidColorBrush() 和 burndyRegPicker 不在 xamarin.forms 中。您能告诉程序集参考吗?
    • 此代码需要在android的自定义渲染器中使用。可悲的是,答案解释得很糟糕。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-12
    • 2019-10-14
    • 2022-01-27
    • 2018-07-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多