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

如何在.NET MAUI中实现可空DatePicker控件?

.NET MAUI DatePicker 初始值自定义问题

初始需求

  • 在.NET MAUI应用中使用DatePicker控件,页面初始显示时,StartDate标签下方需无内容或显示“-”,但控件默认显示01/01/1900。
  • 已尝试通过网格叠加Label的临时方案,希望直接通过DatePicker自身实现需求。

2023年1月6日更新

参考相关方案在MAUI中使用Xamarin.Forms兼容渲染器,创建了NullableDatePicker自定义控件及双平台渲染器,但仅Android端生效。

iOS端NullableDatePicker渲染器代码

using System;
using UIKit;
using Microsoft.Maui.Controls.Handlers.Compatibility;
using Silvar.Mobile.UI.Core.Controls;
using System.ComponentModel;
using Microsoft.Maui.Controls.Compatibility;
using Microsoft.Maui.Controls.Platform;
using System.Collections.Generic;

namespace Tyler.EnerGov.Mobile.UI.Core.iOS
{
    public class NullableDatePickerRenderer : ViewRenderer<NullableDatePicker, UITextField>
    {
        protected override void OnElementChanged(ElementChangedEventArgs<NullableDatePicker> e)
        {
            base.OnElementChanged(e);
           
            if (e.NewElement != null && this.Control != null) 
            {
                this.AddClearButton();
                
                var entry = (NullableDatePicker)this.Element;
                if (!entry.NullableDate.HasValue)
                {
                    this.Control.Text = entry.PlaceHolder;
                }

                if (DeviceInfo.Idiom == DeviceIdiom.Tablet)
                {
                    this.Control.Font = UIFont.SystemFontOfSize(25);
                }
            }
        }

        protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            // 检查更新的属性是否为日期或格式属性
            if (e.PropertyName == NullableDatePicker.DateProperty.PropertyName || e.PropertyName == NullableDatePicker.FormatProperty.PropertyName)
            {
                var entry = (NullableDatePicker)this.Element;

                // 如果格式更新为占位符,直接设置文本并返回
                if (this.Element.Format == entry.PlaceHolder)
                {
                    this.Control.Text = entry.PlaceHolder;
                    return;
                }
            }
            base.OnElementPropertyChanged(sender, e);
        }

        private void AddClearButton()
        {
            var originalToolbar = this.Control.InputAccessoryView as UIToolbar;

            if (originalToolbar != null && originalToolbar.Items.Length <= 2)
            {
                var clearButton = new UIBarButtonItem("Clear", UIBarButtonItemStyle.Plain, ((sender, ev) =>
                {
                    NullableDatePicker baseDatePicker = this.Element as NullableDatePicker;
                    this.Element.Unfocus();
                    this.Element.Date = DateTime.Now;
                    baseDatePicker.CleanDate();

                }));

                var newItems = new List<UIBarButtonItem>();
                foreach (var item in originalToolbar.Items)
                {
                    newItems.Add(item);
                }

                newItems.Insert(0, clearButton);

                originalToolbar.Items = newItems.ToArray();
                originalToolbar.SetNeedsDisplay();
            }
        }
    }
}

当前遇到的问题

OnElementChanged方法被调用时,this.Control为null,已通过AddHandler注册渲染器,如何解决该问题?

Xamarin.Forms中的预期效果(MAUI中当前显示Null)

Xamarin.Forms中NullableDatePicker的正常效果


内容的提问来源于stack exchange,提问作者Divyesh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 17:40:17