diff --git a/src/Wpf.Ui/Controls/CardAction/CardAction.cs b/src/Wpf.Ui/Controls/CardAction/CardAction.cs index dc73e9189..9614b8388 100644 --- a/src/Wpf.Ui/Controls/CardAction/CardAction.cs +++ b/src/Wpf.Ui/Controls/CardAction/CardAction.cs @@ -4,6 +4,8 @@ // All Rights Reserved. // ReSharper disable once CheckNamespace +using System.Windows.Automation.Peers; + namespace Wpf.Ui.Controls; /// @@ -48,4 +50,9 @@ public IconElement? Icon get => (IconElement?)GetValue(IconProperty); set => SetValue(IconProperty, value); } -} + + protected override AutomationPeer OnCreateAutomationPeer() + { + return new CardActionAutomationPeer(this); + } +} \ No newline at end of file diff --git a/src/Wpf.Ui/Controls/CardAction/CardActionAutomationPeer.cs b/src/Wpf.Ui/Controls/CardAction/CardActionAutomationPeer.cs new file mode 100644 index 000000000..ffba11b5f --- /dev/null +++ b/src/Wpf.Ui/Controls/CardAction/CardActionAutomationPeer.cs @@ -0,0 +1,77 @@ +// 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; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Automation; +using System.Windows.Automation.Peers; + +namespace Wpf.Ui.Controls; + +internal class CardActionAutomationPeer : FrameworkElementAutomationPeer +{ + private readonly CardAction _owner; + + public CardActionAutomationPeer(CardAction owner) + : base(owner) + { + _owner = owner; + } + + protected override string GetClassNameCore() + { + return "Button"; + } + + protected override AutomationControlType GetAutomationControlTypeCore() + { + return AutomationControlType.Button; + } + + 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; + } +} diff --git a/src/Wpf.Ui/Controls/Menu/MenuItem.xaml b/src/Wpf.Ui/Controls/Menu/MenuItem.xaml index 61a176453..da8cb5f73 100644 --- a/src/Wpf.Ui/Controls/Menu/MenuItem.xaml +++ b/src/Wpf.Ui/Controls/Menu/MenuItem.xaml @@ -74,6 +74,16 @@ ContentSource="Header" RecognizesAccessKey="True" TextElement.Foreground="{TemplateBinding Foreground}" /> + + + + @@ -264,6 +284,17 @@ FontSize="11" Foreground="{DynamicResource TextFillColorDisabledBrush}" Text="{TemplateBinding InputGestureText}" /> + + + @@ -334,6 +365,17 @@ FontSize="{TemplateBinding FontSize}" Symbol="ChevronRight20" /> + + + 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; + } +}