1
+ #region Info
2
+
3
+ // 2021/01/09 10:13
4
+ // BionicCode.Controls.Net.Core.Wpf
5
+
6
+ #endregion
7
+
8
+ using System . Windows ;
9
+ using System . Windows . Controls ;
10
+ using System . Windows . Markup ;
11
+ using System . Windows . Media ;
12
+ using System . Windows . Shapes ;
13
+
14
+ namespace BionicCode . Controls . Net . Core . Wpf
15
+ {
16
+ [ ContentProperty ( "AnalogClockFace" ) ]
17
+ public class AnalogTimePicker : Control
18
+ {
19
+ #region AnalogClockFace dependency property
20
+
21
+ public static readonly DependencyProperty AnalogClockFaceProperty = DependencyProperty . Register (
22
+ "AnalogClockFace" ,
23
+ typeof ( Canvas ) ,
24
+ typeof ( AnalogTimePicker ) ,
25
+ new PropertyMetadata ( default ( Canvas ) , OnAnalogClockFaceChanged ) ) ;
26
+
27
+ public AnalogClockFace AnalogClockFace { get => ( AnalogClockFace ) GetValue ( AnalogTimePicker . AnalogClockFaceProperty ) ; set => SetValue ( AnalogTimePicker . AnalogClockFaceProperty , value ) ; }
28
+
29
+ #endregion AnalogClockFace dependency property
30
+
31
+ #region AnalogClockFaceStyle dependency property
32
+
33
+ public static readonly DependencyProperty AnalogClockFaceStyleProperty = DependencyProperty . Register (
34
+ "AnalogClockFaceStyle" ,
35
+ typeof ( Style ) ,
36
+ typeof ( AnalogTimePicker ) ,
37
+ new PropertyMetadata ( default ) ) ;
38
+
39
+ public Style AnalogClockFaceStyle { get => ( Style ) GetValue ( AnalogTimePicker . AnalogClockFaceStyleProperty ) ; set => SetValue ( AnalogTimePicker . AnalogClockFaceStyleProperty , value ) ; }
40
+
41
+ #endregion AnalogClockFaceStyle dependency property
42
+
43
+ #region ClockDiameter dependency property
44
+
45
+ public static readonly DependencyProperty ClockDiameterProperty = DependencyProperty . Register (
46
+ "ClockDiameter" ,
47
+ typeof ( double ) ,
48
+ typeof ( AnalogTimePicker ) ,
49
+ new FrameworkPropertyMetadata ( default ( double ) , FrameworkPropertyMetadataOptions . AffectsMeasure | FrameworkPropertyMetadataOptions . AffectsArrange ) ) ;
50
+
51
+ public double ClockDiameter { get => ( double ) GetValue ( AnalogTimePicker . ClockDiameterProperty ) ; set => SetValue ( AnalogTimePicker . ClockDiameterProperty , value ) ; }
52
+
53
+ #endregion ClockDiameter dependency property
54
+ private bool IsClockPointerSelectionEnabled { get ; set ; }
55
+ private Line ClockSelectionPointer { get ; set ; }
56
+
57
+ static AnalogTimePicker ( )
58
+ {
59
+ FrameworkElement . DefaultStyleKeyProperty . OverrideMetadata ( typeof ( AnalogTimePicker ) , new FrameworkPropertyMetadata ( typeof ( AnalogTimePicker ) ) ) ;
60
+ }
61
+
62
+ public AnalogTimePicker ( )
63
+ {
64
+ //this.AnalogClockFace = new AnalogClockFace() {Background = Brushes.PaleVioletRed};
65
+ }
66
+
67
+ #region Overrides of AnalogClockFace
68
+
69
+ //protected virtual void OnClockFaceLoaded(object sender, RoutedEventArgs routedEventArgs)
70
+ //{
71
+ // double radius = this.ClockDiameter / 2;
72
+
73
+ // this.ClockSelectionPointer = new Line() { X1 = radius, Y1 = radius, X2 = radius, Y2 = 0, Stroke = Brushes.Orange, StrokeThickness = 2 };
74
+ // this.AnalogClockFace.AddElementToClockFace(this.ClockSelectionPointer, new Point());
75
+ // this.AnalogClockFace.AddElementToClockFace(new Line() { X1 = radius, Y1 = radius, X2 = 0, Y2 = radius, Stroke = Brushes.Orange, StrokeThickness = 2 }, new Point());
76
+ // //selectPointer.PreviewMouseLeftButtonDown += timePicker.OnSelectPointerLeftMouseButtonDown;
77
+ //}
78
+
79
+ #endregion
80
+
81
+ #region Overrides of Control
82
+
83
+ /// <inheritdoc />
84
+ protected override Size MeasureOverride ( Size constraint )
85
+ {
86
+ constraint = new Size ( this . ClockDiameter , this . ClockDiameter ) ;
87
+ this . AnalogClockFace . Diameter = this . ClockDiameter ;
88
+ //this.AnalogClockFace.Measure(constraint);
89
+ base . MeasureOverride ( constraint ) ;
90
+ return constraint ;
91
+ }
92
+
93
+ #endregion
94
+
95
+ private static void OnAnalogClockFaceChanged ( DependencyObject d , DependencyPropertyChangedEventArgs e )
96
+ {
97
+ ( d as AnalogTimePicker ) . OnAnalogClockFaceChanged ( ) ;
98
+ }
99
+
100
+ protected virtual void OnAnalogClockFaceChanged ( )
101
+ {
102
+ // this.AnalogClockFace.ClockFaceLoaded += OnClockFaceLoaded;
103
+ }
104
+
105
+ //private void OnSelectPointerLeftMouseButtonDown(object sender, MouseButtonEventArgs e)
106
+ //{
107
+ // this.IsClockPointerSelectionEnabled = true;
108
+ // //CaptureMouse();
109
+ //}
110
+
111
+ //#region Overrides of UIElement
112
+
113
+ ///// <inheritdoc />
114
+ //protected override void OnPreviewMouseMove(MouseEventArgs e)
115
+ //{
116
+ // base.OnPreviewMouseMove(e);
117
+ // if (!this.IsClockPointerSelectionEnabled)
118
+ // {
119
+ // return;
120
+ // }
121
+
122
+ // Point mousePosition = e.GetPosition(this.ClockPanel);
123
+ // var quadrant = mousePosition.X >= 200 && mousePosition.Y <= 200 ? 1 :
124
+ // mousePosition.X < 200 && mousePosition.Y <= 200 ? 2 :
125
+ // mousePosition.X < 200 && mousePosition.Y > 200 ? 3 : 4;
126
+ // bool isRightQuadrantActive = quadrant == 1 || quadrant == 4;
127
+ // bool isTopQuadrantActive = quadrant == 1 || quadrant == 2;
128
+ // var intervalPositions = this.ClockPanel.Children
129
+ // .Cast<UIElement>()
130
+ // .Where(element => !object.ReferenceEquals(element, this.ClockSelectionPointer))
131
+ // .Select(element => new Point(Canvas.GetLeft(element), Canvas.GetTop(element)))
132
+ // .Where(cartesianPoint => isRightQuadrantActive && isTopQuadrantActive
133
+ // ? cartesianPoint.X >= 200 && cartesianPoint.Y <= 200
134
+ // : isRightQuadrantActive
135
+ // ? cartesianPoint.X >= 200 && cartesianPoint.Y > 200 : isTopQuadrantActive ? cartesianPoint.X < 200 && cartesianPoint.Y <= 200 :
136
+ // cartesianPoint.X < 200 && cartesianPoint.Y > 200);
137
+ // Point closestIntervalPosition = intervalPositions.Aggregate(intervalPositions.First(), (closestIntervalPosition, intervalPosition) => Math.Abs(intervalPosition.X - mousePosition.X) < Math.Abs(closestIntervalPosition.X - mousePosition.X) && Math.Abs(intervalPosition.Y - mousePosition.Y) < Math.Abs(closestIntervalPosition.Y - mousePosition.Y) ? intervalPosition : closestIntervalPosition);
138
+
139
+ // this.ClockSelectionPointer.X2 = closestIntervalPosition.X;
140
+ // this.ClockSelectionPointer.Y2 = closestIntervalPosition.Y;
141
+ //}
142
+
143
+ ///// <inheritdoc />
144
+ //protected override void OnPreviewMouseLeftButtonUp(MouseButtonEventArgs e)
145
+ //{
146
+ // base.OnPreviewMouseLeftButtonUp(e);
147
+ // this.IsClockPointerSelectionEnabled = false;
148
+ // ReleaseMouseCapture();
149
+ //}
150
+
151
+ //#endregion
152
+ }
153
+ }
0 commit comments