1
0

MenuPage.xaml.cs 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. using System.Collections.Generic;
  2. using System.Reactive;
  3. using System.Threading.Tasks;
  4. using System.Windows.Input;
  5. using Avalonia.Controls;
  6. using Avalonia.Markup.Xaml;
  7. using ReactiveUI;
  8. namespace ControlCatalog.Pages
  9. {
  10. public class MenuPage : UserControl
  11. {
  12. public MenuPage()
  13. {
  14. this.InitializeComponent();
  15. var vm = new MenuPageViewModel();
  16. vm.MenuItems = new[]
  17. {
  18. new MenuItemViewModel
  19. {
  20. Header = "_File",
  21. Items = new[]
  22. {
  23. new MenuItemViewModel { Header = "_Open...", Command = vm.OpenCommand },
  24. new MenuItemViewModel { Header = "Save", Command = vm.SaveCommand },
  25. new MenuItemViewModel { Header = "-" },
  26. new MenuItemViewModel
  27. {
  28. Header = "Recent",
  29. Items = new[]
  30. {
  31. new MenuItemViewModel
  32. {
  33. Header = "File1.txt",
  34. Command = vm.OpenRecentCommand,
  35. CommandParameter = @"c:\foo\File1.txt"
  36. },
  37. new MenuItemViewModel
  38. {
  39. Header = "File2.txt",
  40. Command = vm.OpenRecentCommand,
  41. CommandParameter = @"c:\foo\File2.txt"
  42. },
  43. }
  44. },
  45. }
  46. },
  47. new MenuItemViewModel
  48. {
  49. Header = "_Edit",
  50. Items = new[]
  51. {
  52. new MenuItemViewModel { Header = "_Copy" },
  53. new MenuItemViewModel { Header = "_Paste" },
  54. }
  55. }
  56. };
  57. DataContext = vm;
  58. }
  59. private void InitializeComponent()
  60. {
  61. AvaloniaXamlLoader.Load(this);
  62. }
  63. }
  64. public class MenuPageViewModel
  65. {
  66. public MenuPageViewModel()
  67. {
  68. OpenCommand = ReactiveCommand.CreateFromTask(Open);
  69. SaveCommand = ReactiveCommand.Create(Save);
  70. OpenRecentCommand = ReactiveCommand.Create<string>(OpenRecent);
  71. }
  72. public IReadOnlyList<MenuItemViewModel> MenuItems { get; set; }
  73. public ReactiveCommand<Unit, Unit> OpenCommand { get; }
  74. public ReactiveCommand<Unit, Unit> SaveCommand { get; }
  75. public ReactiveCommand<string, Unit> OpenRecentCommand { get; }
  76. public async Task Open()
  77. {
  78. var dialog = new OpenFileDialog();
  79. var result = await dialog.ShowAsync();
  80. if (result != null)
  81. {
  82. foreach (var path in result)
  83. {
  84. System.Diagnostics.Debug.WriteLine($"Opened: {path}");
  85. }
  86. }
  87. }
  88. public void Save()
  89. {
  90. System.Diagnostics.Debug.WriteLine("Save");
  91. }
  92. public void OpenRecent(string path)
  93. {
  94. System.Diagnostics.Debug.WriteLine($"Open recent: {path}");
  95. }
  96. }
  97. public class MenuItemViewModel
  98. {
  99. public string Header { get; set; }
  100. public ICommand Command { get; set; }
  101. public object CommandParameter { get; set; }
  102. public IList<MenuItemViewModel> Items { get; set; }
  103. }
  104. }