MenuViewModel.cs 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. using Avalonia.Collections;
  2. using CommunityToolkit.Mvvm.Input;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Diagnostics.CodeAnalysis;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. using System.Windows.Input;
  10. namespace IViewModel.ViewModels
  11. {
  12. public sealed class MenuViewModel:ViewModelBase
  13. {
  14. public IReadOnlyList<string> MainMenus { get; } = [nameof(LanguageValueViewModel.MenuFile),nameof(LanguageValueViewModel.MenuDevice),nameof(LanguageValueViewModel.MenuAbout)];
  15. public ICommand Command => new RelayCommand<MenuItemViewModel?>((p) => MenuClick?.Invoke(this,p));
  16. public event EventHandler<MenuItemViewModel?> MenuClick;
  17. private bool isMenuVisible = true;
  18. public bool IsMenuVisible { get => isMenuVisible; set => SetProperty(ref isMenuVisible, value); }
  19. public MenuItemViewModel? this[string key]
  20. {
  21. get
  22. {
  23. MenuItemViewModel? menu = null;
  24. foreach (var item in Menus)
  25. {
  26. menu = GetMenuItem(item, key);
  27. if(menu!=null)return menu;
  28. }
  29. return menu;
  30. }
  31. }
  32. private MenuItemViewModel? GetMenuItem(MenuItemViewModel menuItem,string key)
  33. {
  34. if (menuItem == null ) return null;
  35. if(menuItem.Header == key)return menuItem;
  36. if( menuItem.Items == null || menuItem.Items.Count == 0)return null;
  37. foreach (var item in menuItem.Items)
  38. {
  39. var tempmenu= GetMenuItem(item, key);
  40. if(tempmenu!=null)return tempmenu;
  41. }
  42. return null;
  43. }
  44. public AvaloniaList<MenuItemViewModel> Menus { get; } = new AvaloniaList<MenuItemViewModel>();
  45. private MenuViewModel()
  46. {
  47. Menus.AddRange(MainMenus.Select(x => new MenuItemViewModel()
  48. {
  49. Header = x,
  50. }));
  51. }
  52. static MenuViewModel()
  53. {
  54. }
  55. public static MenuViewModel Instance { get; } = new MenuViewModel();
  56. }
  57. public sealed class MenuOrderAttribute : Attribute
  58. {
  59. public MenuOrderAttribute(int order) => Order = order;
  60. public int Order { get; }
  61. }
  62. }