diff --git a/src/Core_30/HandyControl_Core_30/HandyControl_Core_30.csproj b/src/Core_30/HandyControl_Core_30/HandyControl_Core_30.csproj
index 2ac1874c..3f62846b 100644
--- a/src/Core_30/HandyControl_Core_30/HandyControl_Core_30.csproj
+++ b/src/Core_30/HandyControl_Core_30/HandyControl_Core_30.csproj
@@ -38,4 +38,9 @@
+
+
+ Resources\dropper.cur
+
+
\ No newline at end of file
diff --git a/src/Net_40/HandyControl_Net_40/HandyControl_Net_40.csproj b/src/Net_40/HandyControl_Net_40/HandyControl_Net_40.csproj
index 71a3f961..b64921df 100644
--- a/src/Net_40/HandyControl_Net_40/HandyControl_Net_40.csproj
+++ b/src/Net_40/HandyControl_Net_40/HandyControl_Net_40.csproj
@@ -100,6 +100,11 @@
Lang.Designer.cs
+
+
+ Resources\dropper.cur
+
+
\ No newline at end of file
diff --git a/src/Shared/HandyControl_Shared/Controls/ColorPicker/ColorDropper.cs b/src/Shared/HandyControl_Shared/Controls/ColorPicker/ColorDropper.cs
index 4b6f48f4..dc9ecf92 100644
--- a/src/Shared/HandyControl_Shared/Controls/ColorPicker/ColorDropper.cs
+++ b/src/Shared/HandyControl_Shared/Controls/ColorPicker/ColorDropper.cs
@@ -1,6 +1,5 @@
using System;
using System.Windows;
-using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Media;
using HandyControl.Data;
@@ -9,8 +8,10 @@ using HandyControl.Tools.Interop;
namespace HandyControl.Controls
{
- internal class ColorDropper : Control
+ internal class ColorDropper
{
+ private bool _cursorIsSetted;
+
private Cursor _dropperCursor;
private readonly ColorPicker _colorPicker;
@@ -26,8 +27,7 @@ namespace HandyControl.Controls
{
if (_dropperCursor == null)
{
- var info = Application.GetResourceStream(
- new Uri("pack://application:,,,/HandyControl;Component/Resources/dropper.cur"));
+ var info = Application.GetResourceStream(new Uri("pack://application:,,,/HandyControl;Component/Resources/dropper.cur"));
if (info != null)
{
_dropperCursor = new Cursor(info.Stream);
@@ -36,24 +36,61 @@ namespace HandyControl.Controls
if (_dropperCursor == null) return;
- Mouse.OverrideCursor = _dropperCursor;
MouseHook.Start();
MouseHook.StatusChanged += MouseHook_StatusChanged;
}
else
{
Mouse.OverrideCursor = Cursors.Arrow;
+ MouseHook.Stop();
+ MouseHook.StatusChanged -= MouseHook_StatusChanged;
}
}
private void MouseHook_StatusChanged(object sender, MouseHookEventArgs e)
{
- if (!_colorPicker.IsMouseOver && e.Message == MouseHookMessageType.LeftButtonDown)
+ var window = System.Windows.Window.GetWindow(_colorPicker);
+ if (window == null)
{
- var brush = new SolidColorBrush(GetColorAt(e.Point.X, e.Point.Y));
- _colorPicker.SelectedBrush = brush;
- //MouseHook.Stop();
- //MouseHook.StatusChanged -= MouseHook_StatusChanged;
+ UpdateCursor(false);
+
+ return;
+ }
+
+ if (!_colorPicker.IsMouseOver && window.IsMouseOver)
+ {
+ UpdateCursor(true);
+ if (e.Message == MouseHookMessageType.LeftButtonDown)
+ {
+ var brush = new SolidColorBrush(GetColorAt(e.Point.X, e.Point.Y));
+ _colorPicker.SelectedBrush = brush;
+ }
+ }
+ else
+ {
+ UpdateCursor(false);
+ }
+ }
+
+ private void UpdateCursor(bool isDropper)
+ {
+ if (isDropper)
+ {
+ Mouse.Captured?.ReleaseMouseCapture();
+
+ if (!_cursorIsSetted)
+ {
+ Mouse.OverrideCursor = _dropperCursor;
+ _cursorIsSetted = true;
+ }
+ }
+ else
+ {
+ if (_cursorIsSetted)
+ {
+ Mouse.OverrideCursor = Cursors.Arrow;
+ _cursorIsSetted = false;
+ }
}
}
diff --git a/src/Shared/HandyControl_Shared/Controls/ColorPicker/ColorPicker.cs b/src/Shared/HandyControl_Shared/Controls/ColorPicker/ColorPicker.cs
index 695e0566..1170a3f9 100644
--- a/src/Shared/HandyControl_Shared/Controls/ColorPicker/ColorPicker.cs
+++ b/src/Shared/HandyControl_Shared/Controls/ColorPicker/ColorPicker.cs
@@ -61,6 +61,8 @@ namespace HandyControl.Controls
private bool _appliedTemplate;
+ private bool _disposed;
+
///
/// 当前显示的颜色类型
///
@@ -340,6 +342,11 @@ namespace HandyControl.Controls
}
}
+ ~ColorPicker()
+ {
+ Dispose(false);
+ }
+
public ColorPicker()
{
CommandBindings.Add(new CommandBinding(ControlCommands.Confirm, ButtonConfirm_OnClick));
@@ -704,8 +711,25 @@ namespace HandyControl.Controls
_colorDropper.Update(_toggleButtonDropper.IsChecked.Value);
}
- public void Dispose() => System.Windows.Window.GetWindow(this)?.Close();
+ protected virtual void Dispose(bool disposing)
+ {
+ if (_disposed) return;
+
+ Dispatcher.BeginInvoke(new Action(() =>
+ {
+ _colorDropper?.Update(false);
+ System.Windows.Window.GetWindow(this)?.Close();
+ }));
+ _disposed = true;
+ }
+
+ public void Dispose()
+ {
+ Dispose(true);
+ GC.SuppressFinalize(this);
+ }
public bool CanDispose { get; } = true;
+
}
}
\ No newline at end of file