From bf1272399da1c170200c06d89f4467dbed4a2f00 Mon Sep 17 00:00:00 2001
From: NaBian <836904362@qq.com>
Date: Thu, 27 Oct 2022 22:58:45 +0800
Subject: [PATCH] fix: close #1149
---
.../HandyControl_Net_40/Themes/Theme.xaml | 6 +-
.../Controls/TimePickerDemoCtl.xaml | 66 +++++++++++++++----
.../Controls/Input/DateTimePicker.cs | 5 --
.../Controls/Input/TimePicker.cs | 40 +++++++----
.../Controls/Time/Clock/ClockBase.cs | 8 +++
.../Controls/Time/Clock/ListClock.cs | 41 +++++++-----
.../Themes/Styles/Clock.xaml | 6 +-
.../HandyControl_Shared/Themes/Theme.xaml | 6 +-
8 files changed, 125 insertions(+), 53 deletions(-)
diff --git a/src/Net_40/HandyControl_Net_40/Themes/Theme.xaml b/src/Net_40/HandyControl_Net_40/Themes/Theme.xaml
index dd2062ca..52766276 100644
--- a/src/Net_40/HandyControl_Net_40/Themes/Theme.xaml
+++ b/src/Net_40/HandyControl_Net_40/Themes/Theme.xaml
@@ -12718,9 +12718,9 @@
-
-
-
+
+
+
diff --git a/src/Shared/HandyControlDemo_Shared/UserControl/Controls/TimePickerDemoCtl.xaml b/src/Shared/HandyControlDemo_Shared/UserControl/Controls/TimePickerDemoCtl.xaml
index c430c1f4..e759475d 100644
--- a/src/Shared/HandyControlDemo_Shared/UserControl/Controls/TimePickerDemoCtl.xaml
+++ b/src/Shared/HandyControlDemo_Shared/UserControl/Controls/TimePickerDemoCtl.xaml
@@ -33,14 +33,38 @@
-
-
+
+
+
+
+
+
+
+
+
+
-
-
+
+
+
+
+
+
+
+
+
+
-
-
+
+
+
+
+
+
+
+
+
+
@@ -48,13 +72,33 @@
-
+
+
+
+
+
-
-
+
+
+
+
+
+
+
+
+
+
-
-
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Shared/HandyControl_Shared/Controls/Input/DateTimePicker.cs b/src/Shared/HandyControl_Shared/Controls/Input/DateTimePicker.cs
index e2d3082c..51ab33e3 100644
--- a/src/Shared/HandyControl_Shared/Controls/Input/DateTimePicker.cs
+++ b/src/Shared/HandyControl_Shared/Controls/Input/DateTimePicker.cs
@@ -357,11 +357,6 @@ public class DateTimePicker : Control, IDataInput
_popup.Closed += PopupClosed;
_popup.Child = _calendarWithClock;
- if (IsDropDownOpen)
- {
- _popup.IsOpen = true;
- }
-
_dropDownButton.Click += DropDownButton_Click;
_dropDownButton.MouseLeave += DropDownButton_MouseLeave;
diff --git a/src/Shared/HandyControl_Shared/Controls/Input/TimePicker.cs b/src/Shared/HandyControl_Shared/Controls/Input/TimePicker.cs
index 638f9a91..a5907f33 100644
--- a/src/Shared/HandyControl_Shared/Controls/Input/TimePicker.cs
+++ b/src/Shared/HandyControl_Shared/Controls/Input/TimePicker.cs
@@ -79,7 +79,6 @@ public class TimePicker : Control, IDataInput
public TimePicker()
{
- Clock = new Clock();
CommandBindings.Add(new CommandBinding(ControlCommands.Clear, (s, e) =>
{
SetCurrentValue(SelectedTimeProperty, null);
@@ -142,13 +141,12 @@ public class TimePicker : Control, IDataInput
typeof(TimePicker),
new FrameworkPropertyMetadata(ValueBoxes.FalseBox, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, OnIsDropDownOpenChanged, OnCoerceIsDropDownOpen));
- private static object OnCoerceIsDropDownOpen(DependencyObject d, object baseValue) =>
- d is TimePicker
- {
- IsEnabled: false
- }
+ private static object OnCoerceIsDropDownOpen(DependencyObject d, object baseValue)
+ {
+ return d is TimePicker { IsEnabled: false }
? false
: baseValue;
+ }
private static void OnIsDropDownOpenChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
@@ -351,6 +349,7 @@ public class TimePicker : Control, IDataInput
{
oldClock.SelectedTimeChanged -= ctl.Clock_SelectedTimeChanged;
oldClock.Confirmed -= ctl.Clock_Confirmed;
+ ctl.SetPopupChild(null);
}
if (e.NewValue is ClockBase newClock)
@@ -358,6 +357,7 @@ public class TimePicker : Control, IDataInput
newClock.ShowConfirmButton = true;
newClock.SelectedTimeChanged += ctl.Clock_SelectedTimeChanged;
newClock.Confirmed += ctl.Clock_Confirmed;
+ ctl.SetPopupChild(newClock);
}
}
@@ -454,11 +454,6 @@ public class TimePicker : Control, IDataInput
_popup.Closed += PopupClosed;
_popup.Child = Clock;
- if (IsDropDownOpen)
- {
- _popup.IsOpen = true;
- }
-
_dropDownButton.Click += DropDownButton_Click;
_dropDownButton.MouseLeave += DropDownButton_MouseLeave;
@@ -496,6 +491,8 @@ public class TimePicker : Control, IDataInput
}
}
+ EnsureClock();
+
if (selectedTime is null)
{
_originalSelectedTime ??= DateTime.Now;
@@ -517,12 +514,14 @@ public class TimePicker : Control, IDataInput
{
var handler = ClockClosed;
handler?.Invoke(this, e);
+ Clock?.OnClockClosed();
}
protected virtual void OnClockOpened(RoutedEventArgs e)
{
var handler = ClockOpened;
handler?.Invoke(this, e);
+ Clock?.OnClockOpened();
}
#endregion Protected Methods
@@ -792,5 +791,24 @@ public class TimePicker : Control, IDataInput
}
}
+ private void EnsureClock()
+ {
+ if (Clock is not null)
+ {
+ return;
+ }
+
+ SetCurrentValue(ClockProperty, new Clock());
+ SetPopupChild(Clock);
+ }
+
+ private void SetPopupChild(UIElement element)
+ {
+ if (_popup is not null)
+ {
+ _popup.Child = Clock;
+ }
+ }
+
#endregion Private Methods
}
diff --git a/src/Shared/HandyControl_Shared/Controls/Time/Clock/ClockBase.cs b/src/Shared/HandyControl_Shared/Controls/Time/Clock/ClockBase.cs
index 43f16886..08ecf4c1 100644
--- a/src/Shared/HandyControl_Shared/Controls/Time/Clock/ClockBase.cs
+++ b/src/Shared/HandyControl_Shared/Controls/Time/Clock/ClockBase.cs
@@ -102,4 +102,12 @@ public abstract class ClockBase : Control
internal abstract void Update(DateTime time);
protected void Clock_SelectedTimeChanged(object sender, FunctionEventArgs e) => SelectedTime = e.Info;
+
+ public virtual void OnClockClosed()
+ {
+ }
+
+ public virtual void OnClockOpened()
+ {
+ }
}
diff --git a/src/Shared/HandyControl_Shared/Controls/Time/Clock/ListClock.cs b/src/Shared/HandyControl_Shared/Controls/Time/Clock/ListClock.cs
index c08a8deb..0cde49a3 100644
--- a/src/Shared/HandyControl_Shared/Controls/Time/Clock/ListClock.cs
+++ b/src/Shared/HandyControl_Shared/Controls/Time/Clock/ListClock.cs
@@ -29,6 +29,8 @@ public class ListClock : ClockBase
#endregion Data
+ public override void OnClockOpened() => ScrollIntoView();
+
public override void OnApplyTemplate()
{
AppliedTemplate = false;
@@ -94,6 +96,27 @@ public class ListClock : ClockBase
}
}
+ ///
+ /// 更新
+ ///
+ ///
+ internal override void Update(DateTime time)
+ {
+ if (!AppliedTemplate) return;
+
+ var h = time.Hour;
+ var m = time.Minute;
+ var s = time.Second;
+
+ _hourList.SelectedIndex = h;
+ _minuteList.SelectedIndex = m;
+ _secondList.SelectedIndex = s;
+
+ ScrollIntoView();
+
+ DisplayTime = time;
+ }
+
private void HourList_SelectionChanged(object sender, SelectionChangedEventArgs e) => Update();
private void MinuteList_SelectionChanged(object sender, SelectionChangedEventArgs e) => Update();
@@ -124,26 +147,10 @@ public class ListClock : ClockBase
}
}
- ///
- /// 更新
- ///
- ///
- internal override void Update(DateTime time)
+ private void ScrollIntoView()
{
- if (!AppliedTemplate) return;
-
- var h = time.Hour;
- var m = time.Minute;
- var s = time.Second;
-
- _hourList.SelectedIndex = h;
- _minuteList.SelectedIndex = m;
- _secondList.SelectedIndex = s;
-
_hourList.ScrollIntoView(_hourList.SelectedItem);
_minuteList.ScrollIntoView(_minuteList.SelectedItem);
_secondList.ScrollIntoView(_secondList.SelectedItem);
-
- DisplayTime = time;
}
}
diff --git a/src/Shared/HandyControl_Shared/Themes/Styles/Clock.xaml b/src/Shared/HandyControl_Shared/Themes/Styles/Clock.xaml
index bb5732e6..28d70e11 100644
--- a/src/Shared/HandyControl_Shared/Themes/Styles/Clock.xaml
+++ b/src/Shared/HandyControl_Shared/Themes/Styles/Clock.xaml
@@ -157,9 +157,9 @@
-
-
-
+
+
+
diff --git a/src/Shared/HandyControl_Shared/Themes/Theme.xaml b/src/Shared/HandyControl_Shared/Themes/Theme.xaml
index 78ad4ac4..fe60ec51 100644
--- a/src/Shared/HandyControl_Shared/Themes/Theme.xaml
+++ b/src/Shared/HandyControl_Shared/Themes/Theme.xaml
@@ -12850,9 +12850,9 @@
-
-
-
+
+
+