fix: completely fix timepicker racing issue.

This commit is contained in:
Dong Bin
2025-02-18 18:02:37 +08:00
parent e062efead0
commit 27375f722e
7 changed files with 237 additions and 131 deletions

View File

@@ -15,7 +15,7 @@ namespace Ursa.Controls;
[TemplatePart(PART_Popup, typeof(Popup))]
[TemplatePart(PART_TextBox, typeof(TextBox))]
[TemplatePart(PART_Calendar, typeof(CalendarView))]
[TemplatePart(PART_TimePicker, typeof(TimePicker))]
[TemplatePart(PART_TimePicker, typeof(TimePickerPresenter))]
public class DateTimePicker : DatePickerBase
{
public const string PART_Button = "PART_Button";
@@ -85,14 +85,14 @@ public class DateTimePicker : DatePickerBase
{
_textBox?.SetValue(TextBox.TextProperty, null);
_calendar?.ClearSelection();
_timePickerPresenter?.SetValue(TimePickerPresenter.TimeProperty, null);
_timePickerPresenter?.SyncTime(null);
}
else
{
_textBox?.SetValue(TextBox.TextProperty,
date.Value.ToString(DisplayFormat ?? CultureInfo.InvariantCulture.DateTimeFormat.FullDateTimePattern));
_calendar?.MarkDates(date.Value.Date, date.Value.Date);
_timePickerPresenter?.SetValue(TimePickerPresenter.TimeProperty, date.Value.TimeOfDay);
_timePickerPresenter?.SyncTime(date.Value.TimeOfDay);
}
}
@@ -175,7 +175,7 @@ public class DateTimePicker : DatePickerBase
var date = SelectedDate ?? DateTime.Now;
_calendar.ContextDate = new CalendarContext(date.Year, date.Month);
_calendar.UpdateDayButtons();
_timePickerPresenter?.SetValue(TimePickerPresenter.TimeProperty, SelectedDate?.TimeOfDay);
_timePickerPresenter?.SyncTime(SelectedDate?.TimeOfDay);
}
SetCurrentValue(IsDropdownOpenProperty, true);
@@ -193,7 +193,7 @@ public class DateTimePicker : DatePickerBase
{
SetCurrentValue(SelectedDateProperty, null);
_calendar?.ClearSelection();
_timePickerPresenter?.SetValue(TimePickerPresenter.TimeProperty, null);
_timePickerPresenter?.SyncTime(null);
}
else if (DisplayFormat is null || DisplayFormat.Length == 0)
{
@@ -201,7 +201,7 @@ public class DateTimePicker : DatePickerBase
{
SetCurrentValue(SelectedDateProperty, defaultTime);
_calendar?.MarkDates(defaultTime.Date, defaultTime.Date);
_timePickerPresenter?.SetValue(TimePickerPresenter.TimeProperty, defaultTime.TimeOfDay);
_timePickerPresenter?.SyncTime(defaultTime.TimeOfDay);
}
}
else
@@ -217,14 +217,14 @@ public class DateTimePicker : DatePickerBase
}
_calendar?.MarkDates(date.Date, date.Date);
_timePickerPresenter?.SetValue(TimePickerPresenter.TimeProperty, date.TimeOfDay);
_timePickerPresenter?.SyncTime(date.TimeOfDay);
}
else
{
SetCurrentValue(SelectedDateProperty, null);
if (!fromText) _textBox?.SetValue(TextBox.TextProperty, null);
_calendar?.ClearSelection();
_timePickerPresenter?.SetValue(TimePickerPresenter.TimeProperty, null);
_timePickerPresenter?.SyncTime(null);
}
}
}
@@ -236,7 +236,7 @@ public class DateTimePicker : DatePickerBase
var date = SelectedDate ?? DateTime.Today;
_calendar.ContextDate = _calendar.ContextDate.With(date.Year, date.Month);
_calendar.UpdateDayButtons();
_timePickerPresenter?.SetValue(TimePickerPresenter.TimeProperty, date.TimeOfDay);
_timePickerPresenter?.SyncTime(date.TimeOfDay);
}
SetCurrentValue(IsDropdownOpenProperty, true);