diff --git a/samples/ControlCatalog/MainWindow.xaml b/samples/ControlCatalog/MainWindow.xaml
index 248f94082d..d25de9c1f5 100644
--- a/samples/ControlCatalog/MainWindow.xaml
+++ b/samples/ControlCatalog/MainWindow.xaml
@@ -14,7 +14,7 @@
-
+
@@ -22,7 +22,9 @@
-
+
diff --git a/samples/ControlCatalog/MainWindow.xaml.cs b/samples/ControlCatalog/MainWindow.xaml.cs
index 38cbde9d92..b40fdb4a17 100644
--- a/samples/ControlCatalog/MainWindow.xaml.cs
+++ b/samples/ControlCatalog/MainWindow.xaml.cs
@@ -1,13 +1,11 @@
+using System;
+using System.Runtime.InteropServices;
using Avalonia;
using Avalonia.Controls;
using Avalonia.Controls.Notifications;
-using Avalonia.Controls.Primitives;
+using Avalonia.Input;
using Avalonia.Markup.Xaml;
-using Avalonia.Threading;
using ControlCatalog.ViewModels;
-using System;
-using System.Collections.Generic;
-using System.Threading.Tasks;
namespace ControlCatalog
{
@@ -35,6 +33,12 @@ namespace ControlCatalog
mainMenu.AttachedToVisualTree += MenuAttached;
}
+ public static string MenuQuitHeader => RuntimeInformation.IsOSPlatform(OSPlatform.OSX) ? "Quit Avalonia" : "E_xit";
+
+ public static KeyGesture MenuQuitGesture => RuntimeInformation.IsOSPlatform(OSPlatform.OSX) ?
+ new KeyGesture(Key.Q, KeyModifiers.Meta) :
+ new KeyGesture(Key.F4, KeyModifiers.Alt);
+
public void MenuAttached(object sender, VisualTreeAttachmentEventArgs e)
{
if (NativeMenu.GetIsNativeMenuExported(this) && sender is Menu mainMenu)
diff --git a/src/Avalonia.Input/KeyGesture.cs b/src/Avalonia.Input/KeyGesture.cs
index 490c31bef9..36920fdaad 100644
--- a/src/Avalonia.Input/KeyGesture.cs
+++ b/src/Avalonia.Input/KeyGesture.cs
@@ -1,9 +1,10 @@
-// Copyright (c) The Avalonia Project. All rights reserved.
+// Copyright (c) The Avalonia Project. All rights reserved.
// Licensed under the MIT license. See licence.md file in the project root for full license information.
using System;
using System.Collections.Generic;
using System.Linq;
+using System.Text;
namespace Avalonia.Input
{
@@ -108,19 +109,43 @@ namespace Avalonia.Input
public override string ToString()
{
- var parts = new List();
+ var s = new StringBuilder();
- foreach (var flag in Enum.GetValues(typeof(KeyModifiers)).Cast())
+ static void Plus(StringBuilder s)
{
- if (KeyModifiers.HasFlag(flag) && flag != KeyModifiers.None)
+ if (s.Length > 0)
{
- parts.Add(flag.ToString());
+ s.Append("+");
}
}
- parts.Add(Key.ToString());
+ if (KeyModifiers.HasFlagCustom(KeyModifiers.Control))
+ {
+ s.Append("Ctrl");
+ }
+
+ if (KeyModifiers.HasFlagCustom(KeyModifiers.Shift))
+ {
+ Plus(s);
+ s.Append("Shift");
+ }
+
+ if (KeyModifiers.HasFlagCustom(KeyModifiers.Alt))
+ {
+ Plus(s);
+ s.Append("Alt");
+ }
+
+ if (KeyModifiers.HasFlagCustom(KeyModifiers.Meta))
+ {
+ Plus(s);
+ s.Append("⌘");
+ }
+
+ Plus(s);
+ s.Append(Key);
- return string.Join(" + ", parts);
+ return s.ToString();
}
public bool Matches(KeyEventArgs keyEvent) => ResolveNumPadOperationKey(keyEvent.Key) == Key && keyEvent.KeyModifiers == KeyModifiers;
@@ -141,7 +166,8 @@ namespace Avalonia.Input
return KeyModifiers.Control;
}
- if (modifier.Equals("cmd".AsSpan(), StringComparison.OrdinalIgnoreCase))
+ if (modifier.Equals("cmd".AsSpan(), StringComparison.OrdinalIgnoreCase) ||
+ modifier.Equals("⌘".AsSpan(), StringComparison.OrdinalIgnoreCase))
{
return KeyModifiers.Meta;
}
diff --git a/src/Avalonia.Themes.Default/NativeMenuBar.xaml b/src/Avalonia.Themes.Default/NativeMenuBar.xaml
index 2832bab226..5d21378a64 100644
--- a/src/Avalonia.Themes.Default/NativeMenuBar.xaml
+++ b/src/Avalonia.Themes.Default/NativeMenuBar.xaml
@@ -13,6 +13,7 @@