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