From 55ec58b4e3dd50c7d75be3e32f81fcca68e0e1e9 Mon Sep 17 00:00:00 2001 From: Leaf Shi Date: Wed, 15 Oct 2025 18:01:25 +0800 Subject: [PATCH] Place the TabPanel as a child of the TabItem --- .../TabControl.TabControlAccessibleObject.cs | 4 +++- .../TabControl/TabPage.TabAccessibleObject.cs | 18 ++++++++++++--- .../TabPage.TabPageAccessibleObject.cs | 23 +++++++------------ 3 files changed, 26 insertions(+), 19 deletions(-) diff --git a/src/System.Windows.Forms/System/Windows/Forms/Controls/TabControl/TabControl.TabControlAccessibleObject.cs b/src/System.Windows.Forms/System/Windows/Forms/Controls/TabControl/TabControl.TabControlAccessibleObject.cs index 8176f07446c..284809df9a9 100644 --- a/src/System.Windows.Forms/System/Windows/Forms/Controls/TabControl/TabControl.TabControlAccessibleObject.cs +++ b/src/System.Windows.Forms/System/Windows/Forms/Controls/TabControl/TabControl.TabControlAccessibleObject.cs @@ -117,7 +117,9 @@ public override int GetChildCount() return direction switch { - NavigateDirection.NavigateDirection_FirstChild => owner.SelectedTab?.AccessibilityObject, + NavigateDirection.NavigateDirection_FirstChild => owner.TabPages.Count > 0 + ? owner.TabPages[0].TabAccessibilityObject + : null, NavigateDirection.NavigateDirection_LastChild => owner.TabPages.Count > 0 ? owner.TabPages[^1].TabAccessibilityObject : null, diff --git a/src/System.Windows.Forms/System/Windows/Forms/Controls/TabControl/TabPage.TabAccessibleObject.cs b/src/System.Windows.Forms/System/Windows/Forms/Controls/TabControl/TabPage.TabAccessibleObject.cs index 14d5d6d135e..e3c02c1251f 100644 --- a/src/System.Windows.Forms/System/Windows/Forms/Controls/TabControl/TabPage.TabAccessibleObject.cs +++ b/src/System.Windows.Forms/System/Windows/Forms/Controls/TabControl/TabPage.TabAccessibleObject.cs @@ -95,12 +95,24 @@ public override void DoDefaultAction() return null; } + int index = OwningTabControl.TabPages.IndexOf(_owningTabPage); + return direction switch { NavigateDirection.NavigateDirection_Parent => OwningTabControl.AccessibilityObject, - NavigateDirection.NavigateDirection_NextSibling => OwningTabControl.AccessibilityObject.GetChild(GetChildId() + 1), - NavigateDirection.NavigateDirection_PreviousSibling => OwningTabControl.AccessibilityObject.GetChild(GetChildId() - 1), - _ => null + NavigateDirection.NavigateDirection_FirstChild => + index == OwningTabControl.SelectedIndex + ? _owningTabPage.AccessibilityObject // Panel + : null, + NavigateDirection.NavigateDirection_NextSibling => + index < OwningTabControl.TabPages.Count - 1 + ? OwningTabControl.TabPages[index + 1].TabAccessibilityObject + : null, + NavigateDirection.NavigateDirection_PreviousSibling => + index > 0 + ? OwningTabControl.TabPages[index - 1].TabAccessibilityObject + : null, + _ => base.FragmentNavigate(direction) }; } diff --git a/src/System.Windows.Forms/System/Windows/Forms/Controls/TabControl/TabPage.TabPageAccessibleObject.cs b/src/System.Windows.Forms/System/Windows/Forms/Controls/TabControl/TabPage.TabPageAccessibleObject.cs index bdbc7349a0f..339b332b3a4 100644 --- a/src/System.Windows.Forms/System/Windows/Forms/Controls/TabControl/TabPage.TabPageAccessibleObject.cs +++ b/src/System.Windows.Forms/System/Windows/Forms/Controls/TabControl/TabPage.TabPageAccessibleObject.cs @@ -11,14 +11,19 @@ public partial class TabPage { internal sealed class TabPageAccessibleObject : ControlAccessibleObject { - public TabPageAccessibleObject(TabPage owningTabPage) : base(owningTabPage) { } + private readonly TabPage _owningTabPage; + + public TabPageAccessibleObject(TabPage owningTabPage) : base(owningTabPage) + { + _owningTabPage = owningTabPage; + } internal override Rectangle BoundingRectangle => this.IsOwnerHandleCreated(out TabPage? owner) ? owner.GetPageRectangle() : Rectangle.Empty; public override AccessibleStates State => SystemIAccessible.TryGetState(GetChildId()); - internal override IRawElementProviderFragmentRoot.Interface? FragmentRoot => OwningTabControl?.AccessibilityObject; + internal override IRawElementProviderFragmentRoot.Interface? FragmentRoot => _owningTabPage?.TabAccessibilityObject; private TabControl? OwningTabControl => this.TryGetOwnerAs(out TabPage? owningTabPage) ? owningTabPage.ParentInternal as TabControl : null; @@ -52,9 +57,7 @@ public override int GetChildCount() return direction switch { - NavigateDirection.NavigateDirection_Parent => OwningTabControl?.AccessibilityObject, - NavigateDirection.NavigateDirection_NextSibling => GetNextSibling(), - NavigateDirection.NavigateDirection_PreviousSibling => null, + NavigateDirection.NavigateDirection_Parent => _owningTabPage?.TabAccessibilityObject, _ => base.FragmentNavigate(direction) }; } @@ -78,15 +81,5 @@ internal override bool IsPatternSupported(UIA_PATTERN_ID patternId) UIA_PATTERN_ID.UIA_ValuePatternId => false, _ => base.IsPatternSupported(patternId) }; - - private TabAccessibleObject? GetNextSibling() - { - if (!this.TryGetOwnerAs(out TabPage? owningTabPage) || OwningTabControl is null || owningTabPage != OwningTabControl.SelectedTab) - { - return null; - } - - return OwningTabControl.TabPages.Count > 0 ? OwningTabControl.TabPages[0].TabAccessibilityObject : null; - } } }