IconResourceSourceGenerator.cs 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. using Microsoft.CodeAnalysis;
  2. using System;
  3. using System.Text;
  4. using System.Xml;
  5. namespace IconResourceSourceGenerator
  6. {
  7. [Generator(LanguageNames.CSharp)]
  8. public class IconResourceSourceGenerator : IIncrementalGenerator
  9. {
  10. public void Initialize(IncrementalGeneratorInitializationContext context)
  11. {
  12. string name = typeof(IconResourceSourceGenerator).Assembly.GetManifestResourceNames().First(x => x.IndexOf("IconResource.axaml") >= 0);
  13. var stream = typeof(IconResourceSourceGenerator).Assembly.GetManifestResourceStream(name);
  14. XmlDocument document = new XmlDocument();
  15. document.PreserveWhitespace = false;
  16. document.Load(stream);
  17. var val = document.ChildNodes[0]!.ChildNodes.Cast<System.Xml.XmlNode>().Where(x => x.NodeType == XmlNodeType.Element && x.Attributes?.Count > 0).Select(x => (x!.Attributes![0]!.Value, x.InnerText)).ToList();
  18. if (val.Count > 0)
  19. {
  20. context.RegisterPostInitializationOutput(c =>
  21. {
  22. StringBuilder stringBuilder = new StringBuilder();
  23. stringBuilder.AppendLine("using Avalonia.Collections;");
  24. stringBuilder.AppendLine("using Avalonia.Controls;");
  25. stringBuilder.AppendLine("using Avalonia.Markup.Xaml;");
  26. stringBuilder.AppendLine("using Avalonia.Media;");
  27. stringBuilder.AppendLine("using System;");
  28. stringBuilder.AppendLine("namespace IViewModel.ViewModels");
  29. stringBuilder.AppendLine("{");
  30. stringBuilder.AppendLine(" public sealed class IconResourceValueViewModel :ViewModelBase");
  31. stringBuilder.AppendLine(" {");
  32. stringBuilder.AppendLine($" public StreamGeometry this[string key] => (StreamGeometry)Avalonia.Application.Current?.FindResource(key);");
  33. stringBuilder.AppendLine(" private IconResourceValueViewModel()");
  34. stringBuilder.AppendLine(" {");
  35. stringBuilder.AppendLine(" }");
  36. stringBuilder.AppendLine(" static IconResourceValueViewModel()");
  37. stringBuilder.AppendLine(" {");
  38. stringBuilder.AppendLine(" }");
  39. stringBuilder.AppendLine(" public static IconResourceValueViewModel Instance {get;}= new IconResourceValueViewModel();");
  40. foreach (var item in val)
  41. {
  42. stringBuilder.AppendLine($" /// <summary>");
  43. stringBuilder.AppendLine($" /// {item.Value}");
  44. stringBuilder.AppendLine($" /// </summary>");
  45. stringBuilder.AppendLine($" public StreamGeometry {item.Value} {"{get;}"}= StreamGeometry.Parse(\"{item.InnerText}\");");
  46. }
  47. stringBuilder.AppendLine(" }");
  48. stringBuilder.AppendLine("}");
  49. c.AddSource("IconResourceValueViewModel.g.cs", stringBuilder.ToString());
  50. });
  51. }
  52. }
  53. }
  54. }