diff --git a/demo/Semi.Avalonia.Demo/Controls/ColorItemControl.axaml b/demo/Semi.Avalonia.Demo/Controls/ColorItemControl.axaml new file mode 100644 index 0000000..479f9ba --- /dev/null +++ b/demo/Semi.Avalonia.Demo/Controls/ColorItemControl.axaml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/demo/Semi.Avalonia.Demo/Controls/ColorItemControl.cs b/demo/Semi.Avalonia.Demo/Controls/ColorItemControl.cs new file mode 100644 index 0000000..04c8000 --- /dev/null +++ b/demo/Semi.Avalonia.Demo/Controls/ColorItemControl.cs @@ -0,0 +1,39 @@ +using Avalonia; +using Avalonia.Controls; +using Avalonia.Controls.Primitives; +using Avalonia.Input; +using CommunityToolkit.Mvvm.Messaging; +using Semi.Avalonia.Demo.ViewModels; + +namespace Semi.Avalonia.Demo.Controls; + +public class ColorItemControl : TemplatedControl +{ + public static readonly StyledProperty ColorNameProperty = AvaloniaProperty.Register( + nameof(ColorName)); + + public string? ColorName + { + get => GetValue(ColorNameProperty); + set => SetValue(ColorNameProperty, value); + } + + public static readonly StyledProperty HexProperty = AvaloniaProperty.Register( + nameof(Hex)); + + public string? Hex + { + get => GetValue(HexProperty); + set => SetValue(HexProperty, value); + } + + protected override void OnPointerPressed(PointerPressedEventArgs e) + { + base.OnPointerPressed(e); + if (this.DataContext is ColorItemViewModel v) + { + WeakReferenceMessenger.Default.Send(v); + } + + } +} \ No newline at end of file diff --git a/demo/Semi.Avalonia.Demo/Pages/PaletteDemo.axaml b/demo/Semi.Avalonia.Demo/Pages/PaletteDemo.axaml index 7ec3669..c90235e 100644 --- a/demo/Semi.Avalonia.Demo/Pages/PaletteDemo.axaml +++ b/demo/Semi.Avalonia.Demo/Pages/PaletteDemo.axaml @@ -2,6 +2,7 @@ x:Class="Semi.Avalonia.Demo.Pages.PaletteDemo" xmlns="https://github.com/avaloniaui" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" + xmlns:controls="clr-namespace:Semi.Avalonia.Demo.Controls" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:viewModels="clr-namespace:Semi.Avalonia.Demo.ViewModels" @@ -11,6 +12,13 @@ + + + + + + + - - - + + + @@ -41,29 +54,56 @@ - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/demo/Semi.Avalonia.Demo/Semi.Avalonia.Demo.csproj b/demo/Semi.Avalonia.Demo/Semi.Avalonia.Demo.csproj index 545f3dc..ad24460 100644 --- a/demo/Semi.Avalonia.Demo/Semi.Avalonia.Demo.csproj +++ b/demo/Semi.Avalonia.Demo/Semi.Avalonia.Demo.csproj @@ -47,8 +47,4 @@ - - - - diff --git a/demo/Semi.Avalonia.Demo/ViewModels/PaletteDemoViewModel.cs b/demo/Semi.Avalonia.Demo/ViewModels/PaletteDemoViewModel.cs index 515c832..8cf0939 100644 --- a/demo/Semi.Avalonia.Demo/ViewModels/PaletteDemoViewModel.cs +++ b/demo/Semi.Avalonia.Demo/ViewModels/PaletteDemoViewModel.cs @@ -4,30 +4,61 @@ using Avalonia.Controls; using Avalonia.Markup.Xaml; using Avalonia.Media; using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Messaging; namespace Semi.Avalonia.Demo.ViewModels; public class PaletteDemoViewModel: ObservableObject { private string[] _colors = { "Amber","Blue","Cyan","Green","Grey","Indigo","LightBlue","LightGreen","Lime","Orange","Pink","Purple","Red","Teal","Violet","Yellow" }; - private ObservableCollection _series; + private ObservableCollection _lightSeries; - public ObservableCollection Series + private ColorItemViewModel _selectedColor; + + public ColorItemViewModel SelectedColor { - get => _series; - set => SetProperty(ref _series, value); + get => _selectedColor; + set => SetProperty(ref _selectedColor, value); + } + + public ObservableCollection LightSeries + { + get => _lightSeries; + set => SetProperty(ref _lightSeries, value); + } + + private ObservableCollection _darkSeries; + + public ObservableCollection DarkSeries + { + get => _darkSeries; + set => SetProperty(ref _darkSeries, value); } public PaletteDemoViewModel() { - Series = new ObservableCollection(); - var resouceDictionary = (ResourceDictionary)(AvaloniaXamlLoader.Load(new Uri("avares://Semi.Avalonia/Themes/Light/Palette.axaml"))); + LightSeries = new ObservableCollection(); + var lightResourceDictionary = (ResourceDictionary)(AvaloniaXamlLoader.Load(new Uri("avares://Semi.Avalonia/Themes/Light/Palette.axaml"))); foreach (var color in _colors) { ColorSeries s = new ColorSeries(); - s.Initialize(resouceDictionary, color); - Series.Add(s); + s.Initialize(lightResourceDictionary, color, true); + LightSeries.Add(s); } + DarkSeries = new ObservableCollection(); + var darkResouceDictionary = (ResourceDictionary)(AvaloniaXamlLoader.Load(new Uri("avares://Semi.Avalonia/Themes/Dark/Palette.axaml"))); + foreach (var color in _colors) + { + ColorSeries s = new ColorSeries(); + s.Initialize(darkResouceDictionary, color, false); + DarkSeries.Add(s); + } + WeakReferenceMessenger.Default.Register(this, OnClickColorItem); + } + + private void OnClickColorItem(PaletteDemoViewModel vm, ColorItemViewModel item) + { + SelectedColor = item; } } @@ -49,7 +80,7 @@ public class ColorSeries: ObservableObject set => SetProperty(ref _seriesName, value); } - internal void Initialize(IResourceDictionary resourceDictionary, string color) + internal void Initialize(IResourceDictionary resourceDictionary, string color, bool light) { SeriesName = color; Color = new ObservableCollection(); @@ -62,7 +93,7 @@ public class ColorSeries: ObservableObject if (value is SolidColorBrush brush) { string name = color + " " + i; - var item = new ColorItemViewModel(name, brush, key); + var item = new ColorItemViewModel(name, brush, key, light, i); Color.Add(item); } } @@ -79,6 +110,13 @@ public class ColorItemViewModel : ObservableObject get => _color; set => SetProperty(ref _color, value); } + + private IBrush _textColor; + public IBrush TextColor + { + get => _textColor; + set => SetProperty(ref _textColor, value); + } private string _name; public string Name @@ -94,11 +132,28 @@ public class ColorItemViewModel : ObservableObject get => _resourceKey; set => SetProperty(ref _resourceKey, value); } + + private string _hex; + + public string Hex + { + get => _hex; + set => SetProperty(ref _hex, value); + } - public ColorItemViewModel(string name, IBrush color, string resourceKey) + public ColorItemViewModel(string name, IBrush color, string resourceKey, bool light, int index) { Name = name; Color = color; ResourceKey = resourceKey; + Hex = color.ToString().ToUpperInvariant(); + if ((light && index < 5) || (!light && index > 5)) + { + TextColor = Brushes.Black; + } + else + { + TextColor = Brushes.White; + } } } \ No newline at end of file