From 4491fa1fdde439e840beb1281b19b521947eb5b4 Mon Sep 17 00:00:00 2001 From: Difegue Date: Tue, 24 Sep 2024 18:16:28 +0200 Subject: [PATCH] Add narration support to NavigationViewItem --- .../NavigationView/NavigationViewItem.cs | 6 ++ .../NavigationViewItemAutomationPeer.cs | 72 +++++++++++++++++++ 2 files changed, 78 insertions(+) create mode 100644 src/Wpf.Ui/Controls/NavigationView/NavigationViewItemAutomationPeer.cs diff --git a/src/Wpf.Ui/Controls/NavigationView/NavigationViewItem.cs b/src/Wpf.Ui/Controls/NavigationView/NavigationViewItem.cs index e85c80677..3eaa41b40 100644 --- a/src/Wpf.Ui/Controls/NavigationView/NavigationViewItem.cs +++ b/src/Wpf.Ui/Controls/NavigationView/NavigationViewItem.cs @@ -8,6 +8,7 @@ using System.Collections; using System.Collections.ObjectModel; using System.Collections.Specialized; +using System.Windows.Automation.Peers; using System.Windows.Controls; using System.Windows.Input; @@ -438,6 +439,11 @@ protected override void OnMouseDown(MouseButtonEventArgs e) e.Handled = true; } + protected override AutomationPeer OnCreateAutomationPeer() + { + return new NavigationViewItemAutomationPeer(this); + } + private void OnMenuItems_CollectionChanged(object? sender, NotifyCollectionChangedEventArgs e) { SetValue(HasMenuItemsPropertyKey, MenuItems.Count > 0); diff --git a/src/Wpf.Ui/Controls/NavigationView/NavigationViewItemAutomationPeer.cs b/src/Wpf.Ui/Controls/NavigationView/NavigationViewItemAutomationPeer.cs new file mode 100644 index 000000000..7a78729c5 --- /dev/null +++ b/src/Wpf.Ui/Controls/NavigationView/NavigationViewItemAutomationPeer.cs @@ -0,0 +1,72 @@ +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. +// Copyright (C) Leszek Pomianowski and WPF UI Contributors. +// All Rights Reserved. + +using System.Windows.Automation; +using System.Windows.Automation.Peers; + +namespace Wpf.Ui.Controls; + +internal class NavigationViewItemAutomationPeer : FrameworkElementAutomationPeer +{ + private readonly NavigationViewItem _owner; + + public NavigationViewItemAutomationPeer(NavigationViewItem owner) + : base(owner) + { + _owner = owner; + } + + protected override string GetClassNameCore() + { + return "NavigationItem"; + } + + protected override AutomationControlType GetAutomationControlTypeCore() + { + return AutomationControlType.TabItem; + } + + public override object GetPattern(PatternInterface patternInterface) + { + if (patternInterface == PatternInterface.ItemContainer) + { + return this; + } + + return base.GetPattern(patternInterface); + } + + protected override AutomationPeer GetLabeledByCore() + { + if (_owner.Content is UIElement element) + { + return CreatePeerForElement(element); + } + + return base.GetLabeledByCore(); + } + + protected override string GetNameCore() + { + var result = base.GetNameCore() ?? string.Empty; + + if (result == string.Empty) + { + result = AutomationProperties.GetName(_owner); + } + + if (result == string.Empty && _owner.Content is DependencyObject d) + { + result = AutomationProperties.GetName(d); + } + + if (result == string.Empty && _owner.Content is string s) + { + result = s; + } + + return result; + } +}