NativeMenuBarPresenter.cs 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. using System;
  2. using Avalonia.Controls.Primitives;
  3. using Avalonia.Data;
  4. using Avalonia.Interactivity;
  5. using Avalonia.Reactive;
  6. namespace Avalonia.Controls;
  7. internal class NativeMenuBarPresenter : Menu
  8. {
  9. protected override Type StyleKeyOverride => typeof(Menu);
  10. internal static Control? CreateContainerForNativeItem(object? item, int index, object? recycleKey)
  11. {
  12. if (item is NativeMenuItemSeparator)
  13. {
  14. return new Separator();
  15. }
  16. else if (item is NativeMenuItem nativeItem)
  17. {
  18. var newItem = new NativeMenuItemPresenter
  19. {
  20. ItemsSource = nativeItem.Menu?.Items,
  21. [!HeaderedSelectingItemsControl.HeaderProperty] =
  22. nativeItem.GetObservable(NativeMenuItem.HeaderProperty).ToBinding(),
  23. [!MenuItem.IconProperty] = nativeItem.GetObservable(NativeMenuItem.IconProperty)
  24. .Select(i => i is { } bitmap ? new Image { Source = bitmap } : null).ToBinding(),
  25. [!!MenuItem.IsCheckedProperty] = nativeItem[!!NativeMenuItem.IsCheckedProperty],
  26. [!MenuItem.IsEnabledProperty] = nativeItem.GetObservable(NativeMenuItem.IsEnabledProperty).ToBinding(),
  27. [!MenuItem.IsVisibleProperty] = nativeItem.GetObservable(NativeMenuItem.IsVisibleProperty).ToBinding(),
  28. [!MenuItem.CommandProperty] = nativeItem.GetObservable(NativeMenuItem.CommandProperty).ToBinding(),
  29. [!MenuItem.CommandParameterProperty] =
  30. nativeItem.GetObservable(NativeMenuItem.CommandParameterProperty).ToBinding(),
  31. [!MenuItem.InputGestureProperty] = nativeItem.GetObservable(NativeMenuItem.GestureProperty).ToBinding(),
  32. [!MenuItem.ToggleTypeProperty] = nativeItem.GetObservable(NativeMenuItem.ToggleTypeProperty)
  33. // TODO12 remove NativeMenuItemToggleType
  34. .Select(v => (MenuItemToggleType)v).ToBinding(),
  35. [!ToolTip.TipProperty] =
  36. nativeItem.GetObservable(NativeMenuItem.ToolTipProperty).ToBinding(),
  37. };
  38. newItem.Click += MenuItemOnClick;
  39. return newItem;
  40. }
  41. return null;
  42. static void MenuItemOnClick(object? sender, RoutedEventArgs e)
  43. {
  44. if (((MenuItem)sender!).DataContext is NativeMenuItem item
  45. && item.HasClickHandlers && item is INativeMenuItemExporterEventsImplBridge bridge)
  46. {
  47. bridge.RaiseClicked();
  48. }
  49. }
  50. }
  51. protected internal override Control CreateContainerForItemOverride(object? item, int index, object? recycleKey)
  52. {
  53. return CreateContainerForNativeItem(item, index, recycleKey)
  54. ?? base.CreateContainerForItemOverride(item, index, recycleKey);
  55. }
  56. private class NativeMenuItemPresenter : MenuItem
  57. {
  58. protected override Type StyleKeyOverride => typeof(MenuItem);
  59. protected internal override Control CreateContainerForItemOverride(object? item, int index, object? recycleKey)
  60. {
  61. return CreateContainerForNativeItem(item, index, recycleKey)
  62. ?? base.CreateContainerForItemOverride(item, index, recycleKey);
  63. }
  64. }
  65. }