如何全局统一修改Xamarin.Forms中DatePicker、TimePicker的背景色及下划线颜色
Xamarin.Forms DatePicker/TimePicker 全局样式修改方案
方案1:XAML 全局隐式样式(无原生代码,优先推荐)
直接在App.xaml的资源字典中添加不带Key的隐式样式,会自动应用到应用内所有对应类型的控件,无需每个实例单独配置:
<Application.Resources> <ResourceDictionary> <!-- 全局DatePicker样式 --> <Style TargetType="DatePicker"> <Setter Property="BackgroundColor" Value="Transparent" /> <Setter Property="TextColor" Value="Black" /> <!-- 可按需添加其他属性,比如FontSize、Margin等 --> </Style> <!-- 全局TimePicker样式 --> <Style TargetType="TimePicker"> <Setter Property="BackgroundColor" Value="Transparent" /> <Setter Property="TextColor" Value="Black" /> </Style> </ResourceDictionary> </Application.Resources>
如果仅用这个方案没去掉下划线和选中蓝色背景,再配合下面的平台自定义渲染器处理。
方案2:全局自定义渲染器(处理原生自带的下划线、选中背景)
直接替换Xamarin.Forms官方的Picker渲染器,全局生效,无需修改业务层XAML代码。
安卓端实现
using Android.Content; using Android.Widget; using Xamarin.Forms; using Xamarin.Forms.Platform.Android; // 全局替换DatePicker渲染器 [assembly: ExportRenderer(typeof(DatePicker), typeof(GlobalDatePickerRenderer))] // 全局替换TimePicker渲染器 [assembly: ExportRenderer(typeof(TimePicker), typeof(GlobalTimePickerRenderer))] namespace YourAppNamespace.Droid.Renderers { // DatePicker全局渲染器 public class GlobalDatePickerRenderer : DatePickerRenderer { public GlobalDatePickerRenderer(Context context) : base(context) { } protected override void OnElementChanged(ElementChangedEventArgs<DatePicker> e) { base.OnElementChanged(e); if (Control != null) { // 去掉默认下划线 Control.Background = null; // 去掉选中蓝色背景块 Control.HighlightColor = Android.Graphics.Color.Transparent; // 可按需设置原生背景色 Control.SetBackgroundColor(Android.Graphics.Color.Transparent); } } } // TimePicker全局渲染器 public class GlobalTimePickerRenderer : TimePickerRenderer { public GlobalTimePickerRenderer(Context context) : base(context) { } protected override void OnElementChanged(ElementChangedEventArgs<TimePicker> e) { base.OnElementChanged(e); if (Control != null) { // 去掉默认下划线 Control.Background = null; // 去掉选中蓝色背景块 Control.HighlightColor = Android.Graphics.Color.Transparent; Control.SetBackgroundColor(Android.Graphics.Color.Transparent); } } } }
iOS端实现
using UIKit; using Xamarin.Forms; using Xamarin.Forms.Platform.iOS; // 全局替换DatePicker渲染器 [assembly: ExportRenderer(typeof(DatePicker), typeof(GlobalDatePickerRenderer))] // 全局替换TimePicker渲染器 [assembly: ExportRenderer(typeof(TimePicker), typeof(GlobalTimePickerRenderer))] namespace YourAppNamespace.iOS.Renderers { public class GlobalDatePickerRenderer : DatePickerRenderer { protected override void OnElementChanged(ElementChangedEventArgs<DatePicker> e) { base.OnElementChanged(e); if (Control != null) { // 去掉默认边框下划线 Control.BorderStyle = UITextBorderStyle.None; // 去掉选中高亮背景 Control.TintColor = UIColor.Clear; Control.BackgroundColor = UIColor.Clear; } } } public class GlobalTimePickerRenderer : TimePickerRenderer { protected override void OnElementChanged(ElementChangedEventArgs<TimePicker> e) { base.OnElementChanged(e); if (Control != null) { Control.BorderStyle = UITextBorderStyle.None; Control.TintColor = UIColor.Clear; Control.BackgroundColor = UIColor.Clear; } } } }
注意把代码中的YourAppNamespace替换为你自己项目的命名空间即可。两种方案可以配合使用,XAML层改通用属性,渲染器处理平台特有原生样式。
内容的提问来源于stack exchange,提问作者Chessmate
相关产品推荐
相关产品推荐

