From 43a997c362f26737aeb99a625c223d90c45097d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=B9=E5=BF=97=E8=8A=B3?= Date: Thu, 23 Oct 2025 19:25:43 +0800 Subject: [PATCH 1/2] =?UTF-8?q?fix=EF=BC=9A=E4=BF=AE=E5=A4=8DDateTimePicke?= =?UTF-8?q?r=20VM=20Binding=E5=B1=9E=E6=80=A7=E8=AE=BE=E7=BD=AE=E4=B8=BAnu?= =?UTF-8?q?ll=E6=97=B6=20UI=E4=B8=8D=E4=BC=9A=E5=90=8C=E6=AD=A5=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controls/Input/DateTimePicker.cs | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/Shared/HandyControl_Shared/Controls/Input/DateTimePicker.cs b/src/Shared/HandyControl_Shared/Controls/Input/DateTimePicker.cs index 142d593e3..3f8c1295c 100644 --- a/src/Shared/HandyControl_Shared/Controls/Input/DateTimePicker.cs +++ b/src/Shared/HandyControl_Shared/Controls/Input/DateTimePicker.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.ComponentModel; using System.Windows; @@ -183,6 +183,11 @@ private static void OnSelectedDateTimeChanged(DependencyObject d, DependencyProp var time = dp.SelectedDateTime.Value; dp.SetTextInternal(dp.DateTimeToString(time)); } + else + { + // 修复:当 SelectedDateTime 为 null 时,清空文本框 + dp.SetTextInternal(string.Empty); + } dp.RaiseEvent(new FunctionEventArgs(SelectedDateTimeChangedEvent, dp) { @@ -620,7 +625,8 @@ private void SetSelectedDateTime() } var d = SetTextBoxValue(s); - if (!SelectedDateTime.Equals(d)) + // 修复:使用静态的 Equals 方法进行安全的 null 比较 + if (!Equals(SelectedDateTime, d)) { SetCurrentValue(SelectedDateTimeProperty, d); SetCurrentValue(DisplayDateTimeProperty, d); @@ -632,12 +638,18 @@ private void SetSelectedDateTime() { SetCurrentValue(SelectedDateTimeProperty, null); } + else + { + // 修复:确保文本框同步清空 + SetTextInternal(string.Empty); + } } } else { var d = SetTextBoxValue(_defaultText); - if (!SelectedDateTime.Equals(d)) + // 修复:使用静态的 Equals 方法进行安全的 null 比较 + if (!Equals(SelectedDateTime, d)) { SetCurrentValue(SelectedDateTimeProperty, d); } From 0635e3fd346b67df5d9a5499f19deffb3a3eb878 Mon Sep 17 00:00:00 2001 From: NaBian <836904362@qq.com> Date: Wed, 12 Nov 2025 21:32:13 +0800 Subject: [PATCH 2/2] refactor: DateTimePicker and TimePicker formatting. Improved code formatting and consistency in DateTimePicker.cs and TimePicker.cs by splitting long lines and enhancing readability. Also fixed null handling and text synchronization for selected values in TimePicker. --- .../Controls/Input/DateTimePicker.cs | 69 ++++++++++-------- .../Controls/Input/TimePicker.cs | 72 +++++++++++-------- 2 files changed, 82 insertions(+), 59 deletions(-) diff --git a/src/Shared/HandyControl_Shared/Controls/Input/DateTimePicker.cs b/src/Shared/HandyControl_Shared/Controls/Input/DateTimePicker.cs index 3f8c1295c..1765760ab 100644 --- a/src/Shared/HandyControl_Shared/Controls/Input/DateTimePicker.cs +++ b/src/Shared/HandyControl_Shared/Controls/Input/DateTimePicker.cs @@ -75,8 +75,10 @@ public event EventHandler> SelectedDateTimeChanged static DateTimePicker() { EventManager.RegisterClassHandler(typeof(DateTimePicker), GotFocusEvent, new RoutedEventHandler(OnGotFocus)); - KeyboardNavigation.TabNavigationProperty.OverrideMetadata(typeof(DateTimePicker), new FrameworkPropertyMetadata(KeyboardNavigationMode.Once)); - KeyboardNavigation.IsTabStopProperty.OverrideMetadata(typeof(DateTimePicker), new FrameworkPropertyMetadata(ValueBoxes.FalseBox)); + KeyboardNavigation.TabNavigationProperty.OverrideMetadata(typeof(DateTimePicker), + new FrameworkPropertyMetadata(KeyboardNavigationMode.Once)); + KeyboardNavigation.IsTabStopProperty.OverrideMetadata(typeof(DateTimePicker), + new FrameworkPropertyMetadata(ValueBoxes.FalseBox)); } public DateTimePicker() @@ -111,7 +113,9 @@ public Style CalendarStyle } public static readonly DependencyProperty DisplayDateTimeProperty = DependencyProperty.Register( - nameof(DisplayDateTime), typeof(DateTime), typeof(DateTimePicker), new FrameworkPropertyMetadata(DateTime.Now, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, null, CoerceDisplayDateTime)); + nameof(DisplayDateTime), typeof(DateTime), typeof(DateTimePicker), + new FrameworkPropertyMetadata(DateTime.Now, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, null, + CoerceDisplayDateTime)); private static object CoerceDisplayDateTime(DependencyObject d, object value) { @@ -128,7 +132,9 @@ public DateTime DisplayDateTime } public static readonly DependencyProperty IsDropDownOpenProperty = DependencyProperty.Register( - nameof(IsDropDownOpen), typeof(bool), typeof(DateTimePicker), new FrameworkPropertyMetadata(ValueBoxes.FalseBox, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, OnIsDropDownOpenChanged, OnCoerceIsDropDownOpen)); + nameof(IsDropDownOpen), typeof(bool), typeof(DateTimePicker), + new FrameworkPropertyMetadata(ValueBoxes.FalseBox, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, + OnIsDropDownOpenChanged, OnCoerceIsDropDownOpen)); private static object OnCoerceIsDropDownOpen(DependencyObject d, object baseValue) => d is DateTimePicker @@ -165,7 +171,9 @@ public bool IsDropDownOpen } public static readonly DependencyProperty SelectedDateTimeProperty = DependencyProperty.Register( - nameof(SelectedDateTime), typeof(DateTime?), typeof(DateTimePicker), new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, OnSelectedDateTimeChanged, CoerceSelectedDateTime)); + nameof(SelectedDateTime), typeof(DateTime?), typeof(DateTimePicker), + new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, + OnSelectedDateTimeChanged, CoerceSelectedDateTime)); private static object CoerceSelectedDateTime(DependencyObject d, object value) { @@ -185,7 +193,6 @@ private static void OnSelectedDateTimeChanged(DependencyObject d, DependencyProp } else { - // 修复:当 SelectedDateTime 为 null 时,清空文本框 dp.SetTextInternal(string.Empty); } @@ -202,7 +209,8 @@ public DateTime? SelectedDateTime } public static readonly DependencyProperty TextProperty = DependencyProperty.Register( - nameof(Text), typeof(string), typeof(DateTimePicker), new FrameworkPropertyMetadata(string.Empty, OnTextChanged)); + nameof(Text), typeof(string), typeof(DateTimePicker), + new FrameworkPropertyMetadata(string.Empty, OnTextChanged)); private static void OnTextChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { @@ -333,7 +341,8 @@ public override void OnApplyTemplate() { _textBox.SetBinding(SelectionBrushProperty, new Binding(SelectionBrushProperty.Name) { Source = this }); #if !(NET40 || NET45 || NET451 || NET452 || NET46 || NET461 || NET462 || NET47 || NET471 || NET472) - _textBox.SetBinding(SelectionTextBrushProperty, new Binding(SelectionTextBrushProperty.Name) { Source = this }); + _textBox.SetBinding(SelectionTextBrushProperty, + new Binding(SelectionTextBrushProperty.Name) { Source = this }); #endif _textBox.SetBinding(SelectionOpacityProperty, new Binding(SelectionOpacityProperty.Name) { Source = this }); _textBox.SetBinding(CaretBrushProperty, new Binding(CaretBrushProperty.Name) { Source = this }); @@ -407,7 +416,8 @@ private void InitCalendarWithClock() private void CalendarWithClock_Confirmed() => TogglePopup(); - private void CalendarWithClock_SelectedDateTimeChanged(object sender, FunctionEventArgs e) => SelectedDateTime = e.Info; + private void CalendarWithClock_SelectedDateTimeChanged(object sender, FunctionEventArgs e) => + SelectedDateTime = e.Info; private void TextBox_LostFocus(object sender, RoutedEventArgs e) { @@ -450,29 +460,29 @@ private bool ProcessDateTimePickerKey(KeyEventArgs e) switch (e.Key) { case Key.System: + { + switch (e.SystemKey) { - switch (e.SystemKey) + case Key.Down: { - case Key.Down: - { - if ((Keyboard.Modifiers & ModifierKeys.Alt) == ModifierKeys.Alt) - { - TogglePopup(); - return true; - } - - break; - } - } + if ((Keyboard.Modifiers & ModifierKeys.Alt) == ModifierKeys.Alt) + { + TogglePopup(); + return true; + } - break; + break; + } } + break; + } + case Key.Enter: - { - SetSelectedDateTime(); - return true; - } + { + SetSelectedDateTime(); + return true; + } } return false; @@ -593,10 +603,10 @@ private void SafeSetText(string s) if (SelectedDateTime != null) { - var newtext = DateTimeToString(SelectedDateTime.Value); - SafeSetText(newtext); + SafeSetText(DateTimeToString(SelectedDateTime.Value)); return SelectedDateTime; } + SafeSetText(DateTimeToString(DisplayDateTime)); return DisplayDateTime; } @@ -625,7 +635,6 @@ private void SetSelectedDateTime() } var d = SetTextBoxValue(s); - // 修复:使用静态的 Equals 方法进行安全的 null 比较 if (!Equals(SelectedDateTime, d)) { SetCurrentValue(SelectedDateTimeProperty, d); @@ -640,7 +649,6 @@ private void SetSelectedDateTime() } else { - // 修复:确保文本框同步清空 SetTextInternal(string.Empty); } } @@ -648,7 +656,6 @@ private void SetSelectedDateTime() else { var d = SetTextBoxValue(_defaultText); - // 修复:使用静态的 Equals 方法进行安全的 null 比较 if (!Equals(SelectedDateTime, d)) { SetCurrentValue(SelectedDateTimeProperty, d); diff --git a/src/Shared/HandyControl_Shared/Controls/Input/TimePicker.cs b/src/Shared/HandyControl_Shared/Controls/Input/TimePicker.cs index 960b6c309..78ea3c143 100644 --- a/src/Shared/HandyControl_Shared/Controls/Input/TimePicker.cs +++ b/src/Shared/HandyControl_Shared/Controls/Input/TimePicker.cs @@ -73,8 +73,10 @@ public event EventHandler> SelectedTimeChanged static TimePicker() { EventManager.RegisterClassHandler(typeof(TimePicker), GotFocusEvent, new RoutedEventHandler(OnGotFocus)); - KeyboardNavigation.TabNavigationProperty.OverrideMetadata(typeof(TimePicker), new FrameworkPropertyMetadata(KeyboardNavigationMode.Once)); - KeyboardNavigation.IsTabStopProperty.OverrideMetadata(typeof(TimePicker), new FrameworkPropertyMetadata(ValueBoxes.FalseBox)); + KeyboardNavigation.TabNavigationProperty.OverrideMetadata(typeof(TimePicker), + new FrameworkPropertyMetadata(KeyboardNavigationMode.Once)); + KeyboardNavigation.IsTabStopProperty.OverrideMetadata(typeof(TimePicker), + new FrameworkPropertyMetadata(ValueBoxes.FalseBox)); } public TimePicker() @@ -115,7 +117,8 @@ public DateTime DisplayTime nameof(DisplayTime), typeof(DateTime), typeof(TimePicker), - new FrameworkPropertyMetadata(DateTime.Now, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, null, CoerceDisplayTime)); + new FrameworkPropertyMetadata(DateTime.Now, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, null, + CoerceDisplayTime)); private static object CoerceDisplayTime(DependencyObject d, object value) { @@ -139,7 +142,8 @@ public bool IsDropDownOpen nameof(IsDropDownOpen), typeof(bool), typeof(TimePicker), - new FrameworkPropertyMetadata(ValueBoxes.FalseBox, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, OnIsDropDownOpenChanged, OnCoerceIsDropDownOpen)); + new FrameworkPropertyMetadata(ValueBoxes.FalseBox, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, + OnIsDropDownOpenChanged, OnCoerceIsDropDownOpen)); private static object OnCoerceIsDropDownOpen(DependencyObject d, object baseValue) { @@ -183,7 +187,8 @@ public DateTime? SelectedTime nameof(SelectedTime), typeof(DateTime?), typeof(TimePicker), - new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, OnSelectedTimeChanged, CoerceSelectedTime)); + new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, + OnSelectedTimeChanged, CoerceSelectedTime)); private static void OnSelectedTimeChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { @@ -194,6 +199,10 @@ private static void OnSelectedTimeChanged(DependencyObject d, DependencyProperty var time = dp.SelectedTime.Value; dp.SetTextInternal(dp.DateTimeToString(time)); } + else + { + dp.SetTextInternal(string.Empty); + } dp.RaiseEvent(new FunctionEventArgs(SelectedTimeChangedEvent, dp) { @@ -306,7 +315,9 @@ public Brush CaretBrush } public static readonly DependencyProperty ClockProperty = DependencyProperty.Register( - nameof(Clock), typeof(ClockBase), typeof(TimePicker), new FrameworkPropertyMetadata(default(Clock), FrameworkPropertyMetadataOptions.NotDataBindable, OnClockChanged)); + nameof(Clock), typeof(ClockBase), typeof(TimePicker), + new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.NotDataBindable, + OnClockChanged)); private static void OnClockChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { @@ -384,7 +395,8 @@ public override void OnApplyTemplate() { _textBox.SetBinding(SelectionBrushProperty, new Binding(SelectionBrushProperty.Name) { Source = this }); #if !(NET40 || NET45 || NET451 || NET452 || NET46 || NET461 || NET462 || NET47 || NET471 || NET472) - _textBox.SetBinding(SelectionTextBrushProperty, new Binding(SelectionTextBrushProperty.Name) { Source = this }); + _textBox.SetBinding(SelectionTextBrushProperty, + new Binding(SelectionTextBrushProperty.Name) { Source = this }); #endif _textBox.SetBinding(SelectionOpacityProperty, new Binding(SelectionOpacityProperty.Name) { Source = this }); _textBox.SetBinding(CaretBrushProperty, new Binding(CaretBrushProperty.Name) { Source = this }); @@ -488,29 +500,29 @@ private bool ProcessTimePickerKey(KeyEventArgs e) switch (e.Key) { case Key.System: + { + switch (e.SystemKey) { - switch (e.SystemKey) + case Key.Down: { - case Key.Down: - { - if ((Keyboard.Modifiers & ModifierKeys.Alt) == ModifierKeys.Alt) - { - TogglePopup(); - return true; - } - - break; - } - } + if ((Keyboard.Modifiers & ModifierKeys.Alt) == ModifierKeys.Alt) + { + TogglePopup(); + return true; + } - break; + break; + } } + break; + } + case Key.Enter: - { - SetSelectedTime(); - return true; - } + { + SetSelectedTime(); + return true; + } } return false; @@ -635,10 +647,10 @@ private void SafeSetText(string s) if (SelectedTime != null) { - var newtext = DateTimeToString((DateTime) SelectedTime); - SafeSetText(newtext); + SafeSetText(DateTimeToString((DateTime) SelectedTime)); return SelectedTime; } + SafeSetText(DateTimeToString(DisplayTime)); return DisplayTime; } @@ -662,7 +674,7 @@ private void SetSelectedTime() } var d = SetTextBoxValue(s); - if (!SelectedTime.Equals(d)) + if (!Equals(SelectedTime, d)) { SetCurrentValue(SelectedTimeProperty, d); SetCurrentValue(DisplayTimeProperty, d); @@ -674,12 +686,16 @@ private void SetSelectedTime() { SetCurrentValue(SelectedTimeProperty, null); } + else + { + SetTextInternal(string.Empty); + } } } else { var d = SetTextBoxValue(_defaultText); - if (!SelectedTime.Equals(d)) + if (!Equals(SelectedTime, d)) { SetCurrentValue(SelectedTimeProperty, d); }