Skip to content

Commit 3e29bc6

Browse files
committed
Refactor Controls Part 1
1 parent 258c24c commit 3e29bc6

13 files changed

+247
-139
lines changed

src/Shared/HandyControl_Shared/Controls/Base/RegularItemsControl.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,10 @@
44
namespace HandyControl.Controls;
55

66
/// <summary>
7-
/// 规则ItemsControl
7+
/// Rule ItemsControl
88
/// </summary>
99
/// <remarks>
10-
/// 该类的每一项都具有相同的大小和外边距
10+
/// Each item in this category has the same size and margin
1111
/// </remarks>
1212
public class RegularItemsControl : SimpleItemsControl
1313
{

src/Shared/HandyControl_Shared/Controls/Base/SimpleItemsControl.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
namespace HandyControl.Controls;
1111

1212
/// <summary>
13-
/// ItemsControl的轻量级版本
13+
/// Lightweight version of ItemsControl
1414
/// </summary>
1515
[DefaultProperty("Items")]
1616
[ContentProperty("Items")]

src/Shared/HandyControl_Shared/Controls/ColorPicker/ColorDropper.cs

+78-29
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
using System;
22
using System.Windows;
3+
using System.Windows.Controls;
34
using System.Windows.Input;
45
using System.Windows.Media;
6+
using System.Windows.Shapes;
57
using HandyControl.Data;
68
using HandyControl.Tools;
79
using HandyControl.Tools.Interop;
@@ -12,63 +14,110 @@ internal class ColorDropper
1214
{
1315
private bool _cursorIsSetted;
1416

15-
private Cursor _dropperCursor;
16-
1717
private readonly ColorPicker _colorPicker;
1818

19+
Window window;
20+
Rectangle rect;
21+
TextBlock txtHex;
1922
public ColorDropper(ColorPicker colorPicker)
2023
{
2124
_colorPicker = colorPicker;
2225
}
2326

24-
public void Update(bool isShow)
27+
private void DrawPreviewWindow()
2528
{
26-
if (isShow)
29+
window = new Window
2730
{
28-
if (_dropperCursor == null)
29-
{
30-
var info = Application.GetResourceStream(new Uri("pack://application:,,,/HandyControl;Component/Resources/dropper.cur"));
31-
if (info != null)
32-
{
33-
_dropperCursor = new Cursor(info.Stream);
34-
}
35-
}
31+
ShowInTaskbar = false,
32+
Width = 100,
33+
Height = 125,
34+
ResizeMode = ResizeMode.NoResize,
35+
WindowStyle = WindowStyle.None,
36+
Background = Brushes.Transparent,
37+
AllowsTransparency = true,
38+
BorderThickness = new Thickness(0),
39+
Title = "XColorDropperWindowX"
40+
};
41+
Border border = new Border
42+
{
43+
BorderThickness = new Thickness(1),
44+
BorderBrush = ResourceHelper.GetResource<Brush>(ResourceToken.BorderBrush),
45+
Background = ResourceHelper.GetResource<Brush>(ResourceToken.SecondaryRegionBrush),
46+
CornerRadius = new CornerRadius(6)
47+
};
48+
49+
rect = new Rectangle
50+
{
51+
Margin = new Thickness(5),
52+
Stretch = Stretch.UniformToFill
53+
};
54+
55+
txtHex = new TextBlock()
56+
{
57+
Margin = new Thickness(0, 0, 0, 10),
58+
HorizontalAlignment = HorizontalAlignment.Center,
59+
VerticalAlignment = VerticalAlignment.Center,
60+
Foreground = ResourceHelper.GetResource<Brush>(ResourceToken.PrimaryTextBrush),
61+
FontSize = 14
62+
};
3663

37-
if (_dropperCursor == null) return;
64+
var panel = new StackPanel();
65+
panel.Children.Add(rect);
66+
panel.Children.Add(txtHex);
67+
border.Child = panel;
68+
window.Content = border;
69+
window.Show();
70+
}
3871

72+
public void Update(bool isShow)
73+
{
74+
if (isShow)
75+
{
76+
Mouse.OverrideCursor = Cursors.Cross;
3977
MouseHook.Start();
4078
MouseHook.StatusChanged += MouseHook_StatusChanged;
79+
DrawPreviewWindow();
80+
MoveWindowNextToMouse();
4181
}
4282
else
4383
{
4484
Mouse.OverrideCursor = Cursors.Arrow;
4585
MouseHook.Stop();
4686
MouseHook.StatusChanged -= MouseHook_StatusChanged;
87+
ColorPicker.IsCheckedToggleButtonDropper(false);
88+
window?.Close();
4789
}
4890
}
4991

50-
private void MouseHook_StatusChanged(object sender, MouseHookEventArgs e)
92+
private void MoveWindowNextToMouse()
5193
{
52-
var window = System.Windows.Window.GetWindow(_colorPicker);
53-
if (window == null)
54-
{
55-
UpdateCursor(false);
94+
string title;
95+
IntPtr handle;
5696

97+
InteropMethods.FindWindowTitleMatch(window.Title, out handle, out title);
98+
if (handle == IntPtr.Zero)
99+
{
57100
return;
58101
}
59102

60-
if (!_colorPicker.IsMouseOver && window.IsMouseOver)
61-
{
62-
UpdateCursor(true);
63-
if (e.MessageType == MouseHookMessageType.LeftButtonDown)
64-
{
65-
var brush = new SolidColorBrush(GetColorAt(e.Point.X, e.Point.Y));
66-
_colorPicker.SelectedBrush = brush;
67-
}
68-
}
69-
else
103+
// Restore the window.
104+
InteropMethods.SetWindowPlacement(handle, InteropValues.ShowWindowCommands.Restore);
105+
106+
var position = InteropMethods.GetCursorPos();
107+
InteropMethods.SetWindowPos(handle, IntPtr.Zero, (int) position.X - 20, (int) position.Y - -20, 0, 0, (int) InteropValues.SetWindowPosFlags.IgnoreZOrder | (int) InteropValues.SetWindowPosFlags.IgnoreResize | (int) InteropValues.SetWindowPosFlags.ShowWindow);
108+
}
109+
private void MouseHook_StatusChanged(object sender, MouseHookEventArgs e)
110+
{
111+
UpdateCursor(true);
112+
var brush = new SolidColorBrush(GetColorAt(e.Point.X, e.Point.Y));
113+
_colorPicker.SelectedBrush = brush;
114+
rect.Fill = brush;
115+
txtHex.Text = ColorHelper.GetHexFromBrush(brush).ToUpper();
116+
MoveWindowNextToMouse();
117+
if (e.MessageType == MouseHookMessageType.LeftButtonDown)
70118
{
71119
UpdateCursor(false);
120+
Update(false);
72121
}
73122
}
74123

@@ -80,7 +129,7 @@ private void UpdateCursor(bool isDropper)
80129

81130
if (!_cursorIsSetted)
82131
{
83-
Mouse.OverrideCursor = _dropperCursor;
132+
Mouse.OverrideCursor = Cursors.Cross;
84133
_cursorIsSetted = true;
85134
}
86135
}

src/Shared/HandyControl_Shared/Controls/ColorPicker/ColorPicker.cs

+29-21
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
namespace HandyControl.Controls;
1515

1616
/// <summary>
17-
/// 颜色拾取器
17+
/// Color picker
1818
/// </summary>
1919
[TemplatePart(Name = ElementBorderColor, Type = typeof(Border))]
2020
[TemplatePart(Name = ElementBorderPicker, Type = typeof(Border))]
@@ -26,6 +26,7 @@ namespace HandyControl.Controls;
2626
[TemplatePart(Name = ElementButtonDropper, Type = typeof(ToggleButton))]
2727
public class ColorPicker : Control, ISingleOpen
2828
{
29+
internal static ColorPicker cPicker;
2930
#region Constants
3031

3132
private const string ElementBorderColor = "PART_BorderColor";
@@ -64,42 +65,42 @@ public class ColorPicker : Control, ISingleOpen
6465
private bool _disposed;
6566

6667
/// <summary>
67-
/// 当前显示的颜色类型
68+
/// The type of color currently displayed
6869
/// </summary>
6970
private int _colorType;
7071

7172
/// <summary>
72-
/// 是否已经加载控件
73+
/// Whether the control has been loaded
7374
/// </summary>
7475
private bool _isLoaded;
7576

7677
/// <summary>
77-
/// 是否需要更新小球位置
78+
/// Do you need to update the ball position
7879
/// </summary>
7980
private bool _isNeedUpdatePicker = true;
8081

8182
/// <summary>
82-
/// 是否在拖动小球
83+
/// Whether you are dragging the ball
8384
/// </summary>
8485
private bool _isOnDragging;
8586

8687
/// <summary>
87-
/// 是否需要更新信息
88+
/// Need to update information
8889
/// </summary>
8990
private bool IsNeedUpdateInfo { get; set; } = true;
9091

9192
/// <summary>
92-
/// 颜色选取面板宽度
93+
/// Color selection panel width
9394
/// </summary>
9495
private const double ColorPanelWidth = 230;
9596

9697
/// <summary>
97-
/// 颜色选取面板高度
98+
/// Color selection panel height
9899
/// </summary>
99100
private const double ColorPanelHeight = 122;
100101

101102
/// <summary>
102-
/// 预设的颜色(一共18个,两行)
103+
/// Preset colors (a total of 18, two rows)
103104
/// </summary>
104105
private readonly List<string> _colorPresetList = new()
105106
{
@@ -125,7 +126,7 @@ public class ColorPicker : Control, ISingleOpen
125126
};
126127

127128
/// <summary>
128-
/// 颜色范围集合
129+
/// Color range collection
129130
/// </summary>
130131
private readonly List<ColorRange> _colorRangeList = new()
131132
{
@@ -162,7 +163,7 @@ public class ColorPicker : Control, ISingleOpen
162163
};
163164

164165
/// <summary>
165-
/// 颜色分隔集合
166+
/// Color separated collection
166167
/// </summary>
167168
private readonly List<Color> _colorSeparateList = new()
168169
{
@@ -189,14 +190,14 @@ public event EventHandler<FunctionEventArgs<Color>> SelectedColorChanged
189190
}
190191

191192
/// <summary>
192-
/// 颜色改变事件
193+
/// Color change event
193194
/// </summary>
194195
public static readonly RoutedEvent ConfirmedEvent =
195196
EventManager.RegisterRoutedEvent("Confirmed", RoutingStrategy.Bubble,
196197
typeof(EventHandler<FunctionEventArgs<Color>>), typeof(ColorPicker));
197198

198199
/// <summary>
199-
/// 颜色改变事件
200+
/// Color change event
200201
/// </summary>
201202
public event EventHandler<FunctionEventArgs<Color>> Confirmed
202203
{
@@ -205,14 +206,14 @@ public event EventHandler<FunctionEventArgs<Color>> Confirmed
205206
}
206207

207208
/// <summary>
208-
/// 取消事件
209+
/// Cancel event
209210
/// </summary>
210211
public static readonly RoutedEvent CanceledEvent =
211212
EventManager.RegisterRoutedEvent("Canceled", RoutingStrategy.Bubble,
212213
typeof(EventHandler), typeof(ColorPicker));
213214

214215
/// <summary>
215-
/// 取消事件
216+
/// Cancel event
216217
/// </summary>
217218
public event EventHandler Canceled
218219
{
@@ -291,7 +292,7 @@ private static void OnSelectedBrushChanged(DependencyObject d, DependencyPropert
291292
}
292293

293294
/// <summary>
294-
/// 当前选中的颜色
295+
/// Currently selected color
295296
/// </summary>
296297
public SolidColorBrush SelectedBrush
297298
{
@@ -332,7 +333,7 @@ internal List<bool> ShowList
332333
#endregion Properties
333334

334335
/// <summary>
335-
/// 当前显示的颜色类型
336+
/// The type of color currently displayed
336337
/// </summary>
337338
private int ColorType
338339
{
@@ -381,6 +382,8 @@ public ColorPicker()
381382
_isLoaded = true;
382383
}
383384
};
385+
386+
cPicker = this;
384387
}
385388

386389
public override void OnApplyTemplate()
@@ -450,7 +453,7 @@ public override void OnApplyTemplate()
450453
}
451454

452455
/// <summary>
453-
/// 初始化
456+
/// initialization
454457
/// </summary>
455458
private void Init()
456459
{
@@ -464,7 +467,7 @@ private void Init()
464467
}
465468

466469
/// <summary>
467-
/// 创建颜色按钮
470+
/// Create color buttons
468471
/// </summary>
469472
/// <returns></returns>
470473
private Button CreateColorButton(string colorStr)
@@ -495,7 +498,7 @@ private Button CreateColorButton(string colorStr)
495498
}
496499

497500
/// <summary>
498-
/// 内部更新
501+
/// Internal update
499502
/// </summary>
500503
private void UpdateStatus(Color color)
501504
{
@@ -634,7 +637,7 @@ private void MouseDragElementBehavior_OnDragging(object sender, MouseEventArgs e
634637
}
635638

636639
/// <summary>
637-
/// 拖动时更新颜色
640+
/// Update color while dragging
638641
/// </summary>
639642
private void UpdateColorWhenDrag(Point p)
640643
{
@@ -739,4 +742,9 @@ public void Dispose()
739742
}
740743

741744
public bool CanDispose => true;
745+
746+
public static void IsCheckedToggleButtonDropper(bool value)
747+
{
748+
ColorPicker.cPicker._toggleButtonDropper.IsChecked = value;
749+
}
742750
}

0 commit comments

Comments
 (0)