You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 08:09:03