From 52c39b602a8a9d87a5fe3d856cdbb6256c07f854 Mon Sep 17 00:00:00 2001 From: "E.Z. Hart" Date: Mon, 21 Jun 2021 21:17:46 -0600 Subject: [PATCH] Switch WinUI to CalendarDatePicker; implements #1092 --- .../DatePicker/DatePickerHandler.Windows.cs | 43 ++++--- .../Platform/Windows/DatePickerExtensions.cs | 113 ++---------------- 2 files changed, 34 insertions(+), 122 deletions(-) diff --git a/src/Core/src/Handlers/DatePicker/DatePickerHandler.Windows.cs b/src/Core/src/Handlers/DatePicker/DatePickerHandler.Windows.cs index f1d18dc4dbf0..adea668ddcf7 100644 --- a/src/Core/src/Handlers/DatePicker/DatePickerHandler.Windows.cs +++ b/src/Core/src/Handlers/DatePicker/DatePickerHandler.Windows.cs @@ -4,23 +4,23 @@ namespace Microsoft.Maui.Handlers { - public partial class DatePickerHandler : ViewHandler + public partial class DatePickerHandler : ViewHandler { WBrush? _defaultForeground; - protected override DatePicker CreateNativeView() => new DatePicker(); + protected override CalendarDatePicker CreateNativeView() => new CalendarDatePicker(); - protected override void ConnectHandler(DatePicker nativeView) + protected override void ConnectHandler(CalendarDatePicker nativeView) { - nativeView.DateChanged += OnControlDateChanged; + nativeView.DateChanged += DateChanged; } - protected override void DisconnectHandler(DatePicker nativeView) + protected override void DisconnectHandler(CalendarDatePicker nativeView) { - nativeView.DateChanged -= OnControlDateChanged; + nativeView.DateChanged -= DateChanged; } - protected override void SetupDefaults(DatePicker nativeView) + protected override void SetupDefaults(CalendarDatePicker nativeView) { _defaultForeground = nativeView.Foreground; @@ -64,25 +64,30 @@ public static void MapTextColor(DatePickerHandler handler, IDatePicker datePicke handler.NativeView?.UpdateTextColor(datePicker, handler._defaultForeground); } - void OnControlDateChanged(object? sender, DatePickerValueChangedEventArgs e) + private void DateChanged(CalendarDatePicker sender, CalendarDatePickerDateChangedEventArgs args) { if (VirtualView == null) return; - if (VirtualView.Date.CompareTo(e.NewDate.Date) != 0) + if (!args.NewDate.HasValue) { - var date = e.NewDate.Date.Clamp(VirtualView.MinimumDate, VirtualView.MaximumDate); - VirtualView.Date = date; + return; + } - // Set the control date-time to clamped value, if it exceeded the limits at the time of installation. - if (date != e.NewDate.Date) - { - NativeView?.UpdateDate(date); - NativeView?.UpdateLayout(); - } + // TODO ezhart 2021-06-21 For the moment, IDatePicker requires a date to be selected; once that's fixed, we can uncomment these next lines - VirtualView.InvalidateMeasure(); - } + //if (!args.NewDate.HasValue) + //{ + // VirtualView.Date = null; + // return; + //} + + //if (VirtualView.Date == null) + //{ + // VirtualView.Date = args.NewDate.Value.Date; + //} + + VirtualView.Date = args.NewDate.Value.Date; } } } \ No newline at end of file diff --git a/src/Core/src/Platform/Windows/DatePickerExtensions.cs b/src/Core/src/Platform/Windows/DatePickerExtensions.cs index 2a6f729b0191..060a85580348 100644 --- a/src/Core/src/Platform/Windows/DatePickerExtensions.cs +++ b/src/Core/src/Platform/Windows/DatePickerExtensions.cs @@ -8,132 +8,39 @@ namespace Microsoft.Maui { public static class DatePickerExtensions { - public static void UpdateDate(this DatePicker nativeDatePicker, IDatePicker datePicker) + public static void UpdateDate(this CalendarDatePicker nativeDatePicker, IDatePicker datePicker) { var date = datePicker.Date; nativeDatePicker.UpdateDate(date); - - nativeDatePicker.UpdateDay(datePicker); - nativeDatePicker.UpdateMonth(datePicker); - nativeDatePicker.UpdateYear(datePicker); } - public static void UpdateDate(this DatePicker nativeDatePicker, DateTime dateTime) + public static void UpdateDate(this CalendarDatePicker nativeDatePicker, DateTime dateTime) { - nativeDatePicker.Date = new DateTimeOffset(new DateTime(dateTime.Ticks, DateTimeKind.Unspecified)); + nativeDatePicker.Date = dateTime; } - public static void UpdateMinimumDate(this DatePicker nativeDatePicker, IDatePicker datePicker) + public static void UpdateMinimumDate(this CalendarDatePicker nativeDatePicker, IDatePicker datePicker) { - DateTime mindate = datePicker.MinimumDate; - - try - { - nativeDatePicker.MinYear = new DateTimeOffset(new DateTime(datePicker.MinimumDate.Ticks, DateTimeKind.Unspecified)); - } - catch (ArgumentOutOfRangeException) - { - // This will be thrown when mindate equals DateTime.MinValue and the UTC offset is positive - // because the resulting DateTimeOffset.UtcDateTime will be out of range. In that case let's - // specify the Kind as UTC so there is no offset. - mindate = DateTime.SpecifyKind(mindate, DateTimeKind.Utc); - nativeDatePicker.MinYear = new DateTimeOffset(mindate); - } + nativeDatePicker.MinDate = datePicker.MinimumDate; } - public static void UpdateMaximumDate(this DatePicker nativeDatePicker, IDatePicker datePicker) + public static void UpdateMaximumDate(this CalendarDatePicker nativeDatePicker, IDatePicker datePicker) { - nativeDatePicker.MaxYear = new DateTimeOffset(new DateTime(datePicker.MaximumDate.Ticks, DateTimeKind.Unspecified)); + nativeDatePicker.MaxDate = datePicker.MaximumDate; } - public static void UpdateCharacterSpacing(this DatePicker nativeDatePicker, IDatePicker datePicker) + public static void UpdateCharacterSpacing(this CalendarDatePicker nativeDatePicker, IDatePicker datePicker) { nativeDatePicker.CharacterSpacing = datePicker.CharacterSpacing.ToEm(); } - public static void UpdateFont(this DatePicker nativeDatePicker, IDatePicker datePicker, IFontManager fontManager) => + public static void UpdateFont(this CalendarDatePicker nativeDatePicker, IDatePicker datePicker, IFontManager fontManager) => nativeDatePicker.UpdateFont(datePicker.Font, fontManager); - public static void UpdateTextColor(this DatePicker nativeDatePicker, IDatePicker datePicker, WBrush? defaultForeground) + public static void UpdateTextColor(this CalendarDatePicker nativeDatePicker, IDatePicker datePicker, WBrush? defaultForeground) { Color textColor = datePicker.TextColor; nativeDatePicker.Foreground = textColor == null ? (defaultForeground ?? textColor?.ToNative()) : textColor.ToNative(); } - - internal static void UpdateDay(this DatePicker nativeDatePicker, IDatePicker datePicker) - { - nativeDatePicker.DayVisible = true; - - if (string.IsNullOrWhiteSpace(datePicker.Format) || datePicker.Format.Equals("d")) - { - nativeDatePicker.DayFormat = "day"; - } - else if (datePicker.Format.Equals("D")) - { - nativeDatePicker.DayFormat = "dayofweek.full"; - } - else - { - var day = datePicker.Format.Count(x => x == 'd'); - if (day == 0) - nativeDatePicker.DayVisible = false; - else if (day == 3) - nativeDatePicker.DayFormat = "day dayofweek.abbreviated"; - else if (day == 4) - nativeDatePicker.DayFormat = "dayofweek.full"; - else - nativeDatePicker.DayFormat = "day"; - } - } - - internal static void UpdateMonth(this DatePicker nativeDatePicker, IDatePicker datePicker) - { - nativeDatePicker.MonthVisible = true; - - if (string.IsNullOrWhiteSpace(datePicker.Format) || datePicker.Format.Equals("d")) - { - nativeDatePicker.MonthFormat = "month"; - } - else if (datePicker.Format.Equals("D")) - { - nativeDatePicker.MonthFormat = "month.full"; - } - else - { - var month = datePicker.Format.Count(x => x == 'M'); - if (month == 0) - nativeDatePicker.MonthVisible = false; - else if (month <= 2) - nativeDatePicker.MonthFormat = "month.numeric"; - else if (month == 3) - nativeDatePicker.MonthFormat = "month.abbreviated"; - else - nativeDatePicker.MonthFormat = "month.full"; - } - } - - internal static void UpdateYear(this DatePicker nativeDatePicker, IDatePicker datePicker) - { - nativeDatePicker.YearVisible = true; - - if (string.IsNullOrWhiteSpace(datePicker.Format) || datePicker.Format.Equals("d")) - { - nativeDatePicker.YearFormat = "year"; - } - else if (datePicker.Format.Equals("D")) - { - nativeDatePicker.YearFormat = "year.full"; - } - else - { - var year = datePicker.Format.Count(x => x == 'y'); - if (year == 0) - nativeDatePicker.YearVisible = false; - else if (year <= 2) - nativeDatePicker.YearFormat = "year.abbreviated"; - else - nativeDatePicker.YearFormat = "year.full"; - } - } } } \ No newline at end of file