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/Net_GE45/HandyControl_Net_GE45/HandyControl_Net_GE45.csproj b/src/Net_GE45/HandyControl_Net_GE45/HandyControl_Net_GE45.csproj index c989b1c4..fa66936d 100644 --- a/src/Net_GE45/HandyControl_Net_GE45/HandyControl_Net_GE45.csproj +++ b/src/Net_GE45/HandyControl_Net_GE45/HandyControl_Net_GE45.csproj @@ -141,6 +141,11 @@ Lang.Designer.cs + + + Resources\dropper.cur + + \ No newline at end of file diff --git a/src/Shared/HandyControlDemo_Shared/UserControl/Controls/ClockDemoCtl.xaml b/src/Shared/HandyControlDemo_Shared/UserControl/Controls/ClockDemoCtl.xaml index 43122db0..95fd9b50 100644 --- a/src/Shared/HandyControlDemo_Shared/UserControl/Controls/ClockDemoCtl.xaml +++ b/src/Shared/HandyControlDemo_Shared/UserControl/Controls/ClockDemoCtl.xaml @@ -4,6 +4,9 @@ xmlns:controls="clr-namespace:HandyControl.Controls;assembly=HandyControl" Background="{DynamicResource RegionBrush}"> - + + + + diff --git a/src/Shared/HandyControlDemo_Shared/UserControl/Controls/TimePickerDemoCtl.xaml b/src/Shared/HandyControlDemo_Shared/UserControl/Controls/TimePickerDemoCtl.xaml index 840acbb5..0c4355c8 100644 --- a/src/Shared/HandyControlDemo_Shared/UserControl/Controls/TimePickerDemoCtl.xaml +++ b/src/Shared/HandyControlDemo_Shared/UserControl/Controls/TimePickerDemoCtl.xaml @@ -17,7 +17,11 @@ - + + + + + diff --git a/src/Shared/HandyControlDemo_Shared/UserControl/Main/LeftMainContent.xaml b/src/Shared/HandyControlDemo_Shared/UserControl/Main/LeftMainContent.xaml index 67091145..22137e92 100644 --- a/src/Shared/HandyControlDemo_Shared/UserControl/Main/LeftMainContent.xaml +++ b/src/Shared/HandyControlDemo_Shared/UserControl/Main/LeftMainContent.xaml @@ -161,7 +161,7 @@ - + diff --git a/src/Shared/HandyControlDemo_Shared/UserControl/Main/LeftMainContent.xaml.cs b/src/Shared/HandyControlDemo_Shared/UserControl/Main/LeftMainContent.xaml.cs index 3eb55a71..f7a69289 100644 --- a/src/Shared/HandyControlDemo_Shared/UserControl/Main/LeftMainContent.xaml.cs +++ b/src/Shared/HandyControlDemo_Shared/UserControl/Main/LeftMainContent.xaml.cs @@ -16,6 +16,13 @@ namespace HandyControlDemo.UserControl public LeftMainContent() { InitializeComponent(); + + /*You have to ask me why I made Border special. + What drives me crazy is that if you don't do this, + the content of ListBoxItemBorder will always be 1 ! + How amazing! + I wish someone could tell me why. */ + ListBoxItemBorder.Content = Properties.Langs.Lang.Border; } private void TabControl_OnSelectionChanged(object sender, SelectionChangedEventArgs e) diff --git a/src/Shared/HandyControlDemo_Shared/UserControl/Main/OverView.xaml b/src/Shared/HandyControlDemo_Shared/UserControl/Main/OverView.xaml index 0a72a138..2cde78c4 100644 --- a/src/Shared/HandyControlDemo_Shared/UserControl/Main/OverView.xaml +++ b/src/Shared/HandyControlDemo_Shared/UserControl/Main/OverView.xaml @@ -26,7 +26,7 @@ - + diff --git a/src/Shared/HandyControlDemo_Shared/UserControl/Styles/ToggleButtonDemoCtl.xaml b/src/Shared/HandyControlDemo_Shared/UserControl/Styles/ToggleButtonDemoCtl.xaml index f5680d6d..2a71ecd2 100644 --- a/src/Shared/HandyControlDemo_Shared/UserControl/Styles/ToggleButtonDemoCtl.xaml +++ b/src/Shared/HandyControlDemo_Shared/UserControl/Styles/ToggleButtonDemoCtl.xaml @@ -77,7 +77,7 @@ - + @@ -87,7 +87,7 @@ - + diff --git a/src/Shared/HandyControl_Shared/Controls/Attach/StatusSwitchElement.cs b/src/Shared/HandyControl_Shared/Controls/Attach/StatusSwitchElement.cs index 350c82d9..998c88d5 100644 --- a/src/Shared/HandyControl_Shared/Controls/Attach/StatusSwitchElement.cs +++ b/src/Shared/HandyControl_Shared/Controls/Attach/StatusSwitchElement.cs @@ -18,11 +18,11 @@ namespace HandyControl.Controls /// /// 是否隐藏元素 /// - public static readonly DependencyProperty HiddenElementProperty = DependencyProperty.RegisterAttached( - "HiddenElement", typeof(bool), typeof(StatusSwitchElement), new PropertyMetadata(ValueBoxes.FalseBox)); + public static readonly DependencyProperty HideUncheckedElementProperty = DependencyProperty.RegisterAttached( + "HideUncheckedElement", typeof(bool), typeof(StatusSwitchElement), new PropertyMetadata(ValueBoxes.FalseBox)); - public static void SetHiddenElement(DependencyObject element, bool value) => element.SetValue(HiddenElementProperty, value); + public static void SetHideUncheckedElement(DependencyObject element, bool value) => element.SetValue(HideUncheckedElementProperty, value); - public static bool GetHiddenElement(DependencyObject element) => (bool) element.GetValue(HiddenElementProperty); + public static bool GetHideUncheckedElement(DependencyObject element) => (bool) element.GetValue(HideUncheckedElementProperty); } } \ 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 new file mode 100644 index 00000000..dc9ecf92 --- /dev/null +++ b/src/Shared/HandyControl_Shared/Controls/ColorPicker/ColorDropper.cs @@ -0,0 +1,106 @@ +using System; +using System.Windows; +using System.Windows.Input; +using System.Windows.Media; +using HandyControl.Data; +using HandyControl.Tools; +using HandyControl.Tools.Interop; + +namespace HandyControl.Controls +{ + internal class ColorDropper + { + private bool _cursorIsSetted; + + private Cursor _dropperCursor; + + private readonly ColorPicker _colorPicker; + + public ColorDropper(ColorPicker colorPicker) + { + _colorPicker = colorPicker; + } + + public void Update(bool isShow) + { + if (isShow) + { + if (_dropperCursor == null) + { + var info = Application.GetResourceStream(new Uri("pack://application:,,,/HandyControl;Component/Resources/dropper.cur")); + if (info != null) + { + _dropperCursor = new Cursor(info.Stream); + } + } + + if (_dropperCursor == null) return; + + 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) + { + var window = System.Windows.Window.GetWindow(_colorPicker); + if (window == null) + { + 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; + } + } + } + + public static Color GetColorAt(int x, int y) + { + var desk = UnsafeNativeMethods.GetDesktopWindow(); + var dc = UnsafeNativeMethods.GetWindowDC(desk); + var a = (int)UnsafeNativeMethods.GetPixel(dc, x, y); + UnsafeNativeMethods.ReleaseDC(desk, dc); + return Color.FromArgb(255, (byte) ((a >> 0) & 0xff), (byte) ((a >> 8) & 0xff), (byte) ((a >> 16) & 0xff)); + } + } +} \ No newline at end of file diff --git a/src/Shared/HandyControl_Shared/Controls/Other/ColorPicker.cs b/src/Shared/HandyControl_Shared/Controls/ColorPicker/ColorPicker.cs similarity index 93% rename from src/Shared/HandyControl_Shared/Controls/Other/ColorPicker.cs rename to src/Shared/HandyControl_Shared/Controls/ColorPicker/ColorPicker.cs index 96e2020d..1170a3f9 100644 --- a/src/Shared/HandyControl_Shared/Controls/Other/ColorPicker.cs +++ b/src/Shared/HandyControl_Shared/Controls/ColorPicker/ColorPicker.cs @@ -3,10 +3,12 @@ using System.Collections.Generic; using System.Linq; using System.Windows; using System.Windows.Controls; +using System.Windows.Controls.Primitives; using System.Windows.Input; using System.Windows.Media; using HandyControl.Data; using HandyControl.Interactivity; +using HandyControl.Tools; using HandyControl.Tools.Extension; namespace HandyControl.Controls @@ -21,6 +23,7 @@ namespace HandyControl.Controls [TemplatePart(Name = ElementSliderColor, Type = typeof(Panel))] [TemplatePart(Name = ElementSliderOpacity, Type = typeof(Panel))] [TemplatePart(Name = ElementPanelRgb, Type = typeof(Panel))] + [TemplatePart(Name = ElementButtonDropper, Type = typeof(ToggleButton))] public class ColorPicker : Control, ISingleOpen { #region Constants @@ -32,11 +35,16 @@ namespace HandyControl.Controls private const string ElementSliderColor = "PART_SliderColor"; private const string ElementSliderOpacity = "PART_SliderOpacity"; private const string ElementPanelRgb = "PART_PanelRgb"; + private const string ElementButtonDropper = "PART_ButtonDropper"; #endregion Constants #region Data + private ColorDropper _colorDropper; + + private ToggleButton _toggleButtonDropper; + private Panel _panelRgb; private Border _borderColor; @@ -53,6 +61,8 @@ namespace HandyControl.Controls private bool _appliedTemplate; + private bool _disposed; + /// /// 当前显示的颜色类型 /// @@ -332,6 +342,11 @@ namespace HandyControl.Controls } } + ~ColorPicker() + { + Dispose(false); + } + public ColorPicker() { CommandBindings.Add(new CommandBinding(ControlCommands.Confirm, ButtonConfirm_OnClick)); @@ -361,6 +376,11 @@ namespace HandyControl.Controls _sliderOpacity.ValueChanged -= SliderOpacity_OnValueChanged; } + if (_toggleButtonDropper != null) + { + _toggleButtonDropper.Click -= ToggleButtonDropper_Click; + } + _panelColor?.Children.Clear(); _panelRgb?.RemoveHandler(NumericUpDown.ValueChangedEvent, new EventHandler>(NumericUpDownRgb_OnValueChanged)); @@ -374,6 +394,7 @@ namespace HandyControl.Controls _sliderColor = GetTemplateChild(ElementSliderColor) as Slider; _sliderOpacity = GetTemplateChild(ElementSliderOpacity) as Slider; _panelRgb = GetTemplateChild(ElementPanelRgb) as Panel; + _toggleButtonDropper = GetTemplateChild(ElementButtonDropper) as ToggleButton; if (_sliderColor != null) { @@ -395,6 +416,11 @@ namespace HandyControl.Controls collection.Add(behavior); } + if (_toggleButtonDropper != null) + { + _toggleButtonDropper.Click += ToggleButtonDropper_Click; + } + _appliedTemplate = true; if (_isLoaded) { @@ -428,7 +454,7 @@ namespace HandyControl.Controls var button = new Button { Margin = new Thickness(0, 0, 12, 12), - Style = FindResource("ButtonCustom") as Style, + Style = ResourceHelper.GetResource + + + + + + \ No newline at end of file diff --git a/src/Shared/HandyControl_Shared/Themes/Styles/ColorPicker.xaml b/src/Shared/HandyControl_Shared/Themes/Styles/ColorPicker.xaml index 63917319..a6b7748b 100644 --- a/src/Shared/HandyControl_Shared/Themes/Styles/ColorPicker.xaml +++ b/src/Shared/HandyControl_Shared/Themes/Styles/ColorPicker.xaml @@ -9,6 +9,7 @@ +