ClockBase.cs 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. using System;
  2. using System.Windows;
  3. using System.Windows.Controls;
  4. using HandyControl.Data;
  5. namespace HandyControl.Controls;
  6. [TemplatePart(Name = ElementButtonConfirm, Type = typeof(Button))]
  7. public abstract class ClockBase : Control
  8. {
  9. protected const string ElementButtonConfirm = "PART_ButtonConfirm";
  10. protected Button ButtonConfirm;
  11. protected bool AppliedTemplate;
  12. public event Action Confirmed;
  13. public event EventHandler<FunctionEventArgs<DateTime>> DisplayTimeChanged;
  14. public static readonly RoutedEvent SelectedTimeChangedEvent =
  15. EventManager.RegisterRoutedEvent("SelectedTimeChanged", RoutingStrategy.Direct,
  16. typeof(EventHandler<FunctionEventArgs<DateTime?>>), typeof(ClockBase));
  17. public event EventHandler<FunctionEventArgs<DateTime?>> SelectedTimeChanged
  18. {
  19. add => AddHandler(SelectedTimeChangedEvent, value);
  20. remove => RemoveHandler(SelectedTimeChangedEvent, value);
  21. }
  22. public static readonly DependencyProperty TimeFormatProperty = DependencyProperty.Register(
  23. nameof(TimeFormat), typeof(string), typeof(ClockBase), new PropertyMetadata("HH:mm:ss"));
  24. public string TimeFormat
  25. {
  26. get => (string) GetValue(TimeFormatProperty);
  27. set => SetValue(TimeFormatProperty, value);
  28. }
  29. public static readonly DependencyProperty SelectedTimeProperty = DependencyProperty.Register(
  30. nameof(SelectedTime), typeof(DateTime?), typeof(ClockBase), new PropertyMetadata(default(DateTime?), OnSelectedTimeChanged));
  31. private static void OnSelectedTimeChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
  32. {
  33. var ctl = (ClockBase) d;
  34. var v = (DateTime?) e.NewValue;
  35. ctl.DisplayTime = v ?? DateTime.Now;
  36. ctl.OnSelectedTimeChanged(new FunctionEventArgs<DateTime?>(SelectedTimeChangedEvent, ctl)
  37. {
  38. Info = v
  39. });
  40. }
  41. public DateTime? SelectedTime
  42. {
  43. get => (DateTime?) GetValue(SelectedTimeProperty);
  44. set => SetValue(SelectedTimeProperty, value);
  45. }
  46. public static readonly DependencyProperty DisplayTimeProperty = DependencyProperty.Register(
  47. nameof(DisplayTime), typeof(DateTime), typeof(ClockBase),
  48. new FrameworkPropertyMetadata(DateTime.Now, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault,
  49. OnDisplayTimeChanged));
  50. private static void OnDisplayTimeChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
  51. {
  52. var ctl = (ClockBase) d;
  53. var v = (DateTime) e.NewValue;
  54. ctl.Update(v);
  55. ctl.OnDisplayTimeChanged(new FunctionEventArgs<DateTime>(v));
  56. }
  57. public DateTime DisplayTime
  58. {
  59. get => (DateTime) GetValue(DisplayTimeProperty);
  60. set => SetValue(DisplayTimeProperty, value);
  61. }
  62. internal static readonly DependencyProperty ShowConfirmButtonProperty = DependencyProperty.Register(
  63. nameof(ShowConfirmButton), typeof(bool), typeof(ClockBase), new PropertyMetadata(ValueBoxes.FalseBox));
  64. internal bool ShowConfirmButton
  65. {
  66. get => (bool) GetValue(ShowConfirmButtonProperty);
  67. set => SetValue(ShowConfirmButtonProperty, ValueBoxes.BooleanBox(value));
  68. }
  69. protected virtual void OnSelectedTimeChanged(FunctionEventArgs<DateTime?> e) => RaiseEvent(e);
  70. protected virtual void OnDisplayTimeChanged(FunctionEventArgs<DateTime> e)
  71. {
  72. var handler = DisplayTimeChanged;
  73. handler?.Invoke(this, e);
  74. }
  75. protected void ButtonConfirm_OnClick(object sender, RoutedEventArgs e)
  76. {
  77. SelectedTime = DisplayTime;
  78. Confirmed?.Invoke();
  79. }
  80. internal abstract void Update(DateTime time);
  81. protected void Clock_SelectedTimeChanged(object sender, FunctionEventArgs<DateTime?> e) => SelectedTime = e.Info;
  82. public virtual void OnClockClosed()
  83. {
  84. }
  85. public virtual void OnClockOpened()
  86. {
  87. }
  88. }