diff --git a/src/Shared/HandyControlDemo_Shared/UserControl/Controls/TimePickerDemoCtl.xaml b/src/Shared/HandyControlDemo_Shared/UserControl/Controls/TimePickerDemoCtl.xaml
index 840acbb5..0c4355c8 100644
--- a/src/Shared/HandyControlDemo_Shared/UserControl/Controls/TimePickerDemoCtl.xaml
+++ b/src/Shared/HandyControlDemo_Shared/UserControl/Controls/TimePickerDemoCtl.xaml
@@ -17,7 +17,11 @@
-
+
+
+
+
+
diff --git a/src/Shared/HandyControl_Shared/Controls/Input/DateTimePicker.cs b/src/Shared/HandyControl_Shared/Controls/Input/DateTimePicker.cs
index c32c83ec..c76112b6 100644
--- a/src/Shared/HandyControl_Shared/Controls/Input/DateTimePicker.cs
+++ b/src/Shared/HandyControl_Shared/Controls/Input/DateTimePicker.cs
@@ -99,15 +99,6 @@ namespace HandyControl.Controls
set => SetValue(DateTimeFormatProperty, value);
}
- public static readonly DependencyProperty ClockStyleProperty = DependencyProperty.Register(
- "ClockStyle", typeof(Style), typeof(DateTimePicker), new PropertyMetadata(default(Style)));
-
- public Style ClockStyle
- {
- get => (Style) GetValue(ClockStyleProperty);
- set => SetValue(ClockStyleProperty, value);
- }
-
public static readonly DependencyProperty CalendarStyleProperty = DependencyProperty.Register(
"CalendarStyle", typeof(Style), typeof(DateTimePicker), new PropertyMetadata(default(Style)));
diff --git a/src/Shared/HandyControl_Shared/Controls/Input/TimePicker.cs b/src/Shared/HandyControl_Shared/Controls/Input/TimePicker.cs
index 25d005de..021d7f7a 100644
--- a/src/Shared/HandyControl_Shared/Controls/Input/TimePicker.cs
+++ b/src/Shared/HandyControl_Shared/Controls/Input/TimePicker.cs
@@ -34,8 +34,6 @@ namespace HandyControl.Controls
#region Data
- private Clock _clock;
-
private string _defaultText;
private ButtonBase _dropDownButton;
@@ -79,7 +77,7 @@ namespace HandyControl.Controls
public TimePicker()
{
- InitClock();
+ Clock = new Clock();
CommandBindings.Add(new CommandBinding(ControlCommands.Clear, (s, e) =>
{
ClearValue(SelectedTimeProperty);
@@ -103,18 +101,6 @@ namespace HandyControl.Controls
#endregion TimeFormat
- #region ClockStyle
-
- public Style ClockStyle
- {
- get => (Style)GetValue(ClockStyleProperty);
- set => SetValue(ClockStyleProperty, value);
- }
-
- public static readonly DependencyProperty ClockStyleProperty = DependencyProperty.Register("ClockStyle", typeof(Style), typeof(TimePicker));
-
- #endregion CalendarStyle
-
#region DisplayTime
public DateTime DisplayTime
@@ -133,8 +119,8 @@ namespace HandyControl.Controls
private static object CoerceDisplayTime(DependencyObject d, object value)
{
var dp = (TimePicker)d;
- dp._clock.DisplayTime = (DateTime)value;
- return dp._clock.DisplayTime;
+ dp.Clock.DisplayTime = (DateTime)value;
+ return dp.Clock.DisplayTime;
}
#endregion DisplayTime
@@ -170,7 +156,7 @@ namespace HandyControl.Controls
dp.Dispatcher.BeginInvoke(DispatcherPriority.Input, (Action)delegate
{
- dp._clock.Focus();
+ dp.Clock.Focus();
});
}
}
@@ -212,8 +198,8 @@ namespace HandyControl.Controls
private static object CoerceSelectedTime(DependencyObject d, object value)
{
var dp = (TimePicker)d;
- dp._clock.SelectedTime = (DateTime?)value;
- return dp._clock.SelectedTime;
+ dp.Clock.SelectedTime = (DateTime?)value;
+ return dp.Clock.SelectedTime;
}
#endregion SelectedDate
@@ -306,6 +292,35 @@ namespace HandyControl.Controls
set => SetValue(ShowClearButtonProperty, value);
}
+ public static readonly DependencyProperty ClockProperty = DependencyProperty.Register(
+ "Clock", typeof(ClockBase), typeof(TimePicker), new FrameworkPropertyMetadata(default(Clock), FrameworkPropertyMetadataOptions.NotDataBindable, OnClockChanged));
+
+ private static void OnClockChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
+ {
+ var ctl = (TimePicker) d;
+ var oldClock = e.OldValue as ClockBase;
+ var newClock = e.NewValue as ClockBase;
+
+ if (oldClock != null)
+ {
+ oldClock.SelectedTimeChanged -= ctl.Clock_SelectedTimeChanged;
+ oldClock.Confirmed -= ctl.Clock_Confirmed;
+ }
+
+ if (newClock != null)
+ {
+ newClock.ShowConfirmButton = true;
+ newClock.SelectedTimeChanged += ctl.Clock_SelectedTimeChanged;
+ newClock.Confirmed += ctl.Clock_Confirmed;
+ }
+ }
+
+ public ClockBase Clock
+ {
+ get => (ClockBase) GetValue(ClockProperty);
+ set => SetValue(ClockProperty, value);
+ }
+
#endregion Public Properties
#region Public Methods
@@ -374,7 +389,7 @@ namespace HandyControl.Controls
_popUp.PreviewMouseLeftButtonDown += PopUp_PreviewMouseLeftButtonDown;
_popUp.Opened += PopUp_Opened;
_popUp.Closed += PopUp_Closed;
- _popUp.Child = _clock;
+ _popUp.Child = Clock;
if (IsDropDownOpen)
{
@@ -439,20 +454,7 @@ namespace HandyControl.Controls
throw new Exception();
}
- private void InitClock()
- {
- _clock = new Clock
- {
- ShowConfirmButton = true
- };
- _clock.SelectedTimeChanged += Clock_SelectedTimeChanged;
- _clock.Confirmed += Clock_Confirmed;
- }
-
- private void TextBox_LostFocus(object sender, RoutedEventArgs e)
- {
- SetSelectedTime();
- }
+ private void TextBox_LostFocus(object sender, RoutedEventArgs e) => SetSelectedTime();
private void SetIsHandlerSuspended(DependencyProperty property, bool value)
{
@@ -560,7 +562,7 @@ namespace HandyControl.Controls
SetCurrentValue(IsDropDownOpenProperty, ValueBoxes.TrueBox);
}
- _clock?.MoveFocus(new TraversalRequest(FocusNavigationDirection.First));
+ Clock?.MoveFocus(new TraversalRequest(FocusNavigationDirection.First));
OnClockOpened(new RoutedEventArgs());
}
@@ -572,7 +574,7 @@ namespace HandyControl.Controls
SetCurrentValue(IsDropDownOpenProperty, ValueBoxes.FalseBox);
}
- if (_clock.IsKeyboardFocusWithin)
+ if (Clock.IsKeyboardFocusWithin)
{
MoveFocus(new TraversalRequest(FocusNavigationDirection.First));
}
diff --git a/src/Shared/HandyControl_Shared/Controls/Other/ScrollViewer.cs b/src/Shared/HandyControl_Shared/Controls/Other/ScrollViewer.cs
index a6734670..764f4c3e 100644
--- a/src/Shared/HandyControl_Shared/Controls/Other/ScrollViewer.cs
+++ b/src/Shared/HandyControl_Shared/Controls/Other/ScrollViewer.cs
@@ -192,7 +192,7 @@ namespace HandyControl.Controls
///
/// 当前垂直滚动偏移
///
- private static readonly DependencyProperty CurrentVerticalOffsetProperty = DependencyProperty.Register(
+ internal static readonly DependencyProperty CurrentVerticalOffsetProperty = DependencyProperty.Register(
"CurrentVerticalOffset", typeof(double), typeof(ScrollViewer), new PropertyMetadata(ValueBoxes.Double0Box, OnCurrentVerticalOffsetChanged));
private static void OnCurrentVerticalOffsetChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
@@ -206,7 +206,7 @@ namespace HandyControl.Controls
///
/// 当前垂直滚动偏移
///
- private double CurrentVerticalOffset
+ internal double CurrentVerticalOffset
{
// ReSharper disable once UnusedMember.Local
get => (double) GetValue(CurrentVerticalOffsetProperty);
@@ -216,7 +216,7 @@ namespace HandyControl.Controls
///
/// 当前水平滚动偏移
///
- public static readonly DependencyProperty CurrentHorizontalOffsetProperty = DependencyProperty.Register(
+ internal static readonly DependencyProperty CurrentHorizontalOffsetProperty = DependencyProperty.Register(
"CurrentHorizontalOffset", typeof(double), typeof(ScrollViewer), new PropertyMetadata(ValueBoxes.Double0Box, OnCurrentHorizontalOffsetChanged));
private static void OnCurrentHorizontalOffsetChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
@@ -230,7 +230,7 @@ namespace HandyControl.Controls
///
/// 当前水平滚动偏移
///
- public double CurrentHorizontalOffset
+ internal double CurrentHorizontalOffset
{
get => (double) GetValue(CurrentHorizontalOffsetProperty);
set => SetValue(CurrentHorizontalOffsetProperty, value);
diff --git a/src/Shared/HandyControl_Shared/Controls/Time/Clock/Clock.cs b/src/Shared/HandyControl_Shared/Controls/Time/Clock/Clock.cs
index ca43b8da..7c0dead1 100644
--- a/src/Shared/HandyControl_Shared/Controls/Time/Clock/Clock.cs
+++ b/src/Shared/HandyControl_Shared/Controls/Time/Clock/Clock.cs
@@ -6,26 +6,23 @@ using System.Windows.Controls.Primitives;
using System.Windows.Data;
using System.Windows.Input;
using System.Windows.Media;
-using HandyControl.Data;
using HandyControl.Tools;
namespace HandyControl.Controls
{
[TemplatePart(Name = ElementButtonAm, Type = typeof(RadioButton))]
[TemplatePart(Name = ElementButtonPm, Type = typeof(RadioButton))]
- [TemplatePart(Name = ElementButtonConfirm, Type = typeof(Button))]
[TemplatePart(Name = ElementCanvas, Type = typeof(Canvas))]
[TemplatePart(Name = ElementBorderTitle, Type = typeof(Border))]
[TemplatePart(Name = ElementBorderClock, Type = typeof(Border))]
[TemplatePart(Name = ElementPanelNum, Type = typeof(CirclePanel))]
[TemplatePart(Name = ElementTimeStr, Type = typeof(TextBlock))]
- public class Clock : Control
+ public class Clock : ClockBase
{
#region Constants
private const string ElementButtonAm = "PART_ButtonAm";
private const string ElementButtonPm = "PART_ButtonPm";
- private const string ElementButtonConfirm = "PART_ButtonConfirm";
private const string ElementCanvas = "PART_Canvas";
private const string ElementBorderTitle = "PART_BorderTitle";
private const string ElementBorderClock = "PART_BorderClock";
@@ -40,8 +37,6 @@ namespace HandyControl.Controls
private RadioButton _buttonPm;
- private Button _buttonConfirm;
-
private Canvas _canvas;
private Border _borderTitle;
@@ -60,59 +55,10 @@ namespace HandyControl.Controls
private int _secValue;
- private bool _appliedTemplate;
-
#endregion Data
- #region Public Events
-
- public static readonly RoutedEvent SelectedTimeChangedEvent =
- EventManager.RegisterRoutedEvent("SelectedTimeChanged", RoutingStrategy.Direct,
- typeof(EventHandler>), typeof(Clock));
-
- public event EventHandler> SelectedTimeChanged
- {
- add => AddHandler(SelectedTimeChangedEvent, value);
- remove => RemoveHandler(SelectedTimeChangedEvent, value);
- }
-
- public event EventHandler> DisplayTimeChanged;
-
- public event Action Confirmed;
-
- #endregion Public Events
-
#region Public Properties
- public static readonly DependencyProperty SelectedTimeProperty = DependencyProperty.Register(
- "SelectedTime", typeof(DateTime?), typeof(Clock), new PropertyMetadata(default(DateTime?), OnSelectedTimeChanged));
-
- private static void OnSelectedTimeChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
- {
- var ctl = (Clock)d;
- var v = (DateTime?)e.NewValue;
- ctl.DisplayTime = v ?? DateTime.Now;
- ctl.OnSelectedTimeChanged(new FunctionEventArgs(SelectedTimeChangedEvent, ctl)
- {
- Info = v
- });
- }
-
- public DateTime? SelectedTime
- {
- get => (DateTime?) GetValue(SelectedTimeProperty);
- set => SetValue(SelectedTimeProperty, value);
- }
-
- public static readonly DependencyProperty TimeFormatProperty = DependencyProperty.Register(
- "TimeFormat", typeof(string), typeof(Clock), new PropertyMetadata("HH:mm:ss"));
-
- public string TimeFormat
- {
- get => (string) GetValue(TimeFormatProperty);
- set => SetValue(TimeFormatProperty, value);
- }
-
public static readonly DependencyProperty ClockRadioButtonStyleProperty = DependencyProperty.Register(
"ClockRadioButtonStyle", typeof(Style), typeof(Clock), new PropertyMetadata(default(Style)));
@@ -122,32 +68,6 @@ namespace HandyControl.Controls
set => SetValue(ClockRadioButtonStyleProperty, value);
}
- public static readonly DependencyProperty DisplayTimeProperty = DependencyProperty.Register(
- "DisplayTime", typeof(DateTime), typeof(Clock), new FrameworkPropertyMetadata(DateTime.Now, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, OnDisplayTimeChanged));
-
- private static void OnDisplayTimeChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
- {
- var ctl = (Clock) d;
- var v = (DateTime) e.NewValue;
- ctl.Update(v);
- ctl.OnDisplayTimeChanged(new FunctionEventArgs(v));
- }
-
- public DateTime DisplayTime
- {
- get => (DateTime) GetValue(DisplayTimeProperty);
- set => SetValue(DisplayTimeProperty, value);
- }
-
- internal static readonly DependencyProperty ShowConfirmButtonProperty = DependencyProperty.Register(
- "ShowConfirmButton", typeof(bool), typeof(Clock), new PropertyMetadata(ValueBoxes.FalseBox));
-
- internal bool ShowConfirmButton
- {
- get => (bool)GetValue(ShowConfirmButtonProperty);
- set => SetValue(ShowConfirmButtonProperty, value);
- }
-
private int SecValue
{
get => _secValue;
@@ -174,7 +94,7 @@ namespace HandyControl.Controls
public override void OnApplyTemplate()
{
- _appliedTemplate = false;
+ AppliedTemplate = false;
if (_buttonAm != null)
{
_buttonAm.Click -= ButtonAm_OnClick;
@@ -185,9 +105,9 @@ namespace HandyControl.Controls
_buttonPm.Click -= ButtonPm_OnClick;
}
- if (_buttonConfirm != null)
+ if (ButtonConfirm != null)
{
- _buttonConfirm.Click -= ButtonConfirm_OnClick;
+ ButtonConfirm.Click -= ButtonConfirm_OnClick;
}
if (_borderTitle != null)
@@ -206,18 +126,18 @@ namespace HandyControl.Controls
_buttonAm = GetTemplateChild(ElementButtonAm) as RadioButton;
_buttonPm = GetTemplateChild(ElementButtonPm) as RadioButton;
- _buttonConfirm = GetTemplateChild(ElementButtonConfirm) as Button;
+ ButtonConfirm = GetTemplateChild(ElementButtonConfirm) as Button;
_borderTitle = GetTemplateChild(ElementBorderTitle) as Border;
_canvas = GetTemplateChild(ElementCanvas) as Canvas;
_borderClock = GetTemplateChild(ElementBorderClock) as Border;
_circlePanel = GetTemplateChild(ElementPanelNum) as CirclePanel;
_blockTime = GetTemplateChild(ElementTimeStr) as TextBlock;
- CheckNull();
+ if (!CheckNull()) return;
_buttonAm.Click += ButtonAm_OnClick;
_buttonPm.Click += ButtonPm_OnClick;
- _buttonConfirm.Click += ButtonConfirm_OnClick;
+ ButtonConfirm.Click += ButtonConfirm_OnClick;
_borderTitle.MouseWheel += BorderTitle_OnMouseWheel;
_canvas.MouseWheel += Canvas_OnMouseWheel;
@@ -241,7 +161,7 @@ namespace HandyControl.Controls
_circlePanel.Children.Add(button);
}
- _appliedTemplate = true;
+ AppliedTemplate = true;
if (SelectedTime.HasValue)
{
Update(SelectedTime.Value);
@@ -255,26 +175,15 @@ namespace HandyControl.Controls
#endregion Public Methods
- #region Protected Methods
-
- protected virtual void OnSelectedTimeChanged(FunctionEventArgs e) => RaiseEvent(e);
-
- protected virtual void OnDisplayTimeChanged(FunctionEventArgs e)
- {
- var handler = DisplayTimeChanged;
- handler?.Invoke(this, e);
- }
-
- #endregion Protected Methods
-
#region Private Methods
- private void CheckNull()
+ private bool CheckNull()
{
-
- if (_buttonPm == null || _buttonAm == null || _buttonConfirm == null || _canvas == null ||
+ if (_buttonPm == null || _buttonAm == null || ButtonConfirm == null || _canvas == null ||
_borderTitle == null || _borderClock == null || _circlePanel == null ||
- _blockTime == null) throw new Exception();
+ _blockTime == null) return false;
+
+ return true;
}
private void BorderTitle_OnMouseWheel(object sender, MouseWheelEventArgs e)
@@ -339,7 +248,7 @@ namespace HandyControl.Controls
private void Update()
{
- if (!_appliedTemplate) return;
+ if (!AppliedTemplate) return;
var hValue = _currentButton.Num;
if (_buttonPm.IsChecked == true)
{
@@ -367,9 +276,9 @@ namespace HandyControl.Controls
/// 更新
///
///
- internal void Update(DateTime time)
+ internal override void Update(DateTime time)
{
- if (!_appliedTemplate) return;
+ if (!AppliedTemplate) return;
var h = time.Hour;
var m = time.Minute;
@@ -396,12 +305,6 @@ namespace HandyControl.Controls
Update();
}
- private void ButtonConfirm_OnClick(object sender, RoutedEventArgs e)
- {
- SelectedTime = DisplayTime;
- Confirmed?.Invoke();
- }
-
///
/// 获取显示时间
///
diff --git a/src/Shared/HandyControl_Shared/Controls/Time/Clock/ClockBase.cs b/src/Shared/HandyControl_Shared/Controls/Time/Clock/ClockBase.cs
new file mode 100644
index 00000000..c2ef4420
--- /dev/null
+++ b/src/Shared/HandyControl_Shared/Controls/Time/Clock/ClockBase.cs
@@ -0,0 +1,106 @@
+using System;
+using System.Windows;
+using System.Windows.Controls;
+using HandyControl.Data;
+
+namespace HandyControl.Controls
+{
+ [TemplatePart(Name = ElementButtonConfirm, Type = typeof(Button))]
+ public abstract class ClockBase : Control
+ {
+ protected const string ElementButtonConfirm = "PART_ButtonConfirm";
+
+ protected Button ButtonConfirm;
+
+ protected bool AppliedTemplate;
+
+ public event Action Confirmed;
+
+ public event EventHandler> DisplayTimeChanged;
+
+ public static readonly RoutedEvent SelectedTimeChangedEvent =
+ EventManager.RegisterRoutedEvent("SelectedTimeChanged", RoutingStrategy.Direct,
+ typeof(EventHandler>), typeof(ClockBase));
+
+ public event EventHandler> SelectedTimeChanged
+ {
+ add => AddHandler(SelectedTimeChangedEvent, value);
+ remove => RemoveHandler(SelectedTimeChangedEvent, value);
+ }
+
+ public static readonly DependencyProperty TimeFormatProperty = DependencyProperty.Register(
+ "TimeFormat", typeof(string), typeof(ClockBase), new PropertyMetadata("HH:mm:ss"));
+
+ public string TimeFormat
+ {
+ get => (string)GetValue(TimeFormatProperty);
+ set => SetValue(TimeFormatProperty, value);
+ }
+
+ public static readonly DependencyProperty SelectedTimeProperty = DependencyProperty.Register(
+ "SelectedTime", typeof(DateTime?), typeof(ClockBase), new PropertyMetadata(default(DateTime?), OnSelectedTimeChanged));
+
+ private static void OnSelectedTimeChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
+ {
+ var ctl = (ClockBase)d;
+ var v = (DateTime?)e.NewValue;
+ ctl.DisplayTime = v ?? DateTime.Now;
+ ctl.OnSelectedTimeChanged(new FunctionEventArgs(SelectedTimeChangedEvent, ctl)
+ {
+ Info = v
+ });
+ }
+
+ public DateTime? SelectedTime
+ {
+ get => (DateTime?) GetValue(SelectedTimeProperty);
+ set => SetValue(SelectedTimeProperty, value);
+ }
+
+ public static readonly DependencyProperty DisplayTimeProperty = DependencyProperty.Register(
+ "DisplayTime", typeof(DateTime), typeof(ClockBase),
+ new FrameworkPropertyMetadata(DateTime.Now, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault,
+ OnDisplayTimeChanged));
+
+ private static void OnDisplayTimeChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
+ {
+ var ctl = (ClockBase)d;
+ var v = (DateTime)e.NewValue;
+ ctl.Update(v);
+ ctl.OnDisplayTimeChanged(new FunctionEventArgs(v));
+ }
+
+ public DateTime DisplayTime
+ {
+ get => (DateTime)GetValue(DisplayTimeProperty);
+ set => SetValue(DisplayTimeProperty, value);
+ }
+
+ internal static readonly DependencyProperty ShowConfirmButtonProperty = DependencyProperty.Register(
+ "ShowConfirmButton", typeof(bool), typeof(ClockBase), new PropertyMetadata(ValueBoxes.FalseBox));
+
+ internal bool ShowConfirmButton
+ {
+ get => (bool) GetValue(ShowConfirmButtonProperty);
+ set => SetValue(ShowConfirmButtonProperty, value);
+ }
+
+ protected virtual void OnSelectedTimeChanged(FunctionEventArgs e) => RaiseEvent(e);
+
+ protected virtual void OnDisplayTimeChanged(FunctionEventArgs e)
+ {
+ var handler = DisplayTimeChanged;
+ handler?.Invoke(this, e);
+ }
+
+ protected void ButtonConfirm_OnClick(object sender, RoutedEventArgs e)
+ {
+ SelectedTime = DisplayTime;
+ Confirmed?.Invoke();
+ }
+
+ internal abstract void Update(DateTime time);
+
+ protected void Clock_SelectedTimeChanged(object sender, FunctionEventArgs e) => SelectedTime = e.Info;
+ }
+}
\ No newline at end of file
diff --git a/src/Shared/HandyControl_Shared/Controls/Time/Clock/ListClock.cs b/src/Shared/HandyControl_Shared/Controls/Time/Clock/ListClock.cs
new file mode 100644
index 00000000..80376a1d
--- /dev/null
+++ b/src/Shared/HandyControl_Shared/Controls/Time/Clock/ListClock.cs
@@ -0,0 +1,148 @@
+using System;
+using System.Collections.Generic;
+using System.Windows;
+using System.Windows.Controls;
+
+namespace HandyControl.Controls
+{
+ [TemplatePart(Name = ElementHourList, Type = typeof(ListBox))]
+ [TemplatePart(Name = ElementMinuteList, Type = typeof(ListBox))]
+ [TemplatePart(Name = ElementSecondList, Type = typeof(ListBox))]
+ public class ListClock : ClockBase
+ {
+ #region Constants
+
+ private const string ElementHourList = "PART_HourList";
+ private const string ElementMinuteList = "PART_MinuteList";
+ private const string ElementSecondList = "PART_SecondList";
+
+ #endregion Constants
+
+ #region Data
+
+ private ListBox _hourList;
+
+ private ListBox _minuteList;
+
+ private ListBox _secondList;
+
+ #endregion Data
+
+ public override void OnApplyTemplate()
+ {
+ AppliedTemplate = false;
+ if (ButtonConfirm != null)
+ {
+ ButtonConfirm.Click -= ButtonConfirm_OnClick;
+ }
+
+ if (_hourList != null)
+ {
+ _hourList.SelectionChanged -= HourList_SelectionChanged;
+ }
+
+ if (_minuteList != null)
+ {
+ _minuteList.SelectionChanged -= MinuteList_SelectionChanged;
+ }
+
+ if (_secondList != null)
+ {
+ _secondList.SelectionChanged -= SecondList_SelectionChanged;
+ }
+
+ base.OnApplyTemplate();
+
+ _hourList = GetTemplateChild(ElementHourList) as ListBox;
+ if (_hourList != null)
+ {
+ CreateItemsSource(_hourList, 24);
+ _hourList.SelectionChanged += HourList_SelectionChanged;
+ }
+
+ _minuteList = GetTemplateChild(ElementMinuteList) as ListBox;
+ if (_minuteList != null)
+ {
+ CreateItemsSource(_minuteList, 60);
+ _minuteList.SelectionChanged += MinuteList_SelectionChanged;
+ }
+
+ _secondList = GetTemplateChild(ElementSecondList) as ListBox;
+ if (_secondList != null)
+ {
+ CreateItemsSource(_secondList, 60);
+ _secondList.SelectionChanged += SecondList_SelectionChanged;
+ }
+
+ ButtonConfirm = GetTemplateChild(ElementButtonConfirm) as Button;
+
+ if (ButtonConfirm != null)
+ {
+ ButtonConfirm.Click += ButtonConfirm_OnClick;
+ }
+
+ AppliedTemplate = true;
+ if (SelectedTime.HasValue)
+ {
+ Update(SelectedTime.Value);
+ }
+ else
+ {
+ DisplayTime = DateTime.Now;
+ Update(DisplayTime);
+ }
+ }
+
+ private void HourList_SelectionChanged(object sender, SelectionChangedEventArgs e) => Update();
+
+ private void MinuteList_SelectionChanged(object sender, SelectionChangedEventArgs e) => Update();
+
+ private void SecondList_SelectionChanged(object sender, SelectionChangedEventArgs e) => Update();
+
+ private void CreateItemsSource(ItemsControl selector, int count)
+ {
+ var list = new List();
+ for (int i = 0; i < count; i++)
+ {
+ list.Add(i.ToString("#00"));
+ }
+
+ selector.ItemsSource = list;
+ }
+
+ private void Update()
+ {
+ if (_hourList.SelectedIndex >= 0 && _hourList.SelectedIndex < 24 &&
+ _minuteList.SelectedIndex >= 0 && _minuteList.SelectedIndex < 60 &&
+ _secondList.SelectedIndex >= 0 && _secondList.SelectedIndex < 60)
+ {
+ var now = DateTime.Now;
+ DisplayTime = new DateTime(now.Year, now.Month, now.Day, _hourList.SelectedIndex,
+ _minuteList.SelectedIndex, _secondList.SelectedIndex);
+ }
+ }
+
+ ///
+ /// 更新
+ ///
+ ///
+ 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;
+
+ _hourList.ScrollIntoView(_hourList.SelectedItem);
+ _minuteList.ScrollIntoView(_minuteList.SelectedItem);
+ _secondList.ScrollIntoView(_secondList.SelectedItem);
+
+ DisplayTime = time;
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Shared/HandyControl_Shared/Data/Gif/GifImageInfo.cs b/src/Shared/HandyControl_Shared/Data/Gif/GifImageInfo.cs
index 6a786fec..2a1aedb3 100644
--- a/src/Shared/HandyControl_Shared/Data/Gif/GifImageInfo.cs
+++ b/src/Shared/HandyControl_Shared/Data/Gif/GifImageInfo.cs
@@ -1,5 +1,6 @@
using System;
using HandyControl.Controls;
+using HandyControl.Tools;
namespace HandyControl.Data
{
diff --git a/src/Shared/HandyControl_Shared/HandyControl_Shared.projitems b/src/Shared/HandyControl_Shared/HandyControl_Shared.projitems
index 7006f532..4a434741 100644
--- a/src/Shared/HandyControl_Shared/HandyControl_Shared.projitems
+++ b/src/Shared/HandyControl_Shared/HandyControl_Shared.projitems
@@ -95,7 +95,9 @@
+
+
diff --git a/src/Shared/HandyControl_Shared/Themes/Styles/Clock.xaml b/src/Shared/HandyControl_Shared/Themes/Styles/Clock.xaml
index 21f81b18..c2051afd 100644
--- a/src/Shared/HandyControl_Shared/Themes/Styles/Clock.xaml
+++ b/src/Shared/HandyControl_Shared/Themes/Styles/Clock.xaml
@@ -6,6 +6,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/Shared/HandyControl_Shared/Tools/GifImageAnimator.cs b/src/Shared/HandyControl_Shared/Tools/GifImageAnimator.cs
index 17e2219c..84586d8c 100644
--- a/src/Shared/HandyControl_Shared/Tools/GifImageAnimator.cs
+++ b/src/Shared/HandyControl_Shared/Tools/GifImageAnimator.cs
@@ -4,8 +4,9 @@ using System.Diagnostics.CodeAnalysis;
using System.Linq;
using System.Threading;
using HandyControl.Controls;
+using HandyControl.Data;
-namespace HandyControl.Data
+namespace HandyControl.Tools
{
internal class ImageAnimator
{