Browse Source

CalendarDatePicker - use CustomDateFormatString for parsing the text input (#17465)

* fix: #17291 use CustomDateFormatString for parsing the text input

* fix: use CustomDateFormatString also for watermark

* fix: #17291 check also for SelectedDateFormat == Custom
release/11.2.1
Jan Karger ツ ☀ 2 years ago
committed by Max Katz
parent
commit
3aba971ba0
  1. 10
      src/Avalonia.Controls/CalendarDatePicker/CalendarDatePicker.cs
  2. 65
      tests/Avalonia.Controls.UnitTests/CalendarDatePickerTests.cs

10
src/Avalonia.Controls/CalendarDatePicker/CalendarDatePicker.cs

@ -730,7 +730,9 @@ namespace Avalonia.Controls
// the TextParseError event // the TextParseError event
try try
{ {
newSelectedDate = DateTime.Parse(text, DateTimeHelper.GetCurrentDateFormat()); newSelectedDate = SelectedDateFormat == CalendarDatePickerFormat.Custom && !string.IsNullOrEmpty(CustomDateFormatString) ?
DateTime.ParseExact(text, CustomDateFormatString, DateTimeHelper.GetCurrentDateFormat()) :
DateTime.Parse(text, DateTimeHelper.GetCurrentDateFormat());
if (Calendar.IsValidDateSelection(this._calendar!, newSelectedDate)) if (Calendar.IsValidDateSelection(this._calendar!, newSelectedDate))
{ {
@ -899,6 +901,11 @@ namespace Avalonia.Controls
switch (SelectedDateFormat) switch (SelectedDateFormat)
{ {
case CalendarDatePickerFormat.Custom:
{
watermarkText = string.Format(CultureInfo.CurrentCulture, watermarkFormat, CustomDateFormatString);
break;
}
case CalendarDatePickerFormat.Long: case CalendarDatePickerFormat.Long:
{ {
watermarkText = string.Format(CultureInfo.CurrentCulture, watermarkFormat, dtfi.LongDatePattern.ToString()); watermarkText = string.Format(CultureInfo.CurrentCulture, watermarkFormat, dtfi.LongDatePattern.ToString());
@ -911,6 +918,7 @@ namespace Avalonia.Controls
break; break;
} }
} }
_textBox.Watermark = watermarkText; _textBox.Watermark = watermarkText;
} }
else else

65
tests/Avalonia.Controls.UnitTests/CalendarDatePickerTests.cs

@ -1,17 +1,13 @@
using System; using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq; using System.Linq;
using Avalonia.Controls.Primitives; using Avalonia.Controls.Primitives;
using Avalonia.Controls.Presenters;
using Avalonia.Controls.Templates; using Avalonia.Controls.Templates;
using Avalonia.Data; using Avalonia.Input;
using Avalonia.Markup.Data;
using Avalonia.Platform; using Avalonia.Platform;
using Avalonia.UnitTests; using Avalonia.UnitTests;
using Moq; using Moq;
using Xunit; using Xunit;
using System.Globalization;
namespace Avalonia.Controls.UnitTests namespace Avalonia.Controls.UnitTests
{ {
@ -73,6 +69,34 @@ namespace Avalonia.Controls.UnitTests
} }
} }
[Fact]
public void Setting_Date_Manually_With_CustomDateFormatString_Should_Be_Accepted()
{
CultureInfo.CurrentCulture = CultureInfo.CurrentUICulture = CultureInfo.GetCultureInfo("en-US");
using (UnitTestApplication.Start(Services))
{
CalendarDatePicker datePicker = CreateControl();
datePicker.SelectedDateFormat = CalendarDatePickerFormat.Custom;
datePicker.CustomDateFormatString = "dd.MM.yyyy";
var tb = GetTextBox(datePicker);
tb.Clear();
RaiseTextEvent(tb, "17.10.2024");
RaiseKeyEvent(tb, Key.Enter, KeyModifiers.None);
Assert.Equal("17.10.2024", datePicker.Text);
Assert.True(CompareDates(datePicker.SelectedDate.Value, new DateTime(2024, 10, 17)));
tb.Clear();
RaiseTextEvent(tb, "12.10.2024");
RaiseKeyEvent(tb, Key.Enter, KeyModifiers.None);
Assert.Equal("12.10.2024", datePicker.Text);
Assert.True(CompareDates(datePicker.SelectedDate.Value, new DateTime(2024, 10, 12)));
}
}
private static TestServices Services => TestServices.MockThreadingInterface.With( private static TestServices Services => TestServices.MockThreadingInterface.With(
standardCursorFactory: Mock.Of<ICursorFactory>()); standardCursorFactory: Mock.Of<ICursorFactory>());
@ -127,5 +151,32 @@ namespace Avalonia.Controls.UnitTests
}); });
} }
private TextBox GetTextBox(CalendarDatePicker control)
{
return control.GetTemplateChildren()
.OfType<TextBox>()
.First();
}
private static void RaiseKeyEvent(TextBox textBox, Key key, KeyModifiers inputModifiers)
{
textBox.RaiseEvent(new KeyEventArgs
{
RoutedEvent = InputElement.KeyDownEvent,
KeyModifiers = inputModifiers,
Key = key
});
}
private static void RaiseTextEvent(TextBox textBox, string text)
{
textBox.RaiseEvent(new TextInputEventArgs
{
RoutedEvent = InputElement.TextInputEvent,
Text = text
});
}
} }
} }

Loading…
Cancel
Save