csharpc-sharpdotnetxamlavaloniauicross-platformcross-platform-xamlavaloniaguimulti-platformuser-interfacedotnetcore
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
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);
|
|
}
|
|
}
|
|
}
|
|
|