ResourceBinding.cs 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. using Avalonia;
  2. using Avalonia.Controls;
  3. using Avalonia.Data;
  4. using Avalonia.Data.Converters;
  5. using Avalonia.Markup.Xaml;
  6. using Avalonia.Markup.Xaml.MarkupExtensions;
  7. using System;
  8. using System.Collections.Generic;
  9. using System.Globalization;
  10. namespace ShakerApp
  11. {
  12. /// <summary>
  13. /// 多语言绑定时使用,没有其他任何功能
  14. /// </summary>
  15. public class ResourceBindingExtensions
  16. {
  17. public static readonly AttachedProperty<object?> BindingExtensionProperty = AvaloniaProperty.RegisterAttached<Control, object?>("BindingExtension", typeof(Control), defaultValue: null);
  18. public static object? GetBindingExtension(Control control) => control.GetValue(BindingExtensionProperty);
  19. public static void SetBindingExtension(Control control, object? value) => control.SetValue(BindingExtensionProperty, value);
  20. }
  21. public class ResourceBinding : MarkupExtension
  22. {
  23. private PathConverter converter = new PathConverter();
  24. public ResourceBinding(string path)
  25. {
  26. this.Path = path;
  27. }
  28. public override object ProvideValue(IServiceProvider serviceProvider)
  29. {
  30. var provideValueTargetService = (IProvideValueTarget)serviceProvider.GetService(typeof(IProvideValueTarget))!;
  31. var targetObject = provideValueTargetService.TargetObject as Control;
  32. var targetProperty = provideValueTargetService.TargetProperty as AvaloniaProperty;
  33. if (targetObject == null || targetProperty == null) return null;
  34. Binding binding = new Binding()
  35. {
  36. Path = Path,
  37. Converter = converter,
  38. ConverterParameter = new KeyValuePair<Control,AvaloniaProperty>(targetObject,targetProperty),
  39. Mode = BindingMode.OneWay,
  40. UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged,
  41. };
  42. targetObject.Bind(ResourceBindingExtensions.BindingExtensionProperty, binding);
  43. return null;
  44. }
  45. /// <summary>
  46. /// The source path (for CLR bindings).
  47. /// </summary>
  48. public string Path { get; set; }
  49. private class PathConverter : IValueConverter
  50. {
  51. public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture)
  52. {
  53. if (parameter is KeyValuePair<Control, AvaloniaProperty> p && value is string v)
  54. {
  55. p.Key.Bind(p.Value, new DynamicResourceExtension(v));
  56. }
  57. return "";
  58. }
  59. public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture)
  60. {
  61. throw new NotImplementedException();
  62. }
  63. }
  64. }
  65. }