diff --git a/src/settings-ui/Microsoft.PowerToys.Settings.UI/Strings/en-us/Resources.resw b/src/settings-ui/Microsoft.PowerToys.Settings.UI/Strings/en-us/Resources.resw
index a3a4ce388dc5..d34379b9d6d6 100644
--- a/src/settings-ui/Microsoft.PowerToys.Settings.UI/Strings/en-us/Resources.resw
+++ b/src/settings-ui/Microsoft.PowerToys.Settings.UI/Strings/en-us/Resources.resw
@@ -249,6 +249,14 @@ Disabling this module or closing PowerToys will unmute the microphone and camera
Keyboard Manager
Product name: Navigation view item name for Keyboard Manager
+
+ Navigation closed
+ Accessibility announcement when the navigation pane collapses
+
+
+ Navigation opened
+ Accessibility announcement when the navigation pane opens
+
Current configuration
Keyboard Manager current configuration header
@@ -1376,14 +1384,14 @@ From there, simply click on a Markdown file or SVG icon in the File Explorer and
Are you sure you want to delete this item?
-
+
Yes
Label of a confirmation button
-
+
Learn more
-
+
Show format in editor
\ No newline at end of file
diff --git a/src/settings-ui/Microsoft.PowerToys.Settings.UI/Views/ShellPage.xaml b/src/settings-ui/Microsoft.PowerToys.Settings.UI/Views/ShellPage.xaml
index 87ef6bef0e43..db375f5f2c88 100644
--- a/src/settings-ui/Microsoft.PowerToys.Settings.UI/Views/ShellPage.xaml
+++ b/src/settings-ui/Microsoft.PowerToys.Settings.UI/Views/ShellPage.xaml
@@ -28,6 +28,8 @@
OpenPaneLength="296"
CompactModeThresholdWidth="0"
Background="{ThemeResource SystemControlBackgroundAltHighBrush}"
+ PaneOpened="NavigationView_PaneOpened"
+ PaneClosed="NavigationView_PaneClosed"
SelectionChanged="NavigationView_SelectionChanged">
diff --git a/src/settings-ui/Microsoft.PowerToys.Settings.UI/Views/ShellPage.xaml.cs b/src/settings-ui/Microsoft.PowerToys.Settings.UI/Views/ShellPage.xaml.cs
index 110104ee7583..979102199080 100644
--- a/src/settings-ui/Microsoft.PowerToys.Settings.UI/Views/ShellPage.xaml.cs
+++ b/src/settings-ui/Microsoft.PowerToys.Settings.UI/Views/ShellPage.xaml.cs
@@ -7,7 +7,9 @@
using System.Diagnostics.CodeAnalysis;
using Microsoft.PowerToys.Settings.UI.Services;
using Microsoft.PowerToys.Settings.UI.ViewModels;
+using Windows.ApplicationModel.Resources;
using Windows.Data.Json;
+using Windows.UI.Xaml.Automation.Peers;
using Windows.UI.Xaml.Controls;
namespace Microsoft.PowerToys.Settings.UI.Views
@@ -161,5 +163,61 @@ private void NavigationView_SelectionChanged(Microsoft.UI.Xaml.Controls.Navigati
{
scrollViewer.ChangeView(null, 0, null, true);
}
+
+ private bool navigationViewInitialStateProcessed; // avoid announcing initial state of the navigation pane.
+
+ [SuppressMessage("Usage", "CA1801:Review unused parameters", Justification = "Params are required for event handler signature requirements.")]
+#pragma warning disable CA1822 // Mark members as static
+ private void NavigationView_PaneOpened(Microsoft.UI.Xaml.Controls.NavigationView sender, object args)
+ {
+ if (!navigationViewInitialStateProcessed)
+ {
+ navigationViewInitialStateProcessed = true;
+ return;
+ }
+
+ var peer = FrameworkElementAutomationPeer.FromElement(sender);
+ if (peer == null)
+ {
+ peer = FrameworkElementAutomationPeer.CreatePeerForElement(sender);
+ }
+
+ if (AutomationPeer.ListenerExists(AutomationEvents.MenuOpened))
+ {
+ var loader = Windows.ApplicationModel.Resources.ResourceLoader.GetForCurrentView();
+ peer.RaiseNotificationEvent(
+ AutomationNotificationKind.ActionCompleted,
+ AutomationNotificationProcessing.ImportantMostRecent,
+ loader.GetString("Shell_NavigationMenu_Announce_Open"),
+ "navigationMenuPaneOpened");
+ }
+ }
+
+ [SuppressMessage("Usage", "CA1801:Review unused parameters", Justification = "Params are required for event handler signature requirements.")]
+ private void NavigationView_PaneClosed(Microsoft.UI.Xaml.Controls.NavigationView sender, object args)
+ {
+ if (!navigationViewInitialStateProcessed)
+ {
+ navigationViewInitialStateProcessed = true;
+ return;
+ }
+
+ var peer = FrameworkElementAutomationPeer.FromElement(sender);
+ if (peer == null)
+ {
+ peer = FrameworkElementAutomationPeer.CreatePeerForElement(sender);
+ }
+
+ if (AutomationPeer.ListenerExists(AutomationEvents.MenuClosed))
+ {
+ var loader = Windows.ApplicationModel.Resources.ResourceLoader.GetForCurrentView();
+ peer.RaiseNotificationEvent(
+ AutomationNotificationKind.ActionCompleted,
+ AutomationNotificationProcessing.ImportantMostRecent,
+ loader.GetString("Shell_NavigationMenu_Announce_Collapse"),
+ "navigationMenuPaneClosed");
+ }
+ }
+#pragma warning restore CA1822 // Mark members as static
}
}