Files
Shrlalgo.RvKits/NeoUI/NeoUITest/IconsWindow.xaml.cs

140 lines
4.3 KiB
C#
Raw Normal View History

2025-08-20 12:10:35 +08:00
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using Microsoft.Win32;
using NeoUI.Assets;
namespace NeoUITest;
/// <summary>
/// IconsWindow.xaml 的交互逻辑
/// </summary>
public partial class IconsWindow : INotifyPropertyChanged
{
// 1. 一个私有的、包含所有图标的原始数据集合
private readonly ObservableCollection<MaterialSymbol> _allSymbols = new ObservableCollection<MaterialSymbol>();
// 2. 一个公开的 ICollectionViewUI 将绑定到这个视图
public ICollectionView SymbolCollectionView { get; }
private string _selectedSymbolName;
public string SelectedSymbolName
{
get => _selectedSymbolName;
set { _selectedSymbolName = value; OnPropertyChanged(nameof(SelectedSymbolName)); }
}
private string _searchText = string.Empty;
// 3. 绑定到搜索框的属性
public string SearchText
{
get => _searchText;
set
{
if (_searchText == value) return;
_searchText = value;
OnPropertyChanged(nameof(SearchText));
// 关键点: 当搜索文本改变时,刷新视图以重新应用筛选
SymbolCollectionView.Refresh();
}
}
public IconsWindow()
{
InitializeComponent();
// 从枚举加载所有图标到原始集合
LoadSymbols();
// 4. 初始化视图
SymbolCollectionView = CollectionViewSource.GetDefaultView(_allSymbols);
// 5. 为视图指定筛选逻辑
SymbolCollectionView.Filter = FilterSymbols;
this.DataContext = this;
}
private void LoadSymbols()
{
var symbols = Enum.GetValues(typeof(MaterialSymbol)).Cast<MaterialSymbol>();
_allSymbols.Clear();
foreach (var symbol in symbols)
{
_allSymbols.Add(symbol);
}
}
// 6. 筛选方法的具体实现
private bool FilterSymbols(object item)
{
// 如果搜索框为空,则不过滤,显示所有项
if (string.IsNullOrEmpty(SearchText))
{
return true;
}
// 如果项是 MaterialSymbol 类型
if (item is MaterialSymbol symbol)
{
// 检查枚举的名称(不区分大小写)是否包含搜索文本
return symbol.ToString().IndexOf(SearchText, StringComparison.OrdinalIgnoreCase) >= 0;
}
return false;
}
// *** 选择修复: 直接从事件参数 e 中获取选中的项 ***
private void IconItemsControl_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
// 检查 e.AddedItems 是否有内容。AddedItems 包含了新选中的项。
if (e.AddedItems.Count > 0 && e.AddedItems[0] is MaterialSymbol selectedSymbol)
{
string xamlCode = $"<n:IconElement Symbol=\"{selectedSymbol}\" Foreground=\"{ColorPicker.SelectedColor}\"/>";
SelectedSymbolName = xamlCode;
}
// 如果列表被清空或选择被取消e.AddedItems 为空
else if (IconItemsControl.SelectedItem == null)
{
SelectedSymbolName = string.Empty;
}
}
private void CopyCode_Click(object sender, RoutedEventArgs e)
{
if (!string.IsNullOrEmpty(SelectedSymbolName))
{
//string xamlCode = $"<local:SymbolIcon Symbol=\"{SelectedSymbolName}\" />";
Clipboard.SetText(SelectedSymbolName);
//MessageBox.Show($"代码已复制到剪贴板!\n\n{SelectedSymbolName}", "成功", MessageBoxButton.OK, MessageBoxImage.Information);
}
else
{
MessageBox.Show("请先选择一个图标。", "提示", MessageBoxButton.OK, MessageBoxImage.Warning);
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}