如何在Xamarin.Forms中修改DatePicker的确认与取消按钮文本
Xamarin.Forms DatePicker弹窗按钮多语言替换方案

安卓端实现(基于你现有自定义渲染器修改)
你现有的渲染器仅处理了输入框的外观样式,没有覆盖弹窗按钮的文本逻辑,只需在CustomImageDatePickerRenderer类中新增重写CreateDatePickerDialog方法即可完成替换:
[assembly: ExportRenderer(typeof(CustomImageDatePicker), typeof(CustomImageDatePickerRenderer))] namespace AMS.Droid.Renderers { public class CustomImageDatePickerRenderer : DatePickerRenderer { public CustomImageDatePickerRenderer(Context context) : base(context) { } protected override void OnElementChanged(ElementChangedEventArgs<DatePicker> e) { try { base.OnElementChanged(e); CustomImageDatePicker element = (CustomImageDatePicker)this.Element; if (Control == null) return; Control.Background = null; if (Control != null && this.Element != null && !string.IsNullOrEmpty(element.Image)) { Control.Background = AddPickerStyles(element.Image); } } catch (Exception ex) { var message = ex.Message; } } // 新增以下代码修改弹窗按钮文本 protected override DatePickerDialog CreateDatePickerDialog(int year, int month, int day) { var dialog = base.CreateDatePickerDialog(year, month, day); dialog.ShowEvent += (sender, args) => { // 替换确认按钮文本,AppResources.OkText为你资源文件中对应的多语言键 dialog.GetButton((int)DialogButtonType.Positive).Text = AppResources.OkText; // 替换取消按钮文本,AppResources.CancelText为你资源文件中对应的多语言键 dialog.GetButton((int)DialogButtonType.Negative).Text = AppResources.CancelText; }; return dialog; } public LayerDrawable AddPickerStyles(string imagePath) { GradientDrawable gd = new GradientDrawable(); gd.SetColor(Android.Graphics.Color.Transparent); gd.SetCornerRadius(25); gd.SetStroke(3, Android.Graphics.Color.Black); this.Control.SetBackgroundColor(Android.Graphics.Color.Transparent); this.Control.SetPadding(20, 10, -50, 10); Drawable[] layers = { gd, GetDrawable(imagePath) }; LayerDrawable layerDrawable = new LayerDrawable(layers); layerDrawable.SetLayerInset(1, 0, 0, 30, 0); return layerDrawable; } private BitmapDrawable GetDrawable(string imagePath) { try { int resID = Resources.GetIdentifier(imagePath.ToLower(), "drawable", this.Context.PackageName); var drawable = ContextCompat.GetDrawable(this.Context, Resource.Drawable.brandIcon); drawable.SetBounds(0, 0, (int)(drawable.IntrinsicWidth * 0.5), (int)(drawable.IntrinsicHeight * 0.5)); var bitmap = ((BitmapDrawable)drawable).Bitmap; var result = new BitmapDrawable(Resources, Bitmap.CreateScaledBitmap(bitmap, 60, 60, true)); result.Gravity = Android.Views.GravityFlags.Right; return result; } catch(Exception ex) { var message = ex.Message; } return null; } } }
iOS端兼容实现(若需要支持iOS系统)
如果你的应用同时兼容iOS,需要新增iOS平台的自定义渲染器,修改对应弹窗按钮文本:
[assembly: ExportRenderer(typeof(CustomImageDatePicker), typeof(CustomImageDatePickerRenderer))] namespace AMS.iOS.Renderers { public class CustomImageDatePickerRenderer : DatePickerRenderer { protected override void OnElementChanged(ElementChangedEventArgs<DatePicker> e) { base.OnElementChanged(e); if (Control == null) return; Control.EditingDidBegin += (sender, args) => { if (Control.InputAccessoryView is UIToolbar toolbar) { foreach (var item in toolbar.Items) { if (item.Style == UIBarButtonItemStyle.Done) item.Title = AppResources.OkText; if (item.Style == UIBarButtonItemStyle.Plain && item.Title == "Cancel") item.Title = AppResources.CancelText; } } }; } } }
注意事项
- 代码中的
AppResources为你Xamarin.Forms项目中定义的多语言资源类,需替换为你实际的资源类名和对应的资源键 - 安卓端需要引入
Android.App命名空间才能使用DialogButtonType枚举 - iOS端需要引入
UIKit命名空间
内容的提问来源于stack exchange,提问作者Devanathan
相关产品推荐
相关产品推荐

