Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 932c912

Browse files
committedDec 1, 2022
Change ContextMenuAutomationPeer to inherit from ItemsControlAutomationPeer
This is required to support peer generation for group items. GroupItemAutomationPeer will only create automation peers if the automation peer of its parent inherit from ItemsControlAutomationPeer. Otherwise the groups child are invisible for ui automation tools. Fix #6530
1 parent 9386760 commit 932c912

File tree

4 files changed

+191
-4
lines changed

4 files changed

+191
-4
lines changed
 

‎src/Microsoft.DotNet.Wpf/src/PresentationFramework/PresentationFramework.csproj‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -478,6 +478,7 @@
478478
<Compile Include="System\Windows\Automation\Peers\ListViewAutomationPeer.cs" />
479479
<Compile Include="System\Windows\Automation\Peers\MediaElementAutomationPeer.cs" />
480480
<Compile Include="System\Windows\Automation\Peers\MenuAutomationPeer.cs" />
481+
<Compile Include="System\Windows\Automation\Peers\MenuItemDataAutomationPeer.cs" />
481482
<Compile Include="System\Windows\Automation\Peers\MenuItemAutomationPeer.cs" />
482483
<Compile Include="System\Windows\Automation\Peers\NavigationWindowAutomationPeer.cs" />
483484
<Compile Include="System\Windows\Automation\Peers\PasswordBoxAutomationPeer.cs" />

‎src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/Automation/Peers/ContextMenuAutomationPeer.cs‎

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
namespace System.Windows.Automation.Peers
2222
{
2323
///
24-
public class ContextMenuAutomationPeer : FrameworkElementAutomationPeer
24+
public class ContextMenuAutomationPeer : ItemsControlAutomationPeer
2525
{
2626
///
2727
public ContextMenuAutomationPeer(ContextMenu owner): base(owner)
@@ -46,6 +46,11 @@ protected override bool IsContentElementCore()
4646
{
4747
return false;
4848
}
49+
50+
protected override ItemAutomationPeer CreateItemAutomationPeer(object item)
51+
{
52+
return new MenuItemDataAutomationPeer(item, this);
53+
}
4954
}
5055
}
5156

Lines changed: 166 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,166 @@
1+
// Licensed to the .NET Foundation under one or more agreements.
2+
// The .NET Foundation licenses this file to you under the MIT license.
3+
// See the LICENSE file in the project root for more information.
4+
5+
using System;
6+
using System.Windows.Automation.Provider;
7+
8+
9+
namespace System.Windows.Automation.Peers
10+
{
11+
public class MenuItemDataAutomationPeer : ItemAutomationPeer, IExpandCollapseProvider, IInvokeProvider, IToggleProvider
12+
{
13+
#region Constructors
14+
15+
public MenuItemDataAutomationPeer(object item, ItemsControlAutomationPeer itemsControlPeer)
16+
: base(item, itemsControlPeer)
17+
{
18+
}
19+
20+
#endregion
21+
22+
#region AutomationPeer overrides
23+
24+
protected override string GetClassNameCore()
25+
{
26+
AutomationPeer wrapperPeer = GetWrapperPeer();
27+
if (wrapperPeer != null)
28+
{
29+
return wrapperPeer.GetClassName();
30+
}
31+
32+
return "MenuItem";
33+
}
34+
35+
protected override AutomationControlType GetAutomationControlTypeCore()
36+
{
37+
AutomationPeer wrapperPeer = GetWrapperPeer();
38+
if (wrapperPeer != null)
39+
{
40+
return wrapperPeer.GetAutomationControlType();
41+
}
42+
43+
return AutomationControlType.MenuItem;
44+
}
45+
46+
public override object GetPattern(PatternInterface patternInterface)
47+
{
48+
switch (patternInterface)
49+
{
50+
case PatternInterface.ExpandCollapse:
51+
case PatternInterface.Invoke:
52+
case PatternInterface.Toggle:
53+
return this;
54+
}
55+
56+
return base.GetPattern(patternInterface);
57+
}
58+
59+
private void EnsureEnabled()
60+
{
61+
62+
FrameworkElementAutomationPeer itemsControllerPeer = GetItemsControlAutomationPeer();
63+
if (!itemsControllerPeer.IsEnabled())
64+
{
65+
throw new ElementNotEnabledException();
66+
}
67+
}
68+
69+
#endregion
70+
71+
#region IExpandCollapseProvider Members
72+
73+
void IExpandCollapseProvider.Expand()
74+
{
75+
MenuItemAutomationPeer wrapperPeer = GetWrapperPeer() as MenuItemAutomationPeer;
76+
if (wrapperPeer != null)
77+
{
78+
IExpandCollapseProvider expandCollapseProvider = wrapperPeer as IExpandCollapseProvider;
79+
expandCollapseProvider.Expand();
80+
}
81+
ThrowElementNotAvailableException();
82+
}
83+
84+
void IExpandCollapseProvider.Collapse()
85+
{
86+
MenuItemAutomationPeer wrapperPeer = GetWrapperPeer() as MenuItemAutomationPeer;
87+
if (wrapperPeer != null)
88+
{
89+
IExpandCollapseProvider expandCollapseProvider = wrapperPeer as IExpandCollapseProvider;
90+
expandCollapseProvider.Collapse();
91+
}
92+
ThrowElementNotAvailableException();
93+
}
94+
95+
ExpandCollapseState IExpandCollapseProvider.ExpandCollapseState
96+
{
97+
get
98+
{
99+
MenuItemAutomationPeer wrapperPeer = GetWrapperPeer() as MenuItemAutomationPeer;
100+
if (wrapperPeer != null)
101+
{
102+
IExpandCollapseProvider expandCollapseProvider = wrapperPeer as IExpandCollapseProvider;
103+
return expandCollapseProvider.ExpandCollapseState;
104+
}
105+
ThrowElementNotAvailableException();
106+
return ExpandCollapseState.LeafNode;
107+
}
108+
}
109+
110+
#endregion
111+
112+
#region IInvokeProvider Members
113+
114+
void IInvokeProvider.Invoke()
115+
{
116+
// check if enabled
117+
EnsureEnabled();
118+
119+
MenuItemAutomationPeer wrapperPeer = GetWrapperPeer() as MenuItemAutomationPeer;
120+
if (wrapperPeer != null)
121+
{
122+
IInvokeProvider invokeProvider = wrapperPeer as IInvokeProvider;
123+
invokeProvider.Invoke();
124+
}
125+
else
126+
{
127+
ThrowElementNotAvailableException();
128+
}
129+
}
130+
131+
#endregion
132+
133+
#region IToggleProvider Members
134+
135+
void IToggleProvider.Toggle()
136+
{
137+
MenuItemAutomationPeer wrapperPeer = GetWrapperPeer() as MenuItemAutomationPeer;
138+
if (wrapperPeer != null)
139+
{
140+
IToggleProvider toggleProvider = wrapperPeer as IToggleProvider;
141+
toggleProvider.Toggle();
142+
}
143+
else
144+
{
145+
ThrowElementNotAvailableException();
146+
}
147+
}
148+
149+
ToggleState IToggleProvider.ToggleState
150+
{
151+
get
152+
{
153+
MenuItemAutomationPeer wrapperPeer = GetWrapperPeer() as MenuItemAutomationPeer;
154+
if (wrapperPeer != null)
155+
{
156+
IToggleProvider toggleProvider = wrapperPeer as IToggleProvider;
157+
return toggleProvider.ToggleState;
158+
}
159+
ThrowElementNotAvailableException();
160+
return ToggleState.Indeterminate;
161+
}
162+
}
163+
164+
#endregion
165+
}
166+
}

‎src/Microsoft.DotNet.Wpf/src/PresentationFramework/ref/PresentationFramework.cs‎

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2353,12 +2353,13 @@ public abstract partial class ContentTextAutomationPeer : System.Windows.Automat
23532353
protected ContentTextAutomationPeer(System.Windows.FrameworkContentElement owner) : base (default(System.Windows.FrameworkContentElement)) { }
23542354
public virtual void RaiseActiveTextPositionChangedEvent(System.Windows.Documents.TextPointer rangeStart, System.Windows.Documents.TextPointer rangeEnd) { }
23552355
}
2356-
public partial class ContextMenuAutomationPeer : System.Windows.Automation.Peers.FrameworkElementAutomationPeer
2356+
public partial class ContextMenuAutomationPeer : System.Windows.Automation.Peers.ItemsControlAutomationPeer
23572357
{
2358-
public ContextMenuAutomationPeer(System.Windows.Controls.ContextMenu owner) : base (default(System.Windows.FrameworkElement)) { }
2358+
public ContextMenuAutomationPeer(System.Windows.Controls.ContextMenu owner) : base (default(System.Windows.Controls.ItemsControl)) { }
23592359
protected override System.Windows.Automation.Peers.AutomationControlType GetAutomationControlTypeCore() { throw null; }
23602360
protected override string GetClassNameCore() { throw null; }
23612361
protected override bool IsContentElementCore() { throw null; }
2362+
protected override System.Windows.Automation.Peers.ItemAutomationPeer CreateItemAutomationPeer(object item) { throw null; }
23622363
}
23632364
public sealed partial class DataGridAutomationPeer : System.Windows.Automation.Peers.ItemsControlAutomationPeer, System.Windows.Automation.Provider.IGridProvider, System.Windows.Automation.Provider.ISelectionProvider, System.Windows.Automation.Provider.ITableProvider
23642365
{
@@ -2892,6 +2893,20 @@ public MenuAutomationPeer(System.Windows.Controls.Menu owner) : base (default(Sy
28922893
protected override string GetClassNameCore() { throw null; }
28932894
protected override bool IsContentElementCore() { throw null; }
28942895
}
2896+
2897+
public partial class MenuItemDataAutomationPeer : System.Windows.Automation.Peers.ItemAutomationPeer, System.Windows.Automation.Provider.IExpandCollapseProvider, System.Windows.Automation.Provider.IInvokeProvider, System.Windows.Automation.Provider.IToggleProvider
2898+
{
2899+
public MenuItemDataAutomationPeer(object item, ItemsControlAutomationPeer itemsControlPeer) : base(default(object), default(System.Windows.Automation.Peers.ItemsControlAutomationPeer)) { }
2900+
System.Windows.Automation.ExpandCollapseState System.Windows.Automation.Provider.IExpandCollapseProvider.ExpandCollapseState { get { throw null; } }
2901+
System.Windows.Automation.ToggleState System.Windows.Automation.Provider.IToggleProvider.ToggleState { get { throw null; } }
2902+
protected override string GetClassNameCore() { throw null; }
2903+
protected override AutomationControlType GetAutomationControlTypeCore() { throw null; }
2904+
void System.Windows.Automation.Provider.IExpandCollapseProvider.Expand() { }
2905+
void System.Windows.Automation.Provider.IExpandCollapseProvider.Collapse() { }
2906+
void System.Windows.Automation.Provider.IInvokeProvider.Invoke() { throw null; }
2907+
void System.Windows.Automation.Provider.IToggleProvider.Toggle() { throw null; }
2908+
}
2909+
28952910
public partial class MenuItemAutomationPeer : System.Windows.Automation.Peers.FrameworkElementAutomationPeer, System.Windows.Automation.Provider.IExpandCollapseProvider, System.Windows.Automation.Provider.IInvokeProvider, System.Windows.Automation.Provider.IToggleProvider
28962911
{
28972912
public MenuItemAutomationPeer(System.Windows.Controls.MenuItem owner) : base (default(System.Windows.FrameworkElement)) { }
@@ -2910,7 +2925,7 @@ void System.Windows.Automation.Provider.IExpandCollapseProvider.Expand() { }
29102925
void System.Windows.Automation.Provider.IInvokeProvider.Invoke() { }
29112926
void System.Windows.Automation.Provider.IToggleProvider.Toggle() { }
29122927
}
2913-
public partial class NavigationWindowAutomationPeer : System.Windows.Automation.Peers.WindowAutomationPeer
2928+
public partial class NavigationWindowAutomationPeer : System.Windows.Automation.Peers.WindowAutomationPeer
29142929
{
29152930
public NavigationWindowAutomationPeer(System.Windows.Navigation.NavigationWindow owner) : base (default(System.Windows.Window)) { }
29162931
protected override string GetClassNameCore() { throw null; }

0 commit comments

Comments
 (0)
Please sign in to comment.