android - 如何在 Xamarin Picker 中设置项目列表的样式(在 Android 中)

标签 android xamarin xamarin.android themes picker

我有一个 Xamarin Android 应用程序,它使用选择器从值列表中进行选择。我一直在更改应用程序的样式,但遇到了 Picker 问题。 虽然我可以设置 TextColor,但我无法设置占位符文本的颜色。

在搜索 SO 寻求帮助后,我实现了一个自定义渲染器,现在我在正确的文本中显示了文本和占位符。但是,以前当我触摸占位符文本时,子对话框出现并显示所有项目,允许用户选择一个。现在我实现了自定义渲染器,子对话框只显示最上面的两个项目,用户必须滚动浏览它们才能点击确定。

我有两个问题:

  1. 至少,我怎样才能让子对话框再次显示完整列表?
  2. 是否可以为项目列表对话框设置背景和文本颜色?

XAML 如下所示:

<c:CustomPicker x:Name="DivisionList" Title="{x:Static prop:Resources.PickerDivision}" 
                        SelectedIndexChanged="DivisionList_SelectedIndexChanged">
    <Picker.Behaviors>
        <b:RequiredPickerValidator x:Name="DivValidator" IsValid="{Binding Path=BindingContext.IsDivisionValid, Mode=OneWayToSource, Source={x:Reference contentPage}}" />
    </Picker.Behaviors>
</c:CustomPicker>

CustomPicker类如下:

namespace <myapp>.Portable.Controls
{
    public class CustomPicker : Picker
    {
        public Color PlaceholderColour
        {
            get { return (Color)App.Current.Resources["PlaceholderTextColour"]; }
        }

        public Color TextColour
        {
            get { return (Color)App.Current.Resources["LabelTextColour"]; }
        }

        public Color BackgroundColour
        {
            get { return (Color)App.Current.Resources["PaneBackgroundColour"]; }
        }
    }
}

客户渲染器是这样的:

[assembly: ExportRendererAttribute(typeof(CustomPicker), typeof(CustomPickerRenderer))]
namespace <myapp>.Droid.Controls.Renderers
{
    public class CustomPickerRenderer : PickerRenderer
    {
        protected override void OnElementChanged(ElementChangedEventArgs<Picker> e)
        {
            base.OnElementChanged(e);

            Control?.SetPadding(20, 20, 20, 20);
            if (e.OldElement != null || e.NewElement != null)
            {
                var customPicker = e.NewElement as CustomPicker;

                Android.Graphics.Color phCol = customPicker.PlaceholderColour.ToAndroid();
                Android.Graphics.Color textCol = customPicker.TextColour.ToAndroid();
                Android.Graphics.Color bgCol = customPicker.BackgroundColour.ToAndroid();

                Control.SetBackgroundColor(bgCol);
                Control.SetHintTextColor(phCol);
                Control.SetTextColor(textCol);
            }
        }
    }
}

非常感谢!

自定义渲染器之前的选择器弹出窗口: Picker popup before custom renderer

自定义渲染器后的选择器弹出窗口: Picker popup after custom renderer

最佳答案

似乎有 2 个选择器渲染器。

Xamarin.Forms.Platform.Android.PickerRenderer & Xamarin.Forms.Platform.Android.AppCompat.PickerRenderer

确保你使用最后一个,你的布局将和以前一样!!!

我得到答案的来源: https://forums.xamarin.com/discussion/97150/how-to-write-a-custom-renderer-for-bindable-picker-to-change-its-font-attributes-family-size

渲染器(没有实际迹象表明有 2 个): https://learn.microsoft.com/en-us/xamarin/xamarin-forms/app-fundamentals/custom-renderer/renderers

关于android - 如何在 Xamarin Picker 中设置项目列表的样式(在 Android 中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48622535/

相关文章:

android - 使用 TalkBack 时,当 TextView 的内容发生变化时提醒用户的首选方式是什么?

xamarin - Xamarin.Forms 在 VS 上有设计器支持吗?

c# - Xamarin Forms - 如何创建可以输入数量的显示警报?

java - 阻止安卓设备

android - 移动设备上的可滚动 OL3 LayerSwitcher

java - Glide : How to stop glide from loading images from cache instead load from server each time

c# - 在 Xamarin 中使用 TouchImageView

c# - 适用于 Android 的单声道 - OutOfMemoryError

c# - 如何在 xamarin 中设置 onclick 监听器?

xamarin.android - 如何从 ViewModel 显示 MvxDialogFragment?