Merge pull request #504 from irihitech/icon

extract icon resources & resolve AOT issue
This commit is contained in:
Dong Bin
2024-12-26 15:54:09 +08:00
committed by GitHub
9 changed files with 50 additions and 30 deletions

View File

@@ -1,9 +1,7 @@
using System;
using System.Collections.Generic;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using Avalonia.Controls;
using Avalonia.Markup.Xaml;
using Avalonia.Media;
using CommunityToolkit.Mvvm.ComponentModel;
@@ -11,8 +9,7 @@ namespace Semi.Avalonia.Demo.ViewModels;
public partial class IconDemoViewModel : ObservableObject
{
private readonly IResourceDictionary? _resources =
AvaloniaXamlLoader.Load(new Uri("avares://Semi.Avalonia/Themes/Shared/Icon.axaml")) as ResourceDictionary;
private readonly IResourceDictionary? _resources = new Icons();
private readonly Dictionary<string, IconItem> _filledIcons = new();
private readonly Dictionary<string, IconItem> _strokedIcons = new();
@@ -26,22 +23,27 @@ public partial class IconDemoViewModel : ObservableObject
{
if (_resources is null) return;
foreach (var key in _resources.Keys)
foreach (var provider in _resources.MergedDictionaries)
{
if (_resources[key] is not Geometry geometry) continue;
var icon = new IconItem { ResourceKey = key.ToString(), Geometry = geometry };
if (provider is not ResourceDictionary dic) continue;
if (key.ToString().EndsWith("Stroked"))
foreach (var key in dic.Keys)
{
_strokedIcons[key.ToString()] = icon;
}
else
{
_filledIcons[key.ToString()] = icon;
}
if (dic[key] is not Geometry geometry) continue;
var icon = new IconItem
{
ResourceKey = key.ToString(),
Geometry = geometry
};
OnSearchTextChanged(string.Empty);
if (key.ToString().EndsWith("Stroked"))
_strokedIcons[key.ToString().ToLowerInvariant()] = icon;
else
_filledIcons[key.ToString().ToLowerInvariant()] = icon;
}
}
OnSearchTextChanged(string.Empty);
}
partial void OnSearchTextChanged(string? value)
@@ -49,16 +51,15 @@ public partial class IconDemoViewModel : ObservableObject
var search = value?.ToLowerInvariant() ?? string.Empty;
FilteredFilledIcons.Clear();
foreach (var icon in _filledIcons.Values.Where(i => i.ResourceKey?.ToLowerInvariant().Contains(search) == true))
foreach (var pair in _filledIcons.Where(i => i.Key.Contains(search)))
{
FilteredFilledIcons.Add(icon);
FilteredFilledIcons.Add(pair.Value);
}
FilteredStrokedIcons.Clear();
foreach (var icon in
_strokedIcons.Values.Where(i => i.ResourceKey?.ToLowerInvariant().Contains(search) == true))
foreach (var pair in _strokedIcons.Where(i => i.Key.Contains(search)))
{
FilteredStrokedIcons.Add(icon);
FilteredStrokedIcons.Add(pair.Value);
}
}
}

View File

@@ -0,0 +1,14 @@
<ResourceDictionary xmlns="https://github.com/avaloniaui" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<StreamGeometry x:Key="SemiIconCaretDown">
m17.55 15.66-4.8 5.48a1 1 0 0 1-1.5 0l-4.8-5.48A1 1 0 0 1 7.2 14h9.6a1 1 0 0 1 .75 1.66Z
</StreamGeometry>
<StreamGeometry x:Key="SemiIconCaretUp">
m6.45 8.34 4.8-5.48a1 1 0 0 1 1.5 0l4.8 5.48A1 1 0 0 1 16.8 10H7.2a1 1 0 0 1-.75-1.66Z
</StreamGeometry>
<StreamGeometry x:Key="SemiIconCheckBoxIndeterminate">
M5 12.5c0-.83.67-1.5 1.5-1.5h11a1.5 1.5 0 0 1 0 3h-11A1.5 1.5 0 0 1 5 12.5Z
</StreamGeometry>
<StreamGeometry x:Key="SemiIconCheckBoxTick">
M17.41 7.3c.66.51.78 1.45.28 2.11l-6.5 8.5a1.5 1.5 0 0 1-2.37.01l-3.5-4.5a1.5 1.5 0 1 1 2.36-1.84L10 14.54l5.32-6.95a1.5 1.5 0 0 1 2.1-.28Z
</StreamGeometry>
</ResourceDictionary>

View File

@@ -0,0 +1,6 @@
<ResourceDictionary x:Class="Semi.Avalonia.Icons" xmlns="https://github.com/avaloniaui" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<ResourceDictionary.MergedDictionaries>
<ResourceInclude Source="avares://Semi.Avalonia/Icons/Icon.axaml" />
<ResourceInclude Source="avares://Semi.Avalonia/Icons/IconPatch.axaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>

View File

@@ -0,0 +1,5 @@
using Avalonia.Controls;
namespace Semi.Avalonia;
public class Icons : ResourceDictionary;

View File

@@ -10,7 +10,8 @@
<ResourceInclude Source="avares://Semi.Avalonia/Themes/Base.axaml" />
<ResourceInclude Source="avares://Semi.Avalonia/Themes/Shared/_index.axaml" />
<ResourceInclude Source="avares://Semi.Avalonia/Locale/zh-cn.axaml" />
<ResourceInclude Source="avares://Semi.Avalonia/Icons/_index.axaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Styles.Resources>
</Styles>
</Styles>

View File

@@ -15,6 +15,7 @@
<ResourceInclude Source="avares://Semi.Avalonia/Themes/Base.axaml" />
<ResourceInclude Source="avares://Semi.Avalonia/Themes/Shared/_index.axaml" />
<ResourceInclude Source="avares://Semi.Avalonia/Locale/zh-cn.axaml" />
<ResourceInclude Source="avares://Semi.Avalonia/Icons/_index.axaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Styles.Resources>

View File

@@ -1,6 +0,0 @@
<ResourceDictionary xmlns="https://github.com/avaloniaui" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<StaticResource x:Key="SemiIconCaretDown" ResourceKey="SemiIconCaretdown" />
<StaticResource x:Key="SemiIconCaretUp" ResourceKey="SemiIconCaretup" />
<StaticResource x:Key="SemiIconCheckBoxIndeterminate" ResourceKey="SemiIconCheckboxIndeterminate" />
<StaticResource x:Key="SemiIconCheckBoxTick" ResourceKey="SemiIconCheckboxTick" />
</ResourceDictionary>

View File

@@ -1,8 +1,6 @@
<ResourceDictionary xmlns="https://github.com/avaloniaui" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<ResourceDictionary.MergedDictionaries>
<ResourceInclude Source="avares://Semi.Avalonia/Themes/Shared/Palette.axaml" />
<ResourceInclude Source="avares://Semi.Avalonia/Themes/Shared/Icon.axaml" />
<ResourceInclude Source="avares://Semi.Avalonia/Themes/Shared/IconPatch.axaml" />
<!-- Controls -->
<ResourceInclude Source="avares://Semi.Avalonia/Themes/Shared/AdornerLayer.axaml" />
<ResourceInclude Source="avares://Semi.Avalonia/Themes/Shared/AutoCompleteBox.axaml" />