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 ツ ☀ 1 year 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
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))
{
@ -899,6 +901,11 @@ namespace Avalonia.Controls
switch (SelectedDateFormat)
{
case CalendarDatePickerFormat.Custom:
{
watermarkText = string.Format(CultureInfo.CurrentCulture, watermarkFormat, CustomDateFormatString);
break;
}
case CalendarDatePickerFormat.Long:
{
watermarkText = string.Format(CultureInfo.CurrentCulture, watermarkFormat, dtfi.LongDatePattern.ToString());
@ -911,6 +918,7 @@ namespace Avalonia.Controls
break;
}
}
_textBox.Watermark = watermarkText;
}
else

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

@ -1,17 +1,13 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System;
using System.Linq;
using Avalonia.Controls.Primitives;
using Avalonia.Controls.Presenters;
using Avalonia.Controls.Templates;
using Avalonia.Data;
using Avalonia.Markup.Data;
using Avalonia.Input;
using Avalonia.Platform;
using Avalonia.UnitTests;
using Moq;
using Xunit;
using System.Globalization;
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(
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