You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

151 lines
4.3 KiB

using Microsoft.Extensions.Logging;
using MyAvaloniaApp.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 MyAvaloniaApp.ViewModels.Pages;
/// <summary>
/// 图标导航页面的 ViewModel
/// </summary>
public class IconsPageViewModel : RoutableViewModel
{
private ObservableCollection<HeroIconItem> _heroIcons = new();
private HeroIconItem? _selectedIcon;
private readonly ILogger<IconsPageViewModel>? _logger;
public ObservableCollection<HeroIconItem> HeroIcons
{
get => _heroIcons;
set => this.RaiseAndSetIfChanged(ref _heroIcons, value);
}
public HeroIconItem? SelectedIcon
{
get => _selectedIcon;
set => this.RaiseAndSetIfChanged(ref _selectedIcon, value);
}
// 响应式命令
public ReactiveCommand<HeroIconItem, Unit> CopyIconCommand { get; }
public ReactiveCommand<HeroIconItem, Unit> SelectIconCommand { get; }
/// <summary>
/// 构造函数
/// </summary>
/// <param name="hostScreen">宿主 Screen</param>
/// <param name="logger">日志记录器</param>
public IconsPageViewModel(IScreen hostScreen, ILogger<IconsPageViewModel>? logger = null) : base(hostScreen, "Icons")
{
_logger = logger;
_logger?.LogInformation("IconsPageViewModel 已创建");
// 初始化图标数据
InitializeHeroIcons();
// 创建命令
CopyIconCommand = ReactiveCommand.Create<HeroIconItem>(CopyIconToClipboard);
SelectIconCommand = ReactiveCommand.Create<HeroIconItem>(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<IconType>().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);
}
}
/// <summary>
/// HeroIcons 图标数据模型
/// </summary>
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})";
}