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>

提前致谢!

4

6 回答 6

4

可以使用 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的问题。

于 2017-05-24T06:08:16.680 回答
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 做类似的事情,并且只需添加你的字体大小更改。

于 2016-10-06T20:25:06.023 回答
1

要在 Android 原生 numberpicker(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;

        }
    }
}
于 2017-12-31T08:04:06.730 回答
1

我希望下面的代码有助于获取您的 TextColor

**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”我们可以增加选取器的大小

于 2017-01-06T16:14:57.340 回答
-2

LabelandPicker放在同一个Grid cell.Don't set Titleof the pickerinstead Textof the Labelwill work as 中Title

<Label x:Name="PickerLabel" Text="Picker Title" TextColor="Any Color"></Label>
         <Picker x:Name="Picker" SelectedIndexChanged="Picker_SelectedIndexChanged" TextColor="Any Color" />

现在,当 an来自时,制作Textof Label 。InvisibleItemselectedPicker

void Picker_SelectedIndexChanged(object sender, System.EventArgs e)
        {
            PickerLabel.IsVisible = false;
        }
于 2018-04-16T10:26:53.103 回答
-5

一个选项可以是,使用Scale。例如,在 xaml 中:

<Picker Scale="0.5">
      <Picker.Items>
        <x:String>Red</x:String>
        <x:String>Blue</x:String>
        <x:String>Green</x:String>
      </Picker.Items>
</Picker>
于 2017-12-05T11:38:43.337 回答