diff --git a/src/Avalonia/HandyControlDemo_Avalonia/Data/Model/CardModel.cs b/src/Avalonia/HandyControlDemo_Avalonia/Data/Model/CardModel.cs new file mode 100644 index 00000000..8d5b9342 --- /dev/null +++ b/src/Avalonia/HandyControlDemo_Avalonia/Data/Model/CardModel.cs @@ -0,0 +1,10 @@ +namespace HandyControlDemo.Data; + +public class CardModel +{ + public string? Header { get; set; } + + public string? Content { get; set; } + + public string? Footer { get; set; } +} diff --git a/src/Avalonia/HandyControlDemo_Avalonia/HandyControlDemo_Avalonia.csproj b/src/Avalonia/HandyControlDemo_Avalonia/HandyControlDemo_Avalonia.csproj index 84d45a59..87f431e9 100644 --- a/src/Avalonia/HandyControlDemo_Avalonia/HandyControlDemo_Avalonia.csproj +++ b/src/Avalonia/HandyControlDemo_Avalonia/HandyControlDemo_Avalonia.csproj @@ -20,6 +20,7 @@ + @@ -27,6 +28,7 @@ + diff --git a/src/Avalonia/HandyControlDemo_Avalonia/Resources/Img/Album/1.jpg b/src/Avalonia/HandyControlDemo_Avalonia/Resources/Img/Album/1.jpg new file mode 100644 index 00000000..59c950bf Binary files /dev/null and b/src/Avalonia/HandyControlDemo_Avalonia/Resources/Img/Album/1.jpg differ diff --git a/src/Avalonia/HandyControlDemo_Avalonia/Resources/Img/Album/10.jpg b/src/Avalonia/HandyControlDemo_Avalonia/Resources/Img/Album/10.jpg new file mode 100644 index 00000000..05a4a509 Binary files /dev/null and b/src/Avalonia/HandyControlDemo_Avalonia/Resources/Img/Album/10.jpg differ diff --git a/src/Avalonia/HandyControlDemo_Avalonia/Resources/Img/Album/2.jpg b/src/Avalonia/HandyControlDemo_Avalonia/Resources/Img/Album/2.jpg new file mode 100644 index 00000000..5866b3c1 Binary files /dev/null and b/src/Avalonia/HandyControlDemo_Avalonia/Resources/Img/Album/2.jpg differ diff --git a/src/Avalonia/HandyControlDemo_Avalonia/Resources/Img/Album/3.jpg b/src/Avalonia/HandyControlDemo_Avalonia/Resources/Img/Album/3.jpg new file mode 100644 index 00000000..33164cef Binary files /dev/null and b/src/Avalonia/HandyControlDemo_Avalonia/Resources/Img/Album/3.jpg differ diff --git a/src/Avalonia/HandyControlDemo_Avalonia/Resources/Img/Album/4.jpg b/src/Avalonia/HandyControlDemo_Avalonia/Resources/Img/Album/4.jpg new file mode 100644 index 00000000..617acecd Binary files /dev/null and b/src/Avalonia/HandyControlDemo_Avalonia/Resources/Img/Album/4.jpg differ diff --git a/src/Avalonia/HandyControlDemo_Avalonia/Resources/Img/Album/5.jpg b/src/Avalonia/HandyControlDemo_Avalonia/Resources/Img/Album/5.jpg new file mode 100644 index 00000000..76a7ee2f Binary files /dev/null and b/src/Avalonia/HandyControlDemo_Avalonia/Resources/Img/Album/5.jpg differ diff --git a/src/Avalonia/HandyControlDemo_Avalonia/Resources/Img/Album/6.jpg b/src/Avalonia/HandyControlDemo_Avalonia/Resources/Img/Album/6.jpg new file mode 100644 index 00000000..6267d99a Binary files /dev/null and b/src/Avalonia/HandyControlDemo_Avalonia/Resources/Img/Album/6.jpg differ diff --git a/src/Avalonia/HandyControlDemo_Avalonia/Resources/Img/Album/7.jpg b/src/Avalonia/HandyControlDemo_Avalonia/Resources/Img/Album/7.jpg new file mode 100644 index 00000000..c3c953e6 Binary files /dev/null and b/src/Avalonia/HandyControlDemo_Avalonia/Resources/Img/Album/7.jpg differ diff --git a/src/Avalonia/HandyControlDemo_Avalonia/Resources/Img/Album/8.jpg b/src/Avalonia/HandyControlDemo_Avalonia/Resources/Img/Album/8.jpg new file mode 100644 index 00000000..7cf2b286 Binary files /dev/null and b/src/Avalonia/HandyControlDemo_Avalonia/Resources/Img/Album/8.jpg differ diff --git a/src/Avalonia/HandyControlDemo_Avalonia/Resources/Img/Album/9.jpg b/src/Avalonia/HandyControlDemo_Avalonia/Resources/Img/Album/9.jpg new file mode 100644 index 00000000..e70e3fcf Binary files /dev/null and b/src/Avalonia/HandyControlDemo_Avalonia/Resources/Img/Album/9.jpg differ diff --git a/src/Avalonia/HandyControlDemo_Avalonia/Service/Data/DataService.cs b/src/Avalonia/HandyControlDemo_Avalonia/Service/Data/DataService.cs index 9e07b8d7..9973cc38 100644 --- a/src/Avalonia/HandyControlDemo_Avalonia/Service/Data/DataService.cs +++ b/src/Avalonia/HandyControlDemo_Avalonia/Service/Data/DataService.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Collections.ObjectModel; using System.IO; using System.Linq; using System.Reflection; @@ -12,6 +13,31 @@ namespace HandyControlDemo.Service; public class DataService { + internal ObservableCollection GetCardDataList() + { + return + [ + new CardModel { Header = "Atomic", Content = "avares://HandyControlDemo/Resources/Img/Album/1.jpg", Footer = "Stive Morgan" }, + new CardModel { Header = "Zinderlong", Content = "avares://HandyControlDemo/Resources/Img/Album/2.jpg", Footer = "Zonderling" }, + new CardModel { Header = "Busy Doin' Nothin'", Content = "avares://HandyControlDemo/Resources/Img/Album/3.jpg", Footer = "Ace Wilder" }, + new CardModel { Header = "Wrong", Content = "avares://HandyControlDemo/Resources/Img/Album/4.jpg", Footer = "Blaxy Girls" }, + new CardModel { Header = "The Lights", Content = "avares://HandyControlDemo/Resources/Img/Album/5.jpg", Footer = "Panda Eyes" }, + new CardModel { Header = "EA7-50-Cent Disco", Content = "avares://HandyControlDemo/Resources/Img/Album/6.jpg", Footer = "еяхат музыка" }, + new CardModel { Header = "Monsters", Content = "avares://HandyControlDemo/Resources/Img/Album/7.jpg", Footer = "Different Heaven" }, + new CardModel { Header = "Gangsta Walk", Content = "avares://HandyControlDemo/Resources/Img/Album/8.jpg", Footer = "Illusionize" }, + new CardModel { Header = "Won't Back Down", Content = "avares://HandyControlDemo/Resources/Img/Album/9.jpg", Footer = "Boehm / Benjamin Francis Leftwich" }, + new CardModel { Header = "Katchi", Content = "avares://HandyControlDemo/Resources/Img/Album/10.jpg", Footer = "Ofenbach / Nick Waterhouse" } + ]; + } + + internal CardModel GetCardData() + { + return new CardModel + { + Content = $"avares://HandyControlDemo/Resources/Img/Album/{DateTime.Now.Second % 10 + 1}.jpg" + }; + } + internal List GetDemoDataList() { var list = new List(); diff --git a/src/Avalonia/HandyControlDemo_Avalonia/Tools/Converter/StringToBitmapConverter.cs b/src/Avalonia/HandyControlDemo_Avalonia/Tools/Converter/StringToBitmapConverter.cs new file mode 100644 index 00000000..e7266507 --- /dev/null +++ b/src/Avalonia/HandyControlDemo_Avalonia/Tools/Converter/StringToBitmapConverter.cs @@ -0,0 +1,33 @@ +using System; +using System.Globalization; +using Avalonia.Data.Converters; +using Avalonia.Media.Imaging; +using Avalonia.Platform; + +namespace HandyControlDemo.Tools.Converter; + +public class StringToBitmapConverter : IValueConverter +{ + public static readonly StringToBitmapConverter Instance = new(); + + public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture) + { + if (value is not string path || string.IsNullOrEmpty(path)) + { + return null; + } + + try + { + using var stream = AssetLoader.Open(new Uri(path)); + return new Bitmap(stream); + } + catch + { + return null; + } + } + + public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) => + throw new NotSupportedException(); +} diff --git a/src/Avalonia/HandyControlDemo_Avalonia/UserControl/Controls/CardDemo.axaml b/src/Avalonia/HandyControlDemo_Avalonia/UserControl/Controls/CardDemo.axaml new file mode 100644 index 00000000..869b2b54 --- /dev/null +++ b/src/Avalonia/HandyControlDemo_Avalonia/UserControl/Controls/CardDemo.axaml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Avalonia/HandyControlDemo_Avalonia/UserControl/Controls/CardDemo.axaml.cs b/src/Avalonia/HandyControlDemo_Avalonia/UserControl/Controls/CardDemo.axaml.cs new file mode 100644 index 00000000..73d8b141 --- /dev/null +++ b/src/Avalonia/HandyControlDemo_Avalonia/UserControl/Controls/CardDemo.axaml.cs @@ -0,0 +1,9 @@ +namespace HandyControlDemo.UserControl; + +public partial class CardDemo : Avalonia.Controls.UserControl +{ + public CardDemo() + { + InitializeComponent(); + } +} diff --git a/src/Avalonia/HandyControlDemo_Avalonia/UserControl/Controls/HoneycombPanelDemo.axaml b/src/Avalonia/HandyControlDemo_Avalonia/UserControl/Controls/HoneycombPanelDemo.axaml index 021a5e6d..120eefd4 100644 --- a/src/Avalonia/HandyControlDemo_Avalonia/UserControl/Controls/HoneycombPanelDemo.axaml +++ b/src/Avalonia/HandyControlDemo_Avalonia/UserControl/Controls/HoneycombPanelDemo.axaml @@ -2,8 +2,14 @@ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:hc="https://handyorg.github.io/handycontrol" xmlns:vm="clr-namespace:HandyControlDemo.ViewModel" + xmlns:data="clr-namespace:HandyControlDemo.Data" + xmlns:cv="clr-namespace:HandyControlDemo.Tools.Converter" x:Class="HandyControlDemo.UserControl.HoneycombPanelDemo" - DataContext="{Binding HoneycombPanelDemo, Source={x:Static vm:ViewModelLocator.Instance}}"> + x:DataType="vm:CardDemoViewModel" + DataContext="{Binding CardDemo, Source={x:Static vm:ViewModelLocator.Instance}}"> + + + @@ -25,13 +31,14 @@ - + - + diff --git a/src/Avalonia/HandyControlDemo_Avalonia/ViewModel/Controls/CardDemoViewModel.cs b/src/Avalonia/HandyControlDemo_Avalonia/ViewModel/Controls/CardDemoViewModel.cs new file mode 100644 index 00000000..31606e86 --- /dev/null +++ b/src/Avalonia/HandyControlDemo_Avalonia/ViewModel/Controls/CardDemoViewModel.cs @@ -0,0 +1,28 @@ +using CommunityToolkit.Mvvm.Input; +using HandyControlDemo.Data; +using HandyControlDemo.Service; + +namespace HandyControlDemo.ViewModel; + +public partial class CardDemoViewModel : DemoViewModelBase +{ + private readonly DataService _dataService; + + public CardDemoViewModel(DataService dataService) + { + _dataService = dataService; + DataList = dataService.GetCardDataList(); + } + + [RelayCommand] + private void AddItem() => DataList.Insert(0, _dataService.GetCardData()); + + [RelayCommand] + private void RemoveItem() + { + if (DataList.Count > 0) + { + DataList.RemoveAt(0); + } + } +} diff --git a/src/Avalonia/HandyControlDemo_Avalonia/ViewModel/Controls/HoneycombPanelDemoViewModel.cs b/src/Avalonia/HandyControlDemo_Avalonia/ViewModel/Controls/HoneycombPanelDemoViewModel.cs deleted file mode 100644 index 60c769c4..00000000 --- a/src/Avalonia/HandyControlDemo_Avalonia/ViewModel/Controls/HoneycombPanelDemoViewModel.cs +++ /dev/null @@ -1,42 +0,0 @@ -using System; -using System.Collections.ObjectModel; -using Avalonia.Media.Imaging; -using Avalonia.Platform; -using CommunityToolkit.Mvvm.ComponentModel; -using CommunityToolkit.Mvvm.Input; - -namespace HandyControlDemo.ViewModel; - -public partial class HoneycombPanelDemoViewModel : ObservableObject -{ - private static readonly Random Random = new(); - - [ObservableProperty] private ObservableCollection _dataList = []; - - public HoneycombPanelDemoViewModel() - { - for (int i = 0; i < 7; i++) - { - DataList.Add(LoadRandomAvatar()); - } - } - - [RelayCommand] - private void AddItem() => DataList.Insert(0, LoadRandomAvatar()); - - [RelayCommand] - private void RemoveItem() - { - if (DataList.Count > 0) - { - DataList.RemoveAt(0); - } - } - - private static Bitmap LoadRandomAvatar() - { - var uri = new Uri($"avares://HandyControlDemo/Resources/Img/Avatar/avatar{Random.Next(1, 7)}.png"); - using var stream = AssetLoader.Open(uri); - return new Bitmap(stream); - } -} diff --git a/src/Avalonia/HandyControlDemo_Avalonia/ViewModel/ViewModelLocator.cs b/src/Avalonia/HandyControlDemo_Avalonia/ViewModel/ViewModelLocator.cs index 56121bb0..376d75dd 100644 --- a/src/Avalonia/HandyControlDemo_Avalonia/ViewModel/ViewModelLocator.cs +++ b/src/Avalonia/HandyControlDemo_Avalonia/ViewModel/ViewModelLocator.cs @@ -20,7 +20,7 @@ public class ViewModelLocator services.AddSingleton(); services.AddTransient(); services.AddTransient(); - services.AddTransient(); + services.AddTransient(); _serviceProvider = services.BuildServiceProvider(); } @@ -29,5 +29,5 @@ public class ViewModelLocator public InputElementDemoViewModel InputElementDemo => _serviceProvider.GetService()!; - public HoneycombPanelDemoViewModel HoneycombPanelDemo => _serviceProvider.GetService()!; + public CardDemoViewModel CardDemo => _serviceProvider.GetService()!; } diff --git a/src/Avalonia/HandyControl_Avalonia/Controls/Other/Card.cs b/src/Avalonia/HandyControl_Avalonia/Controls/Other/Card.cs new file mode 100644 index 00000000..4b5678b0 --- /dev/null +++ b/src/Avalonia/HandyControl_Avalonia/Controls/Other/Card.cs @@ -0,0 +1,62 @@ +using Avalonia; +using Avalonia.Controls; +using Avalonia.Controls.Templates; + +namespace HandyControl.Controls; + +public class Card : ContentControl +{ + public static readonly StyledProperty HeaderProperty = + AvaloniaProperty.Register(nameof(Header)); + + public object? Header + { + get => GetValue(HeaderProperty); + set => SetValue(HeaderProperty, value); + } + + public static readonly StyledProperty HeaderTemplateProperty = + AvaloniaProperty.Register(nameof(HeaderTemplate)); + + public IDataTemplate? HeaderTemplate + { + get => GetValue(HeaderTemplateProperty); + set => SetValue(HeaderTemplateProperty, value); + } + + public static readonly StyledProperty HeaderStringFormatProperty = + AvaloniaProperty.Register(nameof(HeaderStringFormat)); + + public string? HeaderStringFormat + { + get => GetValue(HeaderStringFormatProperty); + set => SetValue(HeaderStringFormatProperty, value); + } + + public static readonly StyledProperty FooterProperty = + AvaloniaProperty.Register(nameof(Footer)); + + public object? Footer + { + get => GetValue(FooterProperty); + set => SetValue(FooterProperty, value); + } + + public static readonly StyledProperty FooterTemplateProperty = + AvaloniaProperty.Register(nameof(FooterTemplate)); + + public IDataTemplate? FooterTemplate + { + get => GetValue(FooterTemplateProperty); + set => SetValue(FooterTemplateProperty, value); + } + + public static readonly StyledProperty FooterStringFormatProperty = + AvaloniaProperty.Register(nameof(FooterStringFormat)); + + public string? FooterStringFormat + { + get => GetValue(FooterStringFormatProperty); + set => SetValue(FooterStringFormatProperty, value); + } +} diff --git a/src/Avalonia/HandyControl_Avalonia/Themes/Styles/Card.axaml b/src/Avalonia/HandyControl_Avalonia/Themes/Styles/Card.axaml new file mode 100644 index 00000000..236ee015 --- /dev/null +++ b/src/Avalonia/HandyControl_Avalonia/Themes/Styles/Card.axaml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Avalonia/HandyControl_Avalonia/Themes/Styles/MergedStyles.axaml b/src/Avalonia/HandyControl_Avalonia/Themes/Styles/MergedStyles.axaml index f5fceb1a..1eec387e 100644 --- a/src/Avalonia/HandyControl_Avalonia/Themes/Styles/MergedStyles.axaml +++ b/src/Avalonia/HandyControl_Avalonia/Themes/Styles/MergedStyles.axaml @@ -57,6 +57,7 @@ +