Skip to content

Commit

Permalink
[Windows] Fix DatePicker TextColor property (#7995)
Browse files Browse the repository at this point in the history
* Fix Windows DatePicker TextColor

* Updated implementation

* Added Windows DatePicker DeviceTests

* - remove public API changes

* - clean up handlers

* - fix ext methods

* - fix windows attach tests

* Update PublicAPI.Unshipped.txt

* - remove ToDateTimeOffset ext for now

Co-authored-by: Shane Neuville <shneuvil@microsoft.com>
  • Loading branch information
jsuarezruiz and PureWeen authored Jul 26, 2022
1 parent d4d2076 commit aa3698f
Show file tree
Hide file tree
Showing 14 changed files with 191 additions and 51 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -80,8 +80,7 @@ protected virtual DatePickerDialog CreateDatePickerDialog(int year, int month, i
// This is a Android-specific mapping
public static void MapBackground(IDatePickerHandler handler, IDatePicker datePicker)
{
if (handler is DatePickerHandler platformHandler)
handler.PlatformView?.UpdateBackground(datePicker);
handler.PlatformView?.UpdateBackground(datePicker);
}

public static void MapFormat(IDatePickerHandler handler, IDatePicker datePicker)
Expand Down
21 changes: 13 additions & 8 deletions src/Core/src/Handlers/DatePicker/DatePickerHandler.Windows.cs
Original file line number Diff line number Diff line change
Expand Up @@ -20,40 +20,39 @@ protected override void DisconnectHandler(CalendarDatePicker platformView)

public static void MapFormat(IDatePickerHandler handler, IDatePicker datePicker)
{
handler.PlatformView?.UpdateDate(datePicker);
handler.PlatformView.UpdateDate(datePicker);
}

public static void MapDate(IDatePickerHandler handler, IDatePicker datePicker)
{
handler.PlatformView?.UpdateDate(datePicker);
handler.PlatformView.UpdateDate(datePicker);
}

public static void MapMinimumDate(IDatePickerHandler handler, IDatePicker datePicker)
{
handler.PlatformView?.UpdateMinimumDate(datePicker);
handler.PlatformView.UpdateMinimumDate(datePicker);
}

public static void MapMaximumDate(IDatePickerHandler handler, IDatePicker datePicker)
{
handler.PlatformView?.UpdateMaximumDate(datePicker);
handler.PlatformView.UpdateMaximumDate(datePicker);
}

public static void MapCharacterSpacing(IDatePickerHandler handler, IDatePicker datePicker)
{
handler.PlatformView?.UpdateCharacterSpacing(datePicker);
handler.PlatformView.UpdateCharacterSpacing(datePicker);
}

public static void MapFont(IDatePickerHandler handler, IDatePicker datePicker)
{
var fontManager = handler.GetRequiredService<IFontManager>();

handler.PlatformView?.UpdateFont(datePicker, fontManager);
handler.PlatformView.UpdateFont(datePicker, fontManager);
}

public static void MapTextColor(IDatePickerHandler handler, IDatePicker datePicker)
{
if (handler is DatePickerHandler platformHandler)
handler.PlatformView?.UpdateTextColor(datePicker);
handler.PlatformView.UpdateTextColor(datePicker);
}

private void DateChanged(CalendarDatePicker sender, CalendarDatePickerDateChangedEventArgs args)
Expand Down Expand Up @@ -81,5 +80,11 @@ private void DateChanged(CalendarDatePicker sender, CalendarDatePickerDateChange

VirtualView.Date = args.NewDate.Value.Date;
}

// TODO NET7 add to public API
internal static void MapBackground(IDatePickerHandler handler, IDatePicker datePicker)
{
handler.PlatformView?.UpdateBackground(datePicker);
}
}
}
4 changes: 2 additions & 2 deletions src/Core/src/Handlers/DatePicker/DatePickerHandler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,9 @@ public partial class DatePickerHandler : IDatePickerHandler
{
public static IPropertyMapper<IDatePicker, IDatePickerHandler> Mapper = new PropertyMapper<IDatePicker, IDatePickerHandler>(ViewHandler.ViewMapper)
{
#if __ANDROID__
#if ANDROID || WINDOWS
[nameof(IDatePicker.Background)] = MapBackground,
#elif __IOS__
#elif IOS
[nameof(IDatePicker.FlowDirection)] = MapFlowDirection,
#endif
[nameof(IDatePicker.CharacterSpacing)] = MapCharacterSpacing,
Expand Down
17 changes: 11 additions & 6 deletions src/Core/src/Handlers/TimePicker/TimePickerHandler.Windows.cs
Original file line number Diff line number Diff line change
Expand Up @@ -20,30 +20,35 @@ protected override void DisconnectHandler(TimePicker platformView)

public static void MapFormat(ITimePickerHandler handler, ITimePicker timePicker)
{
handler.PlatformView?.UpdateTime(timePicker);
handler.PlatformView.UpdateTime(timePicker);
}

public static void MapTime(ITimePickerHandler handler, ITimePicker timePicker)
{
handler.PlatformView?.UpdateTime(timePicker);
handler.PlatformView.UpdateTime(timePicker);
}

public static void MapCharacterSpacing(ITimePickerHandler handler, ITimePicker timePicker)
{
handler.PlatformView?.UpdateCharacterSpacing(timePicker);
handler.PlatformView.UpdateCharacterSpacing(timePicker);
}

public static void MapFont(ITimePickerHandler handler, ITimePicker timePicker)
{
var fontManager = handler.GetRequiredService<IFontManager>();

handler.PlatformView?.UpdateFont(timePicker, fontManager);
handler.PlatformView.UpdateFont(timePicker, fontManager);
}

public static void MapTextColor(ITimePickerHandler handler, ITimePicker timePicker)
{
if (handler is TimePickerHandler platformHandler)
handler.PlatformView?.UpdateTextColor(timePicker);
handler.PlatformView.UpdateTextColor(timePicker);
}

// TODO NET7 make public
internal static void MapBackground(ITimePickerHandler handler, ITimePicker timePicker)
{
handler.PlatformView?.UpdateBackground(timePicker);
}

void OnControlTimeChanged(object? sender, TimePickerValueChangedEventArgs e)
Expand Down
8 changes: 4 additions & 4 deletions src/Core/src/Handlers/TimePicker/TimePickerHandler.cs
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
#if __IOS__ && !MACCATALYST
#if IOS && !MACCATALYST
using PlatformView = Microsoft.Maui.Platform.MauiTimePicker;
#elif MACCATALYST
using PlatformView = UIKit.UIDatePicker;
#elif MONOANDROID
#elif ANDROID
using PlatformView = Microsoft.Maui.Platform.MauiTimePicker;
#elif WINDOWS
using PlatformView = Microsoft.UI.Xaml.Controls.TimePicker;
Expand All @@ -18,9 +18,9 @@ public partial class TimePickerHandler : ITimePickerHandler
{
public static IPropertyMapper<ITimePicker, ITimePickerHandler> Mapper = new PropertyMapper<ITimePicker, ITimePickerHandler>(ViewHandler.ViewMapper)
{
#if __ANDROID__
#if ANDROID || WINDOWS
[nameof(ITimePicker.Background)] = MapBackground,
#elif __IOS__
#elif IOS
[nameof(ITimePicker.FlowDirection)] = MapFlowDirection,
#endif
[nameof(ITimePicker.CharacterSpacing)] = MapCharacterSpacing,
Expand Down
58 changes: 55 additions & 3 deletions src/Core/src/Platform/Windows/DatePickerExtensions.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
using System;
using Microsoft.Maui.Graphics;
using Microsoft.UI.Xaml.Controls;
using WBrush = Microsoft.UI.Xaml.Media.Brush;

namespace Microsoft.Maui.Platform
{
Expand All @@ -16,6 +17,8 @@ public static void UpdateDate(this CalendarDatePicker platformDatePicker, IDateP

if (!string.IsNullOrEmpty(dateFormat))
platformDatePicker.DateFormat = dateFormat;

platformDatePicker.UpdateTextColor(datePicker);
}

public static void UpdateDate(this CalendarDatePicker platformDatePicker, DateTime dateTime)
Expand Down Expand Up @@ -45,8 +48,57 @@ public static void UpdateTextColor(this CalendarDatePicker platformDatePicker, I
{
Color textColor = datePicker.TextColor;

if (textColor != null)
platformDatePicker.Foreground = textColor.ToPlatform();
WBrush? brush = textColor?.ToPlatform();

if (brush is null)
{
platformDatePicker.Resources.RemoveKeys(TextColorResourceKeys);
platformDatePicker.ClearValue(CalendarDatePicker.ForegroundProperty);
}
else
{
platformDatePicker.Resources.SetValueForAllKey(TextColorResourceKeys, brush);
platformDatePicker.Foreground = brush;
}

platformDatePicker.RefreshThemeResources();
}

// ResourceKeys controlling the foreground color of the CalendarDatePicker.
// https://docs.microsoft.com/en-us/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.controls.calendardatepicker?view=windows-app-sdk-1.1
static readonly string[] TextColorResourceKeys =
{
"CalendarDatePickerTextForeground",
"CalendarDatePickerTextForegroundDisabled",
"CalendarDatePickerTextForegroundSelected"
};

// TODO NET7 add to public API
internal static void UpdateBackground(this CalendarDatePicker platformDatePicker, IDatePicker datePicker)
{
var brush = datePicker?.Background?.ToPlatform();

if (brush is null)
{
platformDatePicker.Resources.RemoveKeys(BackgroundColorResourceKeys);
platformDatePicker.ClearValue(CalendarDatePicker.BackgroundProperty);
}
else
{
platformDatePicker.Resources.SetValueForAllKey(BackgroundColorResourceKeys, brush);
platformDatePicker.Background = brush;
}

platformDatePicker.RefreshThemeResources();
}

static readonly string[] BackgroundColorResourceKeys =
{
"CalendarDatePickerBackground",
"CalendarDatePickerBackgroundPointerOver",
"CalendarDatePickerBackgroundPressed",
"CalendarDatePickerBackgroundDisabled",
"CalendarDatePickerBackgroundFocused",
};
}
}
}
17 changes: 10 additions & 7 deletions src/Core/src/Platform/Windows/PickerExtensions.cs
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
#nullable enable
using Microsoft.Maui.Graphics;
using Microsoft.UI.Xaml.Controls;
using WBrush = Microsoft.UI.Xaml.Media.Brush;

namespace Microsoft.Maui.Platform
{
Expand All @@ -23,15 +22,15 @@ public static void UpdateBackground(this ComboBox nativeComboBox, IPicker picker

if (platformBrush == null)
{
nativeComboBox.Resources.RemoveKeys(_backgroundColorResourceKeys);
nativeComboBox.Resources.RemoveKeys(BackgroundColorResourceKeys);
}
else
{
nativeComboBox.Resources.SetValueForAllKey(_backgroundColorResourceKeys, platformBrush);
nativeComboBox.Resources.SetValueForAllKey(BackgroundColorResourceKeys, platformBrush);
}
}

static readonly string[] _backgroundColorResourceKeys =
static readonly string[] BackgroundColorResourceKeys =
{
"ComboBoxBackground",
"ComboBoxBackgroundPointerOver",
Expand All @@ -44,18 +43,22 @@ public static void UpdateBackground(this ComboBox nativeComboBox, IPicker picker
public static void UpdateTextColor(this ComboBox nativeComboBox, IPicker picker)
{
var platformBrush = picker.TextColor?.ToPlatform();

if (platformBrush == null)
{
nativeComboBox.Resources.RemoveKeys(_textColorResourceKeys);
nativeComboBox.Resources.RemoveKeys(TextColorResourceKeys);
nativeComboBox.ClearValue(ComboBox.ForegroundProperty);
}
else
{
nativeComboBox.Resources.SetValueForAllKey(_textColorResourceKeys, platformBrush);
nativeComboBox.Resources.SetValueForAllKey(TextColorResourceKeys, platformBrush);
nativeComboBox.Foreground = platformBrush;
}
}

static readonly string[] _textColorResourceKeys =
// ResourceKeys controlling the foreground color of the ComboBox.
// https://docs.microsoft.com/en-us/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.controls.combobox?view=windows-app-sdk-1.1
static readonly string[] TextColorResourceKeys =
{
"ComboBoxForeground",
"ComboBoxForegroundDisabled",
Expand Down
52 changes: 44 additions & 8 deletions src/Core/src/Platform/Windows/TimePickerExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -30,24 +30,60 @@ public static void UpdateFont(this TimePicker platformTimePicker, ITimePicker ti

public static void UpdateTextColor(this TimePicker platformTimePicker, ITimePicker timePicker)
{
var brush = timePicker.TextColor?.ToPlatform();
Color textColor = timePicker.TextColor;

if (brush is null)
UI.Xaml.Media.Brush? platformBrush = textColor?.ToPlatform();

if (platformBrush == null)
{
platformTimePicker.Resources.RemoveKeys(TextColorResourceKeys);
platformTimePicker.ClearValue(TimePicker.ForegroundProperty);
}
else
platformTimePicker.Resources.SetValueForAllKey(TextColorResourceKeys, brush);

{
platformTimePicker.Resources.SetValueForAllKey(TextColorResourceKeys, platformBrush);
platformTimePicker.Foreground = platformBrush;
}

platformTimePicker.RefreshThemeResources();
}

// ResourceKeys controlling the foreground color of the TimePicker.
// https://docs.microsoft.com/en-us/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.controls.timepicker?view=windows-app-sdk-1.1
static readonly string[] TextColorResourceKeys =
{
"TimePickerButtonForeground",
"TimePickerButtonForegroundDefault",
"TimePickerButtonForegroundPointerOver",
"TimePickerButtonForegroundPressed",
"TimePickerButtonForegroundDisabled",
"TimePickerButtonForegroundFocused",
"TimePickerButtonForegroundDisabled"
};

// TODO NET7 add to public API
internal static void UpdateBackground(this TimePicker platformTimePicker, ITimePicker timePicker)
{
var brush = timePicker?.Background?.ToPlatform();

if (brush is null)
{
platformTimePicker.Resources.RemoveKeys(BackgroundColorResourceKeys);
platformTimePicker.ClearValue(TimePicker.BackgroundProperty);
}
else
{
platformTimePicker.Resources.SetValueForAllKey(BackgroundColorResourceKeys, brush);
platformTimePicker.Background = brush;
}

platformTimePicker.RefreshThemeResources();
}

static readonly string[] BackgroundColorResourceKeys =
{
"TimePickerButtonBackground",
"TimePickerButtonBackgroundPointerOver",
"TimePickerButtonBackgroundPressed",
"TimePickerButtonBackgroundDisabled",
"TimePickerButtonBackgroundFocused",
};
}
}
}
1 change: 1 addition & 0 deletions src/Core/tests/DeviceTests/Core.DeviceTests.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@
<Compile Remove="Handlers\*\*.cs" />
<Compile Include="Handlers\ActivityIndicator\*.cs" />
<Compile Include="Handlers\Button\*.cs" />
<Compile Include="Handlers\DatePicker\*.cs" />
<Compile Include="Handlers\Layout\*.cs" />
<Compile Include="Handlers\Editor\*.cs" />
<Compile Include="Handlers\Entry\*.cs" />
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,6 @@
using System;
using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Maui.DeviceTests.Stubs;
using Microsoft.Maui.Graphics;
using Microsoft.Maui.Handlers;
using Xunit;
using AColor = Android.Graphics.Color;

Expand Down
Loading

0 comments on commit aa3698f

Please sign in to comment.