From 4d89b82e169c7e0675adbf39c962962f0f0a8194 Mon Sep 17 00:00:00 2001 From: Zhang Dian <54255897+zdpcdt@users.noreply.github.com> Date: Sat, 10 Aug 2024 13:20:13 +0800 Subject: [PATCH 1/8] fix: fix the issue of RGB & HSV NumericUpDown Tag disappearing. --- src/Semi.Avalonia.ColorPicker/Controls/ColorPicker.axaml | 2 +- src/Semi.Avalonia.ColorPicker/Controls/ColorView.axaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Semi.Avalonia.ColorPicker/Controls/ColorPicker.axaml b/src/Semi.Avalonia.ColorPicker/Controls/ColorPicker.axaml index 3498113..002f185 100644 --- a/src/Semi.Avalonia.ColorPicker/Controls/ColorPicker.axaml +++ b/src/Semi.Avalonia.ColorPicker/Controls/ColorPicker.axaml @@ -234,7 +234,7 @@ RowDefinitions="Auto,24,1*,1*,1*,1*,12" Tag="{TemplateBinding ColorModel}"> - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Rgba + Hsva + + + + + + + + + + From 1cedc77ce19e1701facd14101dfc7e5b832d1167 Mon Sep 17 00:00:00 2001 From: Zhang Dian <54255897+zdpcdt@users.noreply.github.com> Date: Sun, 11 Aug 2024 19:11:11 +0800 Subject: [PATCH 4/8] feat: complete SimpleColorView. --- .../Pages/ColorPickerDemo.axaml | 10 ++- .../Controls/ColorView.axaml | 73 ++++++++++--------- .../Converters/ColorToTextConverter.cs | 33 +++++++++ .../Converters/HsvColorToTextConverter.cs | 35 +++++++++ .../Converters/ToColorModel.cs | 21 ++++++ 5 files changed, 136 insertions(+), 36 deletions(-) create mode 100644 src/Semi.Avalonia.ColorPicker/Converters/ColorToTextConverter.cs create mode 100644 src/Semi.Avalonia.ColorPicker/Converters/HsvColorToTextConverter.cs create mode 100644 src/Semi.Avalonia.ColorPicker/Converters/ToColorModel.cs diff --git a/demo/Semi.Avalonia.Demo/Pages/ColorPickerDemo.axaml b/demo/Semi.Avalonia.Demo/Pages/ColorPickerDemo.axaml index 1172cd4..ee27171 100644 --- a/demo/Semi.Avalonia.Demo/Pages/ColorPickerDemo.axaml +++ b/demo/Semi.Avalonia.Demo/Pages/ColorPickerDemo.axaml @@ -6,7 +6,7 @@ xmlns:controls="using:Avalonia.Controls" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" - d:DesignHeight="450" + d:DesignHeight="1450" d:DesignWidth="800" mc:Ignorable="d"> @@ -18,6 +18,14 @@ + + + diff --git a/src/Semi.Avalonia.ColorPicker/Controls/ColorView.axaml b/src/Semi.Avalonia.ColorPicker/Controls/ColorView.axaml index f934c76..d5ba8df 100644 --- a/src/Semi.Avalonia.ColorPicker/Controls/ColorView.axaml +++ b/src/Semi.Avalonia.ColorPicker/Controls/ColorView.axaml @@ -6,6 +6,7 @@ xmlns:globalization="using:System.Globalization" xmlns:pc="using:Avalonia.Controls.Primitives.Converters" xmlns:primitives="using:Avalonia.Controls.Primitives" + xmlns:cvts="clr-namespace:Semi.Avalonia.ColorPicker.Converters" x:CompileBindings="True"> @@ -13,6 +14,9 @@ + + + + - - - - + + + + - - - - + + + - - - - - - - + IsVisible="{TemplateBinding IsAlphaVisible}" + Value="{Binding #ColorSpectrumAlphaSlider.Value}" /> - Rgba + SelectedValue="Hex"> + HexRgba Hsva + @@ -698,6 +701,6 @@ IsAlphaVisible="True" IsAlphaEnabled="True" ColorModel="Hsva" - HsvColor="hsv(120,1,1,30)" /> + HsvColor="hsv(120,7%,90%)" /> diff --git a/src/Semi.Avalonia.ColorPicker/Converters/ColorToTextConverter.cs b/src/Semi.Avalonia.ColorPicker/Converters/ColorToTextConverter.cs new file mode 100644 index 0000000..7e4364c --- /dev/null +++ b/src/Semi.Avalonia.ColorPicker/Converters/ColorToTextConverter.cs @@ -0,0 +1,33 @@ +using System; +using System.Globalization; +using System.Linq; +using Avalonia; +using Avalonia.Data; +using Avalonia.Data.Converters; +using Avalonia.Media; + +namespace Semi.Avalonia.ColorPicker.Converters; + +public class ColorToTextConverter : IValueConverter +{ + public object Convert(object? value, Type targetType, object? parameter, CultureInfo culture) + { + return value is Color color ? $"{color.R},{color.G},{color.B}" : AvaloniaProperty.UnsetValue; + } + + public object ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) + { + if (value is not string str) return BindingOperations.DoNothing; + var parts = str.Split(','); + if (parts.Length != 3 || parts.Any(string.IsNullOrWhiteSpace)) return BindingOperations.DoNothing; + + if (byte.TryParse(parts[0], NumberStyles.Integer, CultureInfo.InvariantCulture, out var r) && + byte.TryParse(parts[1], NumberStyles.Integer, CultureInfo.InvariantCulture, out var g) && + byte.TryParse(parts[2], NumberStyles.Integer, CultureInfo.InvariantCulture, out var b)) + { + return new Color(0xFF, r, g, b); + } + + return BindingOperations.DoNothing; + } +} \ No newline at end of file diff --git a/src/Semi.Avalonia.ColorPicker/Converters/HsvColorToTextConverter.cs b/src/Semi.Avalonia.ColorPicker/Converters/HsvColorToTextConverter.cs new file mode 100644 index 0000000..4fd9a85 --- /dev/null +++ b/src/Semi.Avalonia.ColorPicker/Converters/HsvColorToTextConverter.cs @@ -0,0 +1,35 @@ +using System; +using System.Globalization; +using System.Linq; +using Avalonia; +using Avalonia.Data; +using Avalonia.Data.Converters; +using Avalonia.Media; + +namespace Semi.Avalonia.ColorPicker.Converters; + +public class HsvColorToTextConverter : IValueConverter +{ + public object Convert(object? value, Type targetType, object? parameter, CultureInfo culture) + { + return value is HsvColor hsvColor + ? $"{Math.Round(hsvColor.H)},{Math.Round(hsvColor.S * 100)},{Math.Round(hsvColor.V * 100)}" + : AvaloniaProperty.UnsetValue; + } + + public object ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) + { + if (value is not string str) return BindingOperations.DoNothing; + var parts = str.Split(','); + if (parts.Length != 3 || parts.Any(string.IsNullOrWhiteSpace)) return BindingOperations.DoNothing; + + if (double.TryParse(parts[0], NumberStyles.Float, CultureInfo.InvariantCulture, out var h) && + double.TryParse(parts[1], NumberStyles.Float, CultureInfo.InvariantCulture, out var s) && + double.TryParse(parts[2], NumberStyles.Float, CultureInfo.InvariantCulture, out var v)) + { + return new HsvColor(1, h, s / 100, v / 100); + } + + return BindingOperations.DoNothing; + } +} \ No newline at end of file diff --git a/src/Semi.Avalonia.ColorPicker/Converters/ToColorModel.cs b/src/Semi.Avalonia.ColorPicker/Converters/ToColorModel.cs new file mode 100644 index 0000000..d7f21a5 --- /dev/null +++ b/src/Semi.Avalonia.ColorPicker/Converters/ToColorModel.cs @@ -0,0 +1,21 @@ +using System; +using System.Globalization; +using Avalonia.Controls; +using Avalonia.Data.Converters; + +namespace Semi.Avalonia.ColorPicker.Converters; + +public class ToColorModel : IValueConverter +{ + public object Convert(object? value, Type targetType, object? parameter, CultureInfo culture) + { + return parameter is "Hex" && value is "Hex" || + parameter is "Rgba" && value is ColorModel.Rgba || + parameter is "Hsva" && value is ColorModel.Hsva; + } + + public object ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) + { + throw new NotImplementedException(); + } +} \ No newline at end of file From e8d28c02332d2ebfc978c019175ac1ebde212ac2 Mon Sep 17 00:00:00 2001 From: Zhang Dian <54255897+zdpcdt@users.noreply.github.com> Date: Mon, 12 Aug 2024 14:42:47 +0800 Subject: [PATCH 5/8] feat: add SimpleColorPicker & HexSimpleColorPicker. --- .../Pages/ColorPickerDemo.axaml | 6 + .../Controls/ColorPicker.axaml | 196 ++++++++++++++++++ 2 files changed, 202 insertions(+) diff --git a/demo/Semi.Avalonia.Demo/Pages/ColorPickerDemo.axaml b/demo/Semi.Avalonia.Demo/Pages/ColorPickerDemo.axaml index ee27171..29451c7 100644 --- a/demo/Semi.Avalonia.Demo/Pages/ColorPickerDemo.axaml +++ b/demo/Semi.Avalonia.Demo/Pages/ColorPickerDemo.axaml @@ -44,5 +44,11 @@ + + + + diff --git a/src/Semi.Avalonia.ColorPicker/Controls/ColorPicker.axaml b/src/Semi.Avalonia.ColorPicker/Controls/ColorPicker.axaml index 002f185..165a426 100644 --- a/src/Semi.Avalonia.ColorPicker/Controls/ColorPicker.axaml +++ b/src/Semi.Avalonia.ColorPicker/Controls/ColorPicker.axaml @@ -514,4 +514,200 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + HexRgba + Hsva + + + + + + + + + + + + + + + + + + From 73687eb72f066ce551fcb5c171c0e0d978210713 Mon Sep 17 00:00:00 2001 From: Zhang Dian <54255897+zdpcdt@users.noreply.github.com> Date: Mon, 12 Aug 2024 15:50:55 +0800 Subject: [PATCH 6/8] fix: fix the shake of ColorSpectrum's thumb. --- src/Semi.Avalonia.ColorPicker/Controls/ColorPicker.axaml | 1 - src/Semi.Avalonia.ColorPicker/Controls/ColorView.axaml | 1 - 2 files changed, 2 deletions(-) diff --git a/src/Semi.Avalonia.ColorPicker/Controls/ColorPicker.axaml b/src/Semi.Avalonia.ColorPicker/Controls/ColorPicker.axaml index 165a426..aca0643 100644 --- a/src/Semi.Avalonia.ColorPicker/Controls/ColorPicker.axaml +++ b/src/Semi.Avalonia.ColorPicker/Controls/ColorPicker.axaml @@ -622,7 +622,6 @@ AutomationProperties.Name="Hexadecimal Color" InnerLeftContent="#" IsVisible="{Binding #ColorModelComboBox.SelectedValue, Converter={StaticResource ToColorModel}, ConverterParameter=Hex}" - Text="{Binding #ColorSpectrum.Color, Converter={StaticResource ColorToHexConverter}, Mode=TwoWay}" MaxLength="8" /> Date: Mon, 12 Aug 2024 16:35:51 +0800 Subject: [PATCH 7/8] fix: fix Flyout Placement. --- .../Pages/ColorPickerDemo.axaml | 86 ++++++++++--------- .../Controls/ColorPicker.axaml | 2 +- src/Semi.Avalonia.ColorPicker/Shared.axaml | 1 + 3 files changed, 46 insertions(+), 43 deletions(-) diff --git a/demo/Semi.Avalonia.Demo/Pages/ColorPickerDemo.axaml b/demo/Semi.Avalonia.Demo/Pages/ColorPickerDemo.axaml index 29451c7..65a3b2f 100644 --- a/demo/Semi.Avalonia.Demo/Pages/ColorPickerDemo.axaml +++ b/demo/Semi.Avalonia.Demo/Pages/ColorPickerDemo.axaml @@ -9,46 +9,48 @@ d:DesignHeight="1450" d:DesignWidth="800" mc:Ignorable="d"> - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - + + \ No newline at end of file diff --git a/src/Semi.Avalonia.ColorPicker/Controls/ColorPicker.axaml b/src/Semi.Avalonia.ColorPicker/Controls/ColorPicker.axaml index aca0643..c4a05e4 100644 --- a/src/Semi.Avalonia.ColorPicker/Controls/ColorPicker.axaml +++ b/src/Semi.Avalonia.ColorPicker/Controls/ColorPicker.axaml @@ -538,7 +538,7 @@ - +