AvaloniaMenuItem.cs 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. using Avalonia.Controls;
  2. using Avalonia.Media;
  3. using CommunityToolkit.Mvvm.ComponentModel;
  4. using CommunityToolkit.Mvvm.Input;
  5. using InABox.Core;
  6. namespace InABox.Avalonia.Components;
  7. public partial class AvaloniaMenuItem : ObservableObject
  8. {
  9. [ObservableProperty]
  10. private RelayCommand<List<AvaloniaMenuItem>>? _buildMenuCommand;
  11. [ObservableProperty]
  12. private ContextMenu? _contextMenu;
  13. [ObservableProperty]
  14. private IImage? _image;
  15. [ObservableProperty]
  16. private RelayCommand? _tapCommand;
  17. [ObservableProperty]
  18. private bool _isVisible = true;
  19. public AvaloniaMenuItem()
  20. {
  21. }
  22. public AvaloniaMenuItem(IImage? image, Func<Task<bool>> action)
  23. : this(image, () => null, action)
  24. {
  25. }
  26. public AvaloniaMenuItem(IImage? image, Func<CoreMenu<IImage>?> build, Func<Task<bool>>? action = null)
  27. {
  28. Image = image; //LoadImage(image);
  29. TapCommand = new RelayCommand(() =>
  30. {
  31. CoreMenu<IImage>? menu = build();
  32. if (menu != null)
  33. {
  34. var context = new ContextMenu();
  35. LoadMenuItems(menu.Items, context.Items);
  36. ContextMenu = context;
  37. ContextMenu.Open();
  38. }
  39. else if (action != null)
  40. {
  41. _ = action();
  42. }
  43. });
  44. //_contextMenu = new();
  45. //LoadMenuItems(build().Items,_contextMenu.Items);
  46. }
  47. private void LoadMenuItems(IEnumerable<ICoreMenuItem> sourceItems, ItemCollection targetItems)
  48. {
  49. foreach (var sourceItem in sourceItems)
  50. if (sourceItem is CoreMenuSeparator)
  51. {
  52. targetItems.Add(new Separator());
  53. }
  54. else if (sourceItem is CoreMenuItem<IImage> item)
  55. {
  56. var targetItem = new MenuItem
  57. {
  58. Header = item.Header,
  59. Icon = new Image { Source = item.Image },
  60. Command = item.Action != null
  61. ? new RelayCommand(() => item.Action())
  62. : null
  63. };
  64. targetItems.Add(targetItem);
  65. }
  66. else if (sourceItem is CoreMenuHeader<IImage> header)
  67. {
  68. var targetItem = new MenuItem
  69. {
  70. Header = header.Header,
  71. Icon = header.Image
  72. };
  73. LoadMenuItems(header.Items, targetItem.Items);
  74. targetItems.Add(targetItem);
  75. }
  76. }
  77. }