A cross-platform UI framework for .NET
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

73 lines
3.1 KiB

using System;
using Avalonia.Controls.Primitives;
using Avalonia.Data;
using Avalonia.Interactivity;
using Avalonia.Reactive;
namespace Avalonia.Controls;
internal class NativeMenuBarPresenter : Menu
{
protected override Type StyleKeyOverride => typeof(Menu);
internal static Control? CreateContainerForNativeItem(object? item, int index, object? recycleKey)
{
if (item is NativeMenuItemSeparator)
{
return new Separator();
}
else if (item is NativeMenuItem nativeItem)
{
var newItem = new NativeMenuItemPresenter
{
ItemsSource = nativeItem.Menu?.Items,
[!HeaderedSelectingItemsControl.HeaderProperty] =
nativeItem.GetObservable(NativeMenuItem.HeaderProperty).ToBinding(),
[!MenuItem.IconProperty] = nativeItem.GetObservable(NativeMenuItem.IconProperty)
.Select(i => i is { } bitmap ? new Image { Source = bitmap } : null).ToBinding(),
[!!MenuItem.IsCheckedProperty] = nativeItem[!!NativeMenuItem.IsCheckedProperty],
[!MenuItem.IsEnabledProperty] = nativeItem.GetObservable(NativeMenuItem.IsEnabledProperty).ToBinding(),
[!MenuItem.IsVisibleProperty] = nativeItem.GetObservable(NativeMenuItem.IsVisibleProperty).ToBinding(),
[!MenuItem.CommandProperty] = nativeItem.GetObservable(NativeMenuItem.CommandProperty).ToBinding(),
[!MenuItem.CommandParameterProperty] =
nativeItem.GetObservable(NativeMenuItem.CommandParameterProperty).ToBinding(),
[!MenuItem.InputGestureProperty] = nativeItem.GetObservable(NativeMenuItem.GestureProperty).ToBinding(),
[!MenuItem.ToggleTypeProperty] = nativeItem.GetObservable(NativeMenuItem.ToggleTypeProperty).ToBinding(),
[!ToolTip.TipProperty] =
nativeItem.GetObservable(NativeMenuItem.ToolTipProperty).ToBinding(),
};
newItem.Click += MenuItemOnClick;
return newItem;
}
return null;
static void MenuItemOnClick(object? sender, RoutedEventArgs e)
{
if (((MenuItem)sender!).DataContext is NativeMenuItem item
&& item.HasClickHandlers && item is INativeMenuItemExporterEventsImplBridge bridge)
{
bridge.RaiseClicked();
}
}
}
protected internal override Control CreateContainerForItemOverride(object? item, int index, object? recycleKey)
{
return CreateContainerForNativeItem(item, index, recycleKey)
?? base.CreateContainerForItemOverride(item, index, recycleKey);
}
private class NativeMenuItemPresenter : MenuItem
{
protected override Type StyleKeyOverride => typeof(MenuItem);
protected internal override Control CreateContainerForItemOverride(object? item, int index, object? recycleKey)
{
return CreateContainerForNativeItem(item, index, recycleKey)
?? base.CreateContainerForItemOverride(item, index, recycleKey);
}
}
}