Browse Source

Add Icon property to nativemenuicon.

pull/3839/head
Dan Walmsley 6 years ago
parent
commit
01342b1b6f
  1. 12
      src/Avalonia.Controls/NativeMenuItem.cs
  2. 29
      src/Avalonia.Native/IAvnMenuItem.cs

12
src/Avalonia.Controls/NativeMenuItem.cs

@ -1,6 +1,7 @@
using System; using System;
using System.Windows.Input; using System.Windows.Input;
using Avalonia.Input; using Avalonia.Input;
using Avalonia.Media.Imaging;
using Avalonia.Utilities; using Avalonia.Utilities;
namespace Avalonia.Controls namespace Avalonia.Controls
@ -13,6 +14,7 @@ namespace Avalonia.Controls
private ICommand _command; private ICommand _command;
private bool _isChecked = false; private bool _isChecked = false;
private NativeMenuItemToggleType _toggleType; private NativeMenuItemToggleType _toggleType;
private IBitmap _icon;
private NativeMenu _menu; private NativeMenu _menu;
@ -71,6 +73,16 @@ namespace Avalonia.Controls
} }
} }
public static readonly DirectProperty<NativeMenuItem, IBitmap> IconProperty =
AvaloniaProperty.RegisterDirect<NativeMenuItem, IBitmap>(nameof(Icon), o => o.Icon, (o, v) => o.Icon = v);
public IBitmap Icon
{
get => _icon;
set => SetAndRaise(IconProperty, ref _icon, value);
}
public static readonly DirectProperty<NativeMenuItem, string> HeaderProperty = public static readonly DirectProperty<NativeMenuItem, string> HeaderProperty =
AvaloniaProperty.RegisterDirect<NativeMenuItem, string>(nameof(Header), o => o.Header, (o, v) => o.Header = v); AvaloniaProperty.RegisterDirect<NativeMenuItem, string>(nameof(Header), o => o.Header, (o, v) => o.Header = v);

29
src/Avalonia.Native/IAvnMenuItem.cs

@ -1,6 +1,8 @@
using System; using System;
using System.IO;
using System.Reactive.Disposables; using System.Reactive.Disposables;
using Avalonia.Controls; using Avalonia.Controls;
using Avalonia.Media.Imaging;
using Avalonia.Platform.Interop; using Avalonia.Platform.Interop;
namespace Avalonia.Native.Interop namespace Avalonia.Native.Interop
@ -31,6 +33,28 @@ namespace Avalonia.Native.Interop
ToggleType = (AvnMenuItemToggleType)toggleType; ToggleType = (AvnMenuItemToggleType)toggleType;
} }
private unsafe void UpdateIcon (IBitmap icon)
{
if(icon is null)
{
SetIcon(IntPtr.Zero, 0);
}
else
{
using(var ms = new MemoryStream())
{
icon.Save(ms);
var imageData = ms.ToArray();
fixed(void* ptr = imageData)
{
SetIcon(new IntPtr(ptr), imageData.Length);
}
}
}
}
private void UpdateGesture(Input.KeyGesture gesture) private void UpdateGesture(Input.KeyGesture gesture)
{ {
// todo ensure backend can cope with setting null gesture. // todo ensure backend can cope with setting null gesture.
@ -80,6 +104,8 @@ namespace Avalonia.Native.Interop
UpdateToggleType(item.ToggleType); UpdateToggleType(item.ToggleType);
UpdateIcon(item.Icon);
UpdateIsChecked(item.IsChecked); UpdateIsChecked(item.IsChecked);
_propertyDisposables.Add(ManagedMenuItem.GetObservable(NativeMenuItem.HeaderProperty) _propertyDisposables.Add(ManagedMenuItem.GetObservable(NativeMenuItem.HeaderProperty)
@ -96,6 +122,9 @@ namespace Avalonia.Native.Interop
_propertyDisposables.Add(ManagedMenuItem.GetObservable(NativeMenuItem.IsCheckedProperty) _propertyDisposables.Add(ManagedMenuItem.GetObservable(NativeMenuItem.IsCheckedProperty)
.Subscribe(x => UpdateIsChecked(x))); .Subscribe(x => UpdateIsChecked(x)));
_propertyDisposables.Add(ManagedMenuItem.GetObservable(NativeMenuItem.IconProperty)
.Subscribe(x => UpdateIcon(x)));
} }
} }

Loading…
Cancel
Save