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