Browse Source

attempt at application menu pre-pending.

Dan Walmsley 6 years ago
parent
commit
92e0e2bccc

+ 29 - 3
samples/ControlCatalog/App.xaml

@@ -2,9 +2,9 @@
              xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
              x:Class="ControlCatalog.App">
   <Application.Styles>
-      <StyleInclude Source="avares://Avalonia.Themes.Default/DefaultTheme.xaml"/>
-      <StyleInclude Source="avares://Avalonia.Themes.Default/Accents/BaseLight.xaml"/>
-      <StyleInclude Source="avares://Avalonia.Controls.DataGrid/Themes/Default.xaml"/>
+    <StyleInclude Source="avares://Avalonia.Themes.Default/DefaultTheme.xaml"/>
+    <StyleInclude Source="avares://Avalonia.Themes.Default/Accents/BaseLight.xaml"/>
+    <StyleInclude Source="avares://Avalonia.Controls.DataGrid/Themes/Default.xaml"/>
     <Style Selector="TextBlock.h1">
       <Setter Property="FontSize" Value="{DynamicResource FontSizeLarge}"/>
       <Setter Property="FontWeight" Value="Medium"/>
@@ -17,4 +17,30 @@
     </Style>
     <StyleInclude Source="/SideBar.xaml"/>
   </Application.Styles>
+
+  <NativeMenu.Menu>
+    <NativeMenu>
+      <NativeMenuItem>
+        <NativeMenuItem.Menu>
+          <NativeMenu>
+            <NativeMenuItem Header="About Avalonia" />
+            <NativeMenuItem Header="Preferences" Gesture="CMD + ," />
+            <NativeMenuItem Header="Services">
+              <NativeMenuItem.Menu>
+                <NativeMenu>
+                  <NativeMenuItem Header="Service 1"/>
+                  <NativeMenuItem Header="Service 2"/>
+                  <NativeMenuItem Header="Service 3"/>
+                </NativeMenu>
+              </NativeMenuItem.Menu>
+            </NativeMenuItem>
+            <NativeMenuItem Header="Hide Avalonia" Gesture="CMD + H" />
+            <NativeMenuItem Header="Hide Others" Gesture="ALT + CMD + H" />
+            <NativeMenuItem Header="Show All" />
+            <NativeMenuItem Header="Quit Avalonia" Gesture="CMD + Q" />
+          </NativeMenu>
+        </NativeMenuItem.Menu>
+      </NativeMenuItem>
+    </NativeMenu>
+  </NativeMenu.Menu>
 </Application>

+ 1 - 1
samples/ControlCatalog/MainWindow.xaml

@@ -7,7 +7,7 @@
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:vm="clr-namespace:ControlCatalog.ViewModels"
         xmlns:v="clr-namespace:ControlCatalog.Views"
-        x:Class="ControlCatalog.MainWindow">
+        x:Class="ControlCatalog.MainWindow" NativeMenu.PrependApplicationMenu="True">
 
   <NativeMenu.Menu>
     <NativeMenu>

+ 14 - 1
src/Avalonia.Native/AvaloniaNativeMenuExporter.cs

@@ -1,6 +1,7 @@
 using System;
 using System.Collections.Generic;
 using System.Collections.Specialized;
+using System.Linq;
 using System.Text;
 using Avalonia.Controls;
 using Avalonia.Controls.Platform;
@@ -47,6 +48,7 @@ namespace Avalonia.Native
         private bool _resetQueued;                
         private bool _exported = false;
         private IAvnWindow _nativeWindow;
+        private bool _prependAppMenu;
         private List<NativeMenuItem> _menuItems = new List<NativeMenuItem>(); 
 
         public AvaloniaNativeMenuExporter(IAvnWindow nativeWindow, IAvaloniaNativeFactory factory)
@@ -74,7 +76,7 @@ namespace Avalonia.Native
 
         public void SetPrependApplicationMenu(bool prepend)
         {
-            throw new NotImplementedException();
+            _prependAppMenu = prepend;
         }
 
         private void OnItemPropertyChanged(object sender, AvaloniaPropertyChangedEventArgs e)
@@ -235,6 +237,17 @@ namespace Avalonia.Native
 
         private void SetMenu(IAvnWindow avnWindow, ICollection<NativeMenuItem> menuItems)
         {
+            if (_prependAppMenu)
+            {
+                var menu = NativeMenu.GetMenu(Application.Current);
+
+                var items = menuItems.ToList();
+
+                items.InsertRange(0, menu.Items);
+
+                menuItems = items;
+            }
+
             var appMenu = avnWindow.ObtainMainMenu();
 
             if(appMenu is null)