如何在Xamarin Forms中更改Picker字体颜色和大小?

3

我是Xamarin的新手,目前正在使用Xamarin Forms PCL进行项目开发。

是否有更改Picker字体颜色和大小的方法?

  <Picker x:Name="pkr_color" Grid.Row="4" Grid.Column="1" HorizontalOptions="FillAndExpand"
    BackgroundColor="#ededed" Title="Select Color">
      <Picker.Items>
        <x:String>Red</x:String>
        <x:String>Blue</x:String>
        <x:String>Green</x:String>
      </Picker.Items>
    </Picker>

提前致谢!


1
使用自定义渲染器并在所有平台上实现。 - Rohit Vipin Mathews
你可以使用TextColorTitleColor来改变字体颜色,使用HeightRequest来改变大小。 - David Jesus
5个回答

5

使用 PCL 代码可以更改选择器的字体大小。

创建 MainPage.xaml 文件。

<Picker x:Name="PickerList" Title="Select Any One" IsVisible="False" SelectedIndexChanged="PickerList_SelectedIndexChanged">
        <Picker.Items>
            <x:String>Option 1</x:String>
            <x:String>Option 2</x:String>
            <x:String>Option 3</x:String>
        </Picker.Items>
    </Picker>
    <Label x:Name="PickerLabel" Text="Tap to Select Picker" FontSize="14" HorizontalOptions="Start">
        <Label.GestureRecognizers>
            <TapGestureRecognizer Tapped="TapGestureRecognizer_Tapped"/>
        </Label.GestureRecognizers>
    </Label>

创建 MainPage.xaml.cs 文件。
private void PickerList_SelectedIndexChanged(object sender, EventArgs e)
    {
        PickerLabel.Text = PickerList.Items[PickerList.SelectedIndex];
        // PickerLabel.Text = PickerList.SelectedItem.ToString() ;
    }

    private void TapGestureRecognizer_Tapped(object sender, EventArgs e)
    {
        PickerList.Focus();
    }

这将解决Android和IOS相关的问题。

4

您需要为每个平台编写自定义渲染器。

using System;
using Project.iOS;
using Xamarin.Forms;
using Xamarin.Forms.Platform.iOS;

[assembly: ExportRenderer (typeof (Picker), typeof (CustomPickerRenderer))]
namespace Project.iOS
{
    public class CustomPickerRenderer : PickerRenderer
    {
        protected override void OnElementChanged (ElementChangedEventArgs<Picker> e)
        {
            base.OnElementChanged (e);
            if (Control != null) {
                Control.TextColor = UIKit.UIColor.White;
            }
        }
    }
}

这里是一个iOS的示例。这将更改文本的颜色,您需要为Android做类似的事情,还需要添加字体大小的更改。


你好,我正在使用时间选择器,并将分钟间隔自定义为30分钟。现在我想要仅显示0和30两个值,就像上午和下午一样,而不是重复相同的值。这有可能吗? - Srusti Thakkar

1

如果要更改Android本机数字选择器(Xamarin表单选择器)中的字体类型、大小、下划线、文本、文本颜色、警报对话框按钮位置和按钮文本,可以使用自定义渲染来处理,如下所示:

using System;
using System.Collections.Generic;
using System.Text;
using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;
using Android.Graphics.Drawables;
using Android.Graphics;

[assembly: ExportRenderer(typeof(Picker), typeof(MyPickerRenderer))]
namespace Daddy.Droid
{
    public class MyPickerRenderer : Xamarin.Forms.Platform.Android.PickerRenderer
    {
        Typeface fontFace = null;
        private IElementController ElementController => Element as IElementController;
        private AlertDialog _dialog;
        public MyPickerRenderer(Context context) : base(context)
        {
            AutoPackage = false;
        }
        [Obsolete("This constructor is obsolete as of version 2.5. Please use PickerRenderer(Context) instead.")]
        public MyPickerRenderer()
        {
            AutoPackage = false;
        }
        protected override void OnElementChanged(ElementChangedEventArgs<Picker> e)
        {
            base.OnElementChanged(e);

            if (e.NewElement == null || e.OldElement != null || Control == null)
                return;

            fontFace = Typeface.CreateFromAsset(this.Context.Assets, "somefont.ttf");

            GradientDrawable gd = new GradientDrawable();
            gd.SetStroke(0, Android.Graphics.Color.Transparent);
            Control.SetBackground(gd);

            Control.TextSize = 14f;
            Control.SetTypeface(fontFace, TypefaceStyle.Normal);

            Control.Click += Control_Click;
        }
        protected override void Dispose(bool disposing)
        {
            Control.Click -= Control_Click;
            base.Dispose(disposing);
        }

        private void Control_Click(object sender, EventArgs e)
        {
            Picker model = Element;
            NumberPicker picker = new NumberPicker(Context);

            int count = picker.ChildCount;
            for (int i = 0; i < count; i++)
            {
                Android.Views.View v = picker.GetChildAt(i);
                if(v.GetType() == typeof(EditText))
                {
                    Java.Lang.Reflect.Field  field = picker.Class.GetDeclaredField("mSelectorWheelPaint");
                    field.Accessible = true;
                    ((Paint)field.Get(picker)).SetTypeface(fontFace);
                    ((EditText)v).SetTypeface(fontFace, TypefaceStyle.Normal);
                    picker.Invalidate();   
                }
            }

            if (model.Items != null && model.Items.Any())
            {
                picker.MaxValue = model.Items.Count - 1;
                picker.MinValue = 0;
                picker.SetDisplayedValues(model.Items.ToArray());
                picker.WrapSelectorWheel = false;
                picker.DescendantFocusability = DescendantFocusability.BlockDescendants;
                picker.Value = model.SelectedIndex;
                picker.Visibility = ViewStates.Visible;

            }


            var layout = new LinearLayout(Context) { Orientation = Orientation.Vertical };
            layout.Visibility = ViewStates.Visible;
            layout.AddView(picker);


            ElementController.SetValueFromRenderer(VisualElement.IsFocusedProperty, true);

            var builder = new AlertDialog.Builder(Context); 
            builder.SetView(layout);

            builder.SetTitle(model.Title ?? "");

            builder.SetNegativeButton("Cancel", (s, a) =>
            {
                ElementController.SetValueFromRenderer(VisualElement.IsFocusedProperty, false);
                Control?.ClearFocus();
                _dialog = null;
            });

            builder.SetPositiveButton("This One", (s, a) =>
            {
                ElementController.SetValueFromRenderer(Picker.SelectedIndexProperty, picker.Value);
                if (Element != null)
                {
                    if (model.Items.Count > 0 && Element.SelectedIndex >= 0)
                        Control.Text = model.Items[Element.SelectedIndex];
                    ElementController.SetValueFromRenderer(VisualElement.IsFocusedProperty, false);
                    Control?.ClearFocus();
                }
                _dialog = null;
            });

            _dialog = builder.Create();

            _dialog.DismissEvent += (ssender, args) =>
            {
                ElementController?.SetValueFromRenderer(VisualElement.IsFocusedProperty, false);
            };
            _dialog.Show();


            Android.Widget.Button nbutton = _dialog.GetButton((int)Android.Content.DialogButtonType.Positive);
            nbutton.SetTypeface(fontFace, TypefaceStyle.Normal);
            nbutton.SetTextColor(Android.Graphics.Color.ParseColor("#33b5e5"));
            nbutton.TextSize = 16f;
            LinearLayout layOut = (LinearLayout)nbutton.Parent;
            layOut.SetGravity(GravityFlags.CenterHorizontal);
            Android.Views.View v1 = layOut.GetChildAt(1);
            v1.Visibility = ViewStates.Gone;


            int res = Resources.GetIdentifier("alertTitle", "id", "android");
            TextView textView = (TextView)_dialog.FindViewById(res);
            textView.SetTextColor(Android.Graphics.Color.Gray);
            textView.SetTypeface(fontFace, TypefaceStyle.Normal);
            textView.Gravity = GravityFlags.Center;

        }
    }
}

欢迎来到 Stack Overflow!问题只是询问选择器的字体颜色和大小,而不是其他内容。此外,您可能需要阅读一下这个 - 仅包含代码的答案通常不是在这里回答问题的最佳方式。(如果您引用了单个属性或方法,或者给出了一个单独的方法作为示例,那就可以了。) - Claudia

1
我希望下面的代码能够帮助你获取文本颜色。
**In Xaml**

 <Picker SelectedIndexChanged="OnColorPickerSelected" TextColor="{Binding TextColor}"/>


**In Code Behind**

 private void OnColorPickerSelected(object sender, EventArgs e)
 {
   ((ViewModel)BindingContext).Color= pkr_color.Items[pkr_color.SelectedIndex];

   ChooseColorPickerTextColor(((ViewModel)BindingContext).Color, pkr_color);
 }

**Implement ChooseColorPickerTextColor Method Here**

  private void ChooseColorPickerTextColor(string selectedColor, Picker pickerName)
    {
        Picker colorPickerTextColor = pickerName;

        if (selectedColor == "Red")
        {
            colorPickerTextColor.TextColor = Color.Red;
        }
        else if (selectedColor == "Yellow")
        {
            colorPickerTextColor.TextColor = Color.Yellow;
        }
        else if (selectedColor == "Green")
        {
            colorPickerTextColor.TextColor = Color.Green;
        }
        else if (selectedColor == "Blue")
        {
            colorPickerTextColor.TextColor = Color.Blue;
        }
        else if (selectedColor == "Maroon")
        {
            colorPickerTextColor.TextColor = Color.Maroon;
        }
        else if (selectedColor == "Pink")
        {
            colorPickerTextColor.TextColor = Color.Pink;
        }
        else
        {
            colorPickerTextColor.TextColor = Color.Aqua;
        }
    }

使用“WidthRequest”可以增加选择器的大小。

-2
LabelPicker 放在同一个 Grid cell 中。不要设置 pickerTitle,而是使用 LabelText 作为 Title
<Label x:Name="PickerLabel" Text="Picker Title" TextColor="Any Color"></Label>
         <Picker x:Name="Picker" SelectedIndexChanged="Picker_SelectedIndexChanged" TextColor="Any Color" />

现在,当从Picker中选择一个Item时,使标签的Text不可见。

void Picker_SelectedIndexChanged(object sender, System.EventArgs e)
        {
            PickerLabel.IsVisible = false;
        }

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