MarkupExtensions.cs 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. using Avalonia.Data.Core;
  2. using Avalonia.Markup.Xaml;
  3. using Avalonia.Markup.Xaml.MarkupExtensions;
  4. using Avalonia.Markup.Xaml.MarkupExtensions.CompiledBindings;
  5. using Projektanker.Icons.Avalonia;
  6. using Ryujinx.Ava.Common.Locale;
  7. using System;
  8. namespace Ryujinx.Ava.Common.Markup
  9. {
  10. internal class IconExtension(string iconString) : BasicMarkupExtension
  11. {
  12. protected override ClrPropertyInfo PropertyInfo
  13. => new(
  14. "Item",
  15. _ => new Icon { Value = iconString },
  16. null,
  17. typeof(Icon)
  18. );
  19. }
  20. internal class SpinningIconExtension(string iconString) : BasicMarkupExtension
  21. {
  22. protected override ClrPropertyInfo PropertyInfo
  23. => new(
  24. "Item",
  25. _ => new Icon { Value = iconString, Animation = IconAnimation.Spin },
  26. null,
  27. typeof(Icon)
  28. );
  29. }
  30. internal class LocaleExtension(LocaleKeys key) : MarkupExtension
  31. {
  32. private ClrPropertyInfo PropertyInfo
  33. => new(
  34. "Item",
  35. _ => LocaleManager.Instance[key],
  36. null,
  37. typeof(string)
  38. );
  39. public override object ProvideValue(IServiceProvider serviceProvider) =>
  40. new CompiledBindingExtension(
  41. new CompiledBindingPathBuilder()
  42. .Property(PropertyInfo, PropertyInfoAccessorFactory.CreateInpcPropertyAccessor)
  43. .Build()
  44. ) { Source = LocaleManager.Instance }
  45. .ProvideValue(serviceProvider);
  46. }
  47. }