Browse Source

Add Icon property to nativemenuicon.

Dan Walmsley 5 years ago
parent
commit
01342b1b6f
2 changed files with 41 additions and 0 deletions
  1. 12 0
      src/Avalonia.Controls/NativeMenuItem.cs
  2. 29 0
      src/Avalonia.Native/IAvnMenuItem.cs

+ 12 - 0
src/Avalonia.Controls/NativeMenuItem.cs

@@ -1,6 +1,7 @@
 using System;
 using System.Windows.Input;
 using Avalonia.Input;
+using Avalonia.Media.Imaging;
 using Avalonia.Utilities;
 
 namespace Avalonia.Controls
@@ -13,6 +14,7 @@ namespace Avalonia.Controls
         private ICommand _command;
         private bool _isChecked = false;
         private NativeMenuItemToggleType _toggleType;
+        private IBitmap _icon;
 
         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 =
             AvaloniaProperty.RegisterDirect<NativeMenuItem, string>(nameof(Header), o => o.Header, (o, v) => o.Header = v);
 

+ 29 - 0
src/Avalonia.Native/IAvnMenuItem.cs

@@ -1,6 +1,8 @@
 using System;
+using System.IO;
 using System.Reactive.Disposables;
 using Avalonia.Controls;
+using Avalonia.Media.Imaging;
 using Avalonia.Platform.Interop;
 
 namespace Avalonia.Native.Interop
@@ -31,6 +33,28 @@ namespace Avalonia.Native.Interop
             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)
         {
             // todo ensure backend can cope with setting null gesture.
@@ -80,6 +104,8 @@ namespace Avalonia.Native.Interop
 
                 UpdateToggleType(item.ToggleType);
 
+                UpdateIcon(item.Icon);
+
                 UpdateIsChecked(item.IsChecked);
 
                 _propertyDisposables.Add(ManagedMenuItem.GetObservable(NativeMenuItem.HeaderProperty)
@@ -96,6 +122,9 @@ namespace Avalonia.Native.Interop
 
                 _propertyDisposables.Add(ManagedMenuItem.GetObservable(NativeMenuItem.IsCheckedProperty)
                     .Subscribe(x => UpdateIsChecked(x)));
+
+                _propertyDisposables.Add(ManagedMenuItem.GetObservable(NativeMenuItem.IconProperty)
+                    .Subscribe(x => UpdateIcon(x)));
             }
         }