From 26109a2828e77357ba155d81cf4720336768d4f2 Mon Sep 17 00:00:00 2001 From: Marcel Wagner Date: Sat, 27 Jun 2020 20:05:50 +0200 Subject: [PATCH 1/2] Fix issue with collapse being announced on NavViewItem with no children --- dev/NavigationView/NavigationViewItem.h | 2 +- .../NavigationViewItemAutomationPeer.cpp | 14 ++++++++++++-- .../NavigationViewItemAutomationPeer.h | 1 + 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/dev/NavigationView/NavigationViewItem.h b/dev/NavigationView/NavigationViewItem.h index 99978e0117..cff70cbcd0 100644 --- a/dev/NavigationView/NavigationViewItem.h +++ b/dev/NavigationView/NavigationViewItem.h @@ -58,6 +58,7 @@ class NavigationViewItem : void RotateExpandCollapseChevron(bool isExpanded); bool IsRepeaterVisible() const; void PropagateDepthToChildren(int depth); + bool HasChildren(); private: winrt::UIElement const GetPresenterOrItem() const; @@ -97,7 +98,6 @@ class NavigationViewItem : bool ShouldEnableToolTip() const; bool IsOnLeftNav() const; bool IsOnTopPrimary() const; - bool HasChildren(); void UpdateRepeaterItemsSource(); void ReparentRepeater(); diff --git a/dev/NavigationView/NavigationViewItemAutomationPeer.cpp b/dev/NavigationView/NavigationViewItemAutomationPeer.cpp index fb2add6650..fdcc74465e 100644 --- a/dev/NavigationView/NavigationViewItemAutomationPeer.cpp +++ b/dev/NavigationView/NavigationViewItemAutomationPeer.cpp @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. See LICENSE in the project root for license information. #include "pch.h" @@ -48,7 +48,8 @@ winrt::IInspectable NavigationViewItemAutomationPeer::GetPatternCore(winrt::Patt { if (pattern == winrt::PatternInterface::SelectionItem || pattern == winrt::PatternInterface::Invoke || - pattern == winrt::PatternInterface::ExpandCollapse) + // Only provide expand collapse pattern if we have children! + (pattern == winrt::PatternInterface::ExpandCollapse && HasChildren())) { return *this; } @@ -457,3 +458,12 @@ void NavigationViewItemAutomationPeer::ChangeSelection(bool isSelected) nvi.IsSelected(isSelected); } } + +bool NavigationViewItemAutomationPeer::HasChildren() +{ + if (const auto& navigationViewItem = Owner().try_as()) + { + return navigationViewItem->HasChildren(); + } + return false; +} diff --git a/dev/NavigationView/NavigationViewItemAutomationPeer.h b/dev/NavigationView/NavigationViewItemAutomationPeer.h index 387e6e48ed..f84a8a9ba0 100644 --- a/dev/NavigationView/NavigationViewItemAutomationPeer.h +++ b/dev/NavigationView/NavigationViewItemAutomationPeer.h @@ -62,4 +62,5 @@ class NavigationViewItemAutomationPeer : int32_t GetPositionOrSetCountInLeftNavHelper(AutomationOutput automationOutput); int32_t GetPositionOrSetCountInTopNavHelper(AutomationOutput automationOutput); void ChangeSelection(bool isSelected); + bool HasChildren(); }; From 71e0f6bcfd65369b538ec4fdcb1c9b7529ca4b22 Mon Sep 17 00:00:00 2001 From: Marcel Wagner Date: Sat, 27 Jun 2020 20:05:56 +0200 Subject: [PATCH 2/2] Add test --- .../NavigationViewTests.cs | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/dev/NavigationView/NavigationView_ApiTests/NavigationViewTests.cs b/dev/NavigationView/NavigationView_ApiTests/NavigationViewTests.cs index a3f1c295c5..43ad0c5244 100644 --- a/dev/NavigationView/NavigationView_ApiTests/NavigationViewTests.cs +++ b/dev/NavigationView/NavigationView_ApiTests/NavigationViewTests.cs @@ -535,6 +535,37 @@ public void VerifyNavigationItemUIAType() }); } + [TestMethod] + public void VerifyAutomationPeerExpandCollapsePatternBehavior() + { + RunOnUIThread.Execute(() => + { + + var menuItem1 = new NavigationViewItem(); + var menuItem2 = new NavigationViewItem(); + var menuItem3 = new NavigationViewItem(); + var menuItem4 = new NavigationViewItem(); + menuItem1.Content = "Item 1"; + menuItem2.Content = "Item 2"; + menuItem3.Content = "Item 3"; + menuItem4.Content = "Item 4"; + + menuItem2.MenuItems.Add(menuItem3); + menuItem4.HasUnrealizedChildren = true; + + var expandPeer = NavigationViewItemAutomationPeer.CreatePeerForElement(menuItem1).GetPattern(PatternInterface.ExpandCollapse); + + Verify.IsNull(expandPeer,"Verify NavigationViewItem with no children has no ExpandCollapse pattern"); + + expandPeer = NavigationViewItemAutomationPeer.CreatePeerForElement(menuItem2).GetPattern(PatternInterface.ExpandCollapse); + Verify.IsNotNull(expandPeer,"Verify NavigationViewItem with children has an ExpandCollapse pattern provided"); + + expandPeer = NavigationViewItemAutomationPeer.CreatePeerForElement(menuItem4).GetPattern(PatternInterface.ExpandCollapse); + Verify.IsNotNull(expandPeer,"Verify NavigationViewItem without children but with UnrealizedChildren set to true has an ExpandCollapse pattern provided"); + }); + } + + [TestMethod] public void VerifySettingsItemToolTip() {