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

内容的提问来源于stack exchange,提问作者Divyesh
相关产品推荐
相关产品推荐

