Browse Source

Merge pull request #8055 from Megapit/Megapit_NativeMenuBar_Icons

make NativeMenuBar showing the Icons
Max Katz 3 years ago
parent
commit
247300e50a

+ 3 - 0
src/Avalonia.Themes.Default/Controls/NativeMenuBar.xaml

@@ -4,6 +4,7 @@
        Selector="NativeMenuBar">
   <Style.Resources>
     <local:InverseBooleanValueConverter x:Key="AvaloniaThemesDefaultNativeMenuBarInverseBooleanValueConverter" Default="True"/>
+    <local:IBitmapToImageConverter x:Key="AvaloniaThemesDefaultNativeMenuBarIBitmapToImageConverterr"/>
   </Style.Resources>
   <Setter Property="Template">
     <ControlTemplate>
@@ -18,6 +19,8 @@
             <Setter Property="Command" Value="{Binding Command}"/>
             <Setter Property="CommandParameter" Value="{Binding CommandParameter}"/>
             <Setter Property="(NativeMenuBar.EnableMenuItemClickForwarding)" Value="True"/>
+            <!--NativeMenuItem is IBitmap and MenuItem is Image-->
+            <Setter Property="Icon" Value="{Binding Icon , Converter={StaticResource AvaloniaThemesDefaultNativeMenuBarIBitmapToImageConverterr}}"/>
           </Style>
         </Menu.Styles>
       </Menu>

+ 28 - 0
src/Avalonia.Themes.Default/IBitmapToImageConverter.cs

@@ -0,0 +1,28 @@
+using System;
+using System.Collections.Generic;
+using System.Globalization;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Avalonia.Controls;
+using Avalonia.Data.Converters;
+using Avalonia.Media.Imaging;
+
+namespace Avalonia.Themes.Default
+{
+    internal class IBitmapToImageConverter : IValueConverter
+    {
+        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
+        {
+            if (value != null && value is IBitmap bm)
+                return new Image { Source=bm };
+                
+            return null;
+        }
+
+        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
+        {
+            throw new NotImplementedException();
+        }
+    }
+}

+ 5 - 2
src/Avalonia.Themes.Fluent/Controls/NativeMenuBar.xaml

@@ -4,12 +4,13 @@
        x:CompileBindings="True"
        Selector="NativeMenuBar">
   <Style.Resources>
-    <local:InverseBooleanValueConverter x:Key="AvaloniaThemesDefaultNativeMenuBarInverseBooleanValueConverter" Default="True"/>
+    <local:InverseBooleanValueConverter x:Key="AvaloniaThemesFluentNativeMenuBarInverseBooleanValueConverter" Default="True"/>
+    <local:IBitmapToImageConverter x:Key="AvaloniaThemesFluentNativeMenuBarIBitmapToImageConverter"/>
   </Style.Resources>
   <Setter Property="Template">
     <ControlTemplate>
       <Menu
-        IsVisible="{Binding $parent[TopLevel].(NativeMenu.IsNativeMenuExported), Converter={StaticResource AvaloniaThemesDefaultNativeMenuBarInverseBooleanValueConverter}}"
+        IsVisible="{Binding $parent[TopLevel].(NativeMenu.IsNativeMenuExported), Converter={StaticResource AvaloniaThemesFluentNativeMenuBarInverseBooleanValueConverter}}"
         Items="{Binding $parent[TopLevel].(NativeMenu.Menu).Items}">
         <Menu.Styles>
           <Style x:CompileBindings="False" Selector="MenuItem">
@@ -19,6 +20,8 @@
             <Setter Property="Command" Value="{Binding Command}"/>
             <Setter Property="CommandParameter" Value="{Binding CommandParameter}"/>
             <Setter Property="(NativeMenuBar.EnableMenuItemClickForwarding)" Value="True"/>
+            <!--NativeMenuItem is IBitmap and MenuItem is Image-->
+            <Setter Property="Icon" Value="{Binding Icon , Converter={StaticResource AvaloniaThemesFluentNativeMenuBarIBitmapToImageConverter}}"/>
           </Style>
         </Menu.Styles>
       </Menu>

+ 28 - 0
src/Avalonia.Themes.Fluent/IBitmapToImageConverter.cs

@@ -0,0 +1,28 @@
+using System;
+using System.Collections.Generic;
+using System.Globalization;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Avalonia.Controls;
+using Avalonia.Data.Converters;
+using Avalonia.Media.Imaging;
+
+namespace Avalonia.Themes.Fluent
+{
+    internal class IBitmapToImageConverter : IValueConverter
+    {
+        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
+        {
+            if (value != null && value is IBitmap bm)
+                return new Image { Source=bm };
+                
+            return null;
+        }
+
+        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
+        {
+            throw new NotImplementedException();
+        }
+    }
+}