using Microsoft.Extensions.Logging; using AuroraDesk.ViewModels.Base; using ReactiveUI; using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; using System.Reactive; using System.Reactive.Linq; using System.Threading.Tasks; using HeroIconsAvalonia; using HeroIconsAvalonia.Controls; using HeroIconsAvalonia.Enums; using Avalonia.Controls; using Avalonia; using Avalonia.Layout; namespace AuroraDesk.ViewModels.Pages; /// /// 图标导航页面的 ViewModel /// public class IconsPageViewModel : RoutableViewModel { private ObservableCollection _heroIcons = new(); private HeroIconItem? _selectedIcon; private readonly ILogger? _logger; public ObservableCollection HeroIcons { get => _heroIcons; set => this.RaiseAndSetIfChanged(ref _heroIcons, value); } public HeroIconItem? SelectedIcon { get => _selectedIcon; set => this.RaiseAndSetIfChanged(ref _selectedIcon, value); } // 响应式命令 public ReactiveCommand CopyIconCommand { get; } public ReactiveCommand SelectIconCommand { get; } /// /// 构造函数 /// /// 宿主 Screen /// 日志记录器 public IconsPageViewModel(IScreen hostScreen, ILogger? logger = null) : base(hostScreen, "Icons") { _logger = logger; _logger?.LogInformation("IconsPageViewModel 已创建"); // 初始化图标数据 InitializeHeroIcons(); // 创建命令 CopyIconCommand = ReactiveCommand.Create(CopyIconToClipboard); SelectIconCommand = ReactiveCommand.Create(SelectIcon); // 监听图标选择变化 this.WhenAnyValue(x => x.SelectedIcon) .Where(icon => icon != null) .Subscribe(icon => _logger?.LogInformation("选择图标: {Name}", icon!.DisplayName)); } private void InitializeHeroIcons() { try { // 获取所有 IconType 枚举值 var iconTypes = Enum.GetValues(typeof(IconType)).Cast().ToList(); _logger?.LogInformation("开始初始化 {Count} 个 HeroIcons 图标", iconTypes.Count); // 添加 Outline 样式的图标 foreach (var iconType in iconTypes) { HeroIcons.Add(new HeroIconItem { IconType = iconType, IconKind = IconKind.Outline }); } // 添加 Solid 样式的图标 foreach (var iconType in iconTypes) { HeroIcons.Add(new HeroIconItem { IconType = iconType, IconKind = IconKind.Solid }); } _logger?.LogInformation("成功初始化 {Count} 个 HeroIcons 图标", HeroIcons.Count); } catch (Exception ex) { _logger?.LogError(ex, "初始化 HeroIcons 图标时发生错误"); } } private void CopyIconToClipboard(HeroIconItem icon) { if (icon == null) return; // 这里可以实现复制到剪贴板的逻辑 _logger?.LogInformation("复制图标到剪贴板: {Name}", icon.DisplayName); // 可以添加通知用户复制成功的逻辑 } private void SelectIcon(HeroIconItem icon) { if (icon == null) return; SelectedIcon = icon; _logger?.LogInformation("选择图标: {Name}", icon.DisplayName); } } /// /// HeroIcons 图标数据模型 /// public class HeroIconItem : ReactiveObject { private IconType _iconType; private IconKind _iconKind = IconKind.Outline; public IconType IconType { get => _iconType; set => this.RaiseAndSetIfChanged(ref _iconType, value); } public IconKind IconKind { get => _iconKind; set => this.RaiseAndSetIfChanged(ref _iconKind, value); } public string DisplayName => $"{IconType} ({IconKind})"; }