From 7b84682edf485adb4021a207a7fb7d44f1ce947f Mon Sep 17 00:00:00 2001 From: "E.Z. Hart" Date: Fri, 2 Jun 2023 11:15:18 -0600 Subject: [PATCH 1/3] Set menuItem show action back to Never (#14623) * Set menuItem show action back to Never * Auto-format source code * - fix iOS handler registration --------- Co-authored-by: GitHub Actions Autoformatter --- .../Android/Extensions/ToolbarExtensions.cs | 2 + .../ControlsHandlerTestBase.Android.cs | 17 ++++ .../ControlsHandlerTestBase.Windows.cs | 30 +++++-- .../NavigationPage/NavigationPageTests.cs | 37 --------- .../Elements/Toolbar/ToolbarTests.cs | 79 +++++++++++++++++++ 5 files changed, 122 insertions(+), 43 deletions(-) diff --git a/src/Controls/src/Core/Platform/Android/Extensions/ToolbarExtensions.cs b/src/Controls/src/Core/Platform/Android/Extensions/ToolbarExtensions.cs index e708a70f0e03..8f75fc07a73e 100644 --- a/src/Controls/src/Core/Platform/Android/Extensions/ToolbarExtensions.cs +++ b/src/Controls/src/Core/Platform/Android/Extensions/ToolbarExtensions.cs @@ -322,6 +322,8 @@ static void UpdateMenuItem(AToolbar toolbar, if (item.Order != ToolbarItemOrder.Secondary) menuitem.SetShowAsAction(ShowAsAction.Always); + else + menuitem.SetShowAsAction(ShowAsAction.Never); menuitem.SetOnMenuItemClickListener(new GenericMenuClickListener(((IMenuItemController)item).Activate)); diff --git a/src/Controls/tests/DeviceTests/ControlsHandlerTestBase.Android.cs b/src/Controls/tests/DeviceTests/ControlsHandlerTestBase.Android.cs index 1c7d2c08f080..2bb4acc5b486 100644 --- a/src/Controls/tests/DeviceTests/ControlsHandlerTestBase.Android.cs +++ b/src/Controls/tests/DeviceTests/ControlsHandlerTestBase.Android.cs @@ -5,6 +5,7 @@ using Android.OS; using AndroidX.AppCompat.App; using AndroidX.AppCompat.Graphics.Drawable; +using AndroidX.AppCompat.View.Menu; using AndroidX.AppCompat.Widget; using AndroidX.CoordinatorLayout.Widget; using AndroidX.Fragment.App; @@ -90,6 +91,22 @@ public bool ToolbarItemsMatch( ToolbarItem toolbarItem = toolbarItems[i]; var primaryCommand = menu.GetItem(i); Assert.Equal(toolbarItem.Text, $"{primaryCommand.TitleFormatted}"); + + if (primaryCommand is MenuItemImpl menuItemImpl) + { + if (toolbarItem.Order != ToolbarItemOrder.Secondary) + { + Assert.True(menuItemImpl.RequiresActionButton(), "Secondary Menu Item `SetShowAsAction` not set correctly"); + } + else + { + Assert.False(menuItemImpl.RequiresActionButton(), "Primary Menu Item `SetShowAsAction` not set correctly"); + } + } + else + { + throw new Exception($"MenuItem type is not MenuItemImpl. Please rework test to work with {primaryCommand}"); + } } return true; diff --git a/src/Controls/tests/DeviceTests/ControlsHandlerTestBase.Windows.cs b/src/Controls/tests/DeviceTests/ControlsHandlerTestBase.Windows.cs index 89fc6b5b67bb..29e4e5e5576d 100644 --- a/src/Controls/tests/DeviceTests/ControlsHandlerTestBase.Windows.cs +++ b/src/Controls/tests/DeviceTests/ControlsHandlerTestBase.Windows.cs @@ -1,5 +1,7 @@ using System; +using System.Collections; using System.Collections.Generic; +using System.Linq; using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; using Microsoft.Maui; @@ -9,6 +11,7 @@ using Microsoft.UI.Xaml; using Microsoft.UI.Xaml.Automation.Peers; using Microsoft.UI.Xaml.Controls; +using Windows.Foundation.Collections; using Xunit; using NativeAutomationProperties = Microsoft.UI.Xaml.Automation.AutomationProperties; using WAppBarButton = Microsoft.UI.Xaml.Controls.AppBarButton; @@ -128,16 +131,31 @@ public bool ToolbarItemsMatch( IElementHandler handler, params ToolbarItem[] toolbarItems) { + var primaryToolbarItems = toolbarItems.Where(x => x.Order != ToolbarItemOrder.Secondary).ToArray(); + var secondaryToolbarItems = toolbarItems.Where(x => x.Order == ToolbarItemOrder.Secondary).ToArray(); + var navView = (RootNavigationView)GetMauiNavigationView(handler.MauiContext); MauiToolbar windowHeader = (MauiToolbar)navView.Header; - Assert.NotNull(windowHeader?.CommandBar?.PrimaryCommands); - Assert.Equal(toolbarItems.Length, windowHeader.CommandBar.PrimaryCommands.Count); - for (var i = 0; i < toolbarItems.Length; i++) + ValidateCommandBarCommands(windowHeader?.CommandBar?.PrimaryCommands, primaryToolbarItems); + ValidateCommandBarCommands(windowHeader?.CommandBar?.SecondaryCommands, secondaryToolbarItems); + + void ValidateCommandBarCommands(IObservableVector commands, ToolbarItem[] orderToolbarItems) { - ToolbarItem toolbarItem = toolbarItems[i]; - var primaryCommand = ((WAppBarButton)windowHeader.CommandBar.PrimaryCommands[i]); - Assert.Equal(toolbarItem, primaryCommand.DataContext); + if (orderToolbarItems.Length == 0) + { + Assert.True(commands is null || commands.Count == 0); + return; + } + + Assert.NotNull(commands); + Assert.Equal(orderToolbarItems.Length, commands.Count); + for (var i = 0; i < toolbarItems.Length; i++) + { + ToolbarItem toolbarItem = orderToolbarItems[i]; + var command = ((WAppBarButton)commands[i]); + Assert.Equal(toolbarItem, command.DataContext); + } } return true; diff --git a/src/Controls/tests/DeviceTests/Elements/NavigationPage/NavigationPageTests.cs b/src/Controls/tests/DeviceTests/Elements/NavigationPage/NavigationPageTests.cs index c168f425db99..2c62c953b235 100644 --- a/src/Controls/tests/DeviceTests/Elements/NavigationPage/NavigationPageTests.cs +++ b/src/Controls/tests/DeviceTests/Elements/NavigationPage/NavigationPageTests.cs @@ -116,43 +116,6 @@ await CreateHandlerAndAddToWindow(window, async (handler) => }); } - [Fact(DisplayName = "Toolbar Items Map Correctly")] - public async Task ToolbarItemsMapCorrectly() - { - SetupBuilder(); - var toolbarItem = new ToolbarItem() { Text = "Toolbar Item 1" }; - var navPage = new NavigationPage(new ContentPage() - { - ToolbarItems = - { - toolbarItem - } - }); - - await CreateHandlerAndAddToWindow(new Window(navPage), (handler) => - { - ToolbarItemsMatch(handler, toolbarItem); - return Task.CompletedTask; - }); - } - - [Fact(DisplayName = "Toolbar Title")] - public async Task ToolbarTitle() - { - SetupBuilder(); - var navPage = new NavigationPage(new ContentPage() - { - Title = "Page Title" - }); - - await CreateHandlerAndAddToWindow(new Window(navPage), (handler) => - { - string title = GetToolbarTitle(handler); - Assert.Equal("Page Title", title); - return Task.CompletedTask; - }); - } - [Fact(DisplayName = "Insert Page Before Root Page and then PopToRoot")] public async Task InsertPageBeforeRootPageAndThenPopToRoot() { diff --git a/src/Controls/tests/DeviceTests/Elements/Toolbar/ToolbarTests.cs b/src/Controls/tests/DeviceTests/Elements/Toolbar/ToolbarTests.cs index 5b75c6cdce98..d4dd9343fb23 100644 --- a/src/Controls/tests/DeviceTests/Elements/Toolbar/ToolbarTests.cs +++ b/src/Controls/tests/DeviceTests/Elements/Toolbar/ToolbarTests.cs @@ -16,6 +16,7 @@ #if IOS || MACCATALYST using FlyoutViewHandler = Microsoft.Maui.Controls.Handlers.Compatibility.PhoneFlyoutPageRenderer; +using NavigationViewHandler = Microsoft.Maui.Controls.Handlers.Compatibility.NavigationRenderer; #endif namespace Microsoft.Maui.DeviceTests @@ -42,6 +43,79 @@ void SetupBuilder() }); } + +#if !IOS && !MACCATALYST + [Fact(DisplayName = "Toolbar Items Map Correctly")] + public async Task ToolbarItemsMapCorrectly() + { + SetupBuilder(); + var toolbarItem = new ToolbarItem() { Text = "Toolbar Item 1" }; + var navPage = new NavigationPage(new ContentPage() + { + ToolbarItems = + { + toolbarItem + } + }); + + await CreateHandlerAndAddToWindow(new Window(navPage), (handler) => + { + ToolbarItemsMatch(handler, toolbarItem); + return Task.CompletedTask; + }); + } + + [Fact(DisplayName = "Toolbar Items Order Updates Correctly After Navigation")] + public async Task ToolbarItemsOrderUpdatesCorrectlyAfterNavigation() + { + SetupBuilder(); + var toolbarItemFirstPage = new ToolbarItem() { Text = "Toolbar Item 1" }; + var toolbarItemSecondPage = new ToolbarItem() { Text = "Toolbar Item Second Page", Order = ToolbarItemOrder.Secondary }; + + var navPage = new NavigationPage(new ContentPage() + { + ToolbarItems = + { + toolbarItemFirstPage + } + }); + + await CreateHandlerAndAddToWindow(new Window(navPage), async (handler) => + { + await navPage.PushAsync(new ContentPage() + { + ToolbarItems = + { + toolbarItemSecondPage + } + }); + + ToolbarItemsMatch(handler, GetExpectedToolbarItems(navPage)); + ToolbarItemsMatch(handler, toolbarItemSecondPage); + await navPage.PopAsync(); + ToolbarItemsMatch(handler, GetExpectedToolbarItems(navPage)); + ToolbarItemsMatch(handler, toolbarItemFirstPage); + }); + } +#endif + + [Fact(DisplayName = "Toolbar Title")] + public async Task ToolbarTitle() + { + SetupBuilder(); + var navPage = new NavigationPage(new ContentPage() + { + Title = "Page Title" + }); + + await CreateHandlerAndAddToWindow(new Window(navPage), (handler) => + { + string title = GetToolbarTitle(handler); + Assert.Equal("Page Title", title); + return Task.CompletedTask; + }); + } + #if !IOS && !MACCATALYST [Theory(DisplayName = "Toolbar Recreates With New MauiContext")] [InlineData(typeof(FlyoutPage))] @@ -104,5 +178,10 @@ await CreateHandlerAndAddToWindow(window, (handler) => }, context2); } #endif + + ToolbarItem[] GetExpectedToolbarItems(NavigationPage navPage) + { + return ((Toolbar)(navPage.Window as IToolbarElement).Toolbar).ToolbarItems.ToArray(); + } } } From d04f95a3a80a046165d043ec4f72151d2086dc29 Mon Sep 17 00:00:00 2001 From: Shane Neuville Date: Fri, 2 Jun 2023 17:04:10 -0500 Subject: [PATCH 2/3] - backport testing helpers --- .../ControlsHandlerTestBase.Android.cs | 43 ++++++++++++-- .../ControlsHandlerTestBase.Windows.cs | 3 + .../ControlsHandlerTestBase.iOS.cs | 43 ++++++++++++++ .../NavigationPageTests.Android.cs | 3 - .../NavigationPageTests.Windows.cs | 5 -- src/Core/src/Platform/iOS/ViewExtensions.cs | 19 ++++++ .../DeviceTests/AssertionExtensions.iOS.cs | 58 +++++++++++++++++++ 7 files changed, 160 insertions(+), 14 deletions(-) diff --git a/src/Controls/tests/DeviceTests/ControlsHandlerTestBase.Android.cs b/src/Controls/tests/DeviceTests/ControlsHandlerTestBase.Android.cs index 2bb4acc5b486..96c320926994 100644 --- a/src/Controls/tests/DeviceTests/ControlsHandlerTestBase.Android.cs +++ b/src/Controls/tests/DeviceTests/ControlsHandlerTestBase.Android.cs @@ -12,6 +12,7 @@ using Google.Android.Material.AppBar; using Microsoft.Maui.Controls; using Microsoft.Maui.DeviceTests.Stubs; +using Microsoft.Maui.Graphics; using Microsoft.Maui.Handlers; using Microsoft.Maui.Platform; using Xunit; @@ -134,10 +135,15 @@ protected MaterialToolbar GetPlatformToolbar(IElementHandler handler) { var shell = handler.VirtualView as Shell; var currentPage = shell.CurrentPage; - var pagePlatformView = currentPage.Handler.PlatformView as AView; - var parentContainer = pagePlatformView.GetParentOfType(); - var toolbar = parentContainer.GetFirstChildOfType(); - return toolbar; + + if (currentPage?.Handler?.PlatformView is AView pagePlatformView) + { + var parentContainer = pagePlatformView.GetParentOfType(); + var toolbar = parentContainer?.GetFirstChildOfType(); + return toolbar; + } + + return null; } else { @@ -145,18 +151,36 @@ protected MaterialToolbar GetPlatformToolbar(IElementHandler handler) } } + protected string GetToolbarTitle(IElementHandler handler) => + GetPlatformToolbar(handler).Title; + protected MaterialToolbar GetPlatformToolbar(IMauiContext mauiContext) { var navManager = mauiContext.GetNavigationRootManager(); + if (navManager?.RootView is null) + return null; + var appbarLayout = - navManager?.RootView?.FindViewById(Resource.Id.navigationlayout_appbar); + navManager.RootView.FindViewById(Resource.Id.navigationlayout_appbar); + + if (appbarLayout is null && + navManager.RootView is ContainerView cv && + cv.CurrentView is Shell shell) + { + if (shell.Handler is Controls.Platform.Compatibility.IShellContext sr) + { + var layout = sr.CurrentDrawerLayout; + var content = layout?.GetFirstChildOfType(); + appbarLayout = content?.GetFirstChildOfType(); + } + } var toolBar = appbarLayout?.GetFirstChildOfType(); toolBar = toolBar ?? navManager.ToolbarElement?.Toolbar?.Handler?.PlatformView as MaterialToolbar; - if (toolBar == null) + if (toolBar is null) { appbarLayout = (navManager?.RootView as AViewGroup)?.GetFirstChildOfType(); @@ -167,6 +191,13 @@ protected MaterialToolbar GetPlatformToolbar(IMauiContext mauiContext) return toolBar; } + protected Size GetTitleViewExpectedSize(IElementHandler handler) + { + var context = handler.MauiContext.Context; + var toolbar = GetPlatformToolbar(handler.MauiContext).GetFirstChildOfType(); + return new Size(context.FromPixels(toolbar.MeasuredWidth), context.FromPixels(toolbar.MeasuredHeight)); + } + public bool IsNavigationBarVisible(IElementHandler handler) => IsNavigationBarVisible(handler.MauiContext); diff --git a/src/Controls/tests/DeviceTests/ControlsHandlerTestBase.Windows.cs b/src/Controls/tests/DeviceTests/ControlsHandlerTestBase.Windows.cs index 29e4e5e5576d..72820c6f0921 100644 --- a/src/Controls/tests/DeviceTests/ControlsHandlerTestBase.Windows.cs +++ b/src/Controls/tests/DeviceTests/ControlsHandlerTestBase.Windows.cs @@ -166,5 +166,8 @@ protected object GetTitleView(IElementHandler handler) var toolbar = GetPlatformToolbar(handler); return toolbar.TitleView; } + + protected string GetToolbarTitle(IElementHandler handler) => + GetPlatformToolbar(handler).Title; } } diff --git a/src/Controls/tests/DeviceTests/ControlsHandlerTestBase.iOS.cs b/src/Controls/tests/DeviceTests/ControlsHandlerTestBase.iOS.cs index dcf90d15c879..8bd964d6d999 100644 --- a/src/Controls/tests/DeviceTests/ControlsHandlerTestBase.iOS.cs +++ b/src/Controls/tests/DeviceTests/ControlsHandlerTestBase.iOS.cs @@ -5,6 +5,7 @@ using Microsoft.Maui.Controls.Platform; using Microsoft.Maui.Controls.Platform.Compatibility; using Microsoft.Maui.DeviceTests.Stubs; +using Microsoft.Maui.Graphics; using Microsoft.Maui.Platform; using UIKit; using Xunit; @@ -140,5 +141,47 @@ UIViewController GetVisibleViewController(IElementHandler handler) var vcs = GetActiveChildViewControllers(handler); return vcs[vcs.Length - 1]; } + + protected UINavigationBar GetPlatformToolbar(IElementHandler handler) + { + var visibleController = GetVisibleViewController(handler); + if (visibleController is UINavigationController nc) + return nc.NavigationBar; + + var navController = visibleController.NavigationController; + return navController?.NavigationBar; + } + + protected Size GetTitleViewExpectedSize(IElementHandler handler) + { + var titleContainer = GetPlatformToolbar(handler).FindDescendantView(result => + { + return result.Class.Name?.Contains("UINavigationBarTitleControl", StringComparison.OrdinalIgnoreCase) == true; + }); + + if (!OperatingSystem.IsIOSVersionAtLeast(16)) + { + titleContainer = titleContainer ?? GetPlatformToolbar(handler).FindDescendantView(result => + { + return result.Class.Name?.Contains("TitleViewContainer", StringComparison.OrdinalIgnoreCase) == true; + }); + } + + _ = titleContainer ?? throw new Exception("Unable to Locate TitleView Container"); + + return new Size(titleContainer.Frame.Width, titleContainer.Frame.Height); + } + + protected string GetToolbarTitle(IElementHandler handler) + { + var toolbar = GetPlatformToolbar(handler); + return AssertionExtensions.GetToolbarTitle(toolbar); + } + + protected string GetBackButtonText(IElementHandler handler) + { + var toolbar = GetPlatformToolbar(handler); + return AssertionExtensions.GetBackButtonText(toolbar); + } } } diff --git a/src/Controls/tests/DeviceTests/Elements/NavigationPage/NavigationPageTests.Android.cs b/src/Controls/tests/DeviceTests/Elements/NavigationPage/NavigationPageTests.Android.cs index 3ed5c2009727..c216ebe20bec 100644 --- a/src/Controls/tests/DeviceTests/Elements/NavigationPage/NavigationPageTests.Android.cs +++ b/src/Controls/tests/DeviceTests/Elements/NavigationPage/NavigationPageTests.Android.cs @@ -47,8 +47,5 @@ await CreateHandlerAndAddToWindow(new Window(navPage), async Assert.False(failed); }); } - - string GetToolbarTitle(IElementHandler handler) => - GetPlatformToolbar(handler).Title; } } diff --git a/src/Controls/tests/DeviceTests/Elements/NavigationPage/NavigationPageTests.Windows.cs b/src/Controls/tests/DeviceTests/Elements/NavigationPage/NavigationPageTests.Windows.cs index 19f602dff9c5..e62c59598717 100644 --- a/src/Controls/tests/DeviceTests/Elements/NavigationPage/NavigationPageTests.Windows.cs +++ b/src/Controls/tests/DeviceTests/Elements/NavigationPage/NavigationPageTests.Windows.cs @@ -21,11 +21,6 @@ namespace Microsoft.Maui.DeviceTests [Category(TestCategory.NavigationPage)] public partial class NavigationPageTests : ControlsHandlerTestBase { - - string GetToolbarTitle(IElementHandler handler) => - GetPlatformToolbar(handler).Title; - - [Fact(DisplayName = "Back Button Enabled Changes with push/pop")] public async Task BackButtonEnabledChangesWithPushPop() { diff --git a/src/Core/src/Platform/iOS/ViewExtensions.cs b/src/Core/src/Platform/iOS/ViewExtensions.cs index 0874ea676d9b..c0da548c91de 100644 --- a/src/Core/src/Platform/iOS/ViewExtensions.cs +++ b/src/Core/src/Platform/iOS/ViewExtensions.cs @@ -257,6 +257,25 @@ public static void UpdateBorder(this UIView platformView, IView view) return null; } + internal static T? FindDescendantView(this UIView view, Func predicate) where T : UIView + { + var queue = new Queue(); + queue.Enqueue(view); + + while (queue.Count > 0) + { + var descendantView = queue.Dequeue(); + + if (descendantView is T result && predicate.Invoke(result)) + return result; + + for (var i = 0; i < descendantView.Subviews?.Length; i++) + queue.Enqueue(descendantView.Subviews[i]); + } + + return null; + } + public static void UpdateBackgroundLayerFrame(this UIView view) { if (view == null || view.Frame.IsEmpty) diff --git a/src/TestUtils/src/DeviceTests/AssertionExtensions.iOS.cs b/src/TestUtils/src/DeviceTests/AssertionExtensions.iOS.cs index 0cd8973f2535..1905c0cafc42 100644 --- a/src/TestUtils/src/DeviceTests/AssertionExtensions.iOS.cs +++ b/src/TestUtils/src/DeviceTests/AssertionExtensions.iOS.cs @@ -1,4 +1,5 @@ using System; +using System.Linq; using System.Threading.Tasks; using CoreAnimation; using CoreGraphics; @@ -566,5 +567,62 @@ public static UIView GetAccessiblePlatformView(this UIView platformView) return platformView; } + + static UIView GetBackButton(this UINavigationBar uINavigationBar) + { + var item = uINavigationBar.FindDescendantView(result => + { + return result.Class.Name?.Contains("UIButtonBarButton", StringComparison.OrdinalIgnoreCase) == true; + }); + + return item ?? throw new Exception("Unable to locate back button view"); + } + + public static void TapBackButton(this UINavigationBar uINavigationBar) + { + var item = uINavigationBar.GetBackButton(); + + var recognizer = item?.GestureRecognizers?.OfType()?.FirstOrDefault(); + if (recognizer is null && item is UIControl control) + { + control.SendActionForControlEvents(UIControlEvent.TouchUpInside); + } + else + { + _ = recognizer ?? throw new Exception("Unable to figure out how to tap back button"); + recognizer.State = UIGestureRecognizerState.Ended; + } + } + + public static string? GetToolbarTitle(this UINavigationBar uINavigationBar) + { + var item = uINavigationBar.FindDescendantView(result => + { + return result.Class.Name?.Contains("UINavigationBarTitleControl", StringComparison.OrdinalIgnoreCase) == true; + }); + + //Pre iOS 15 + item = item ?? uINavigationBar.FindDescendantView(result => + { + return result.Class.Name?.Contains("UINavigationBarContentView", StringComparison.OrdinalIgnoreCase) == true; + }); + + _ = item ?? throw new Exception("Unable to locate TitleBar Control"); + + var titleLabel = item.FindDescendantView(); + + _ = item ?? throw new Exception("Unable to locate UILabel Inside UINavigationBar"); + return titleLabel?.Text; + } + + public static string? GetBackButtonText(this UINavigationBar uINavigationBar) + { + var item = uINavigationBar.GetBackButton(); + + var titleLabel = item.FindDescendantView(); + + _ = item ?? throw new Exception("Unable to locate BackButton UILabel Inside UINavigationBar"); + return titleLabel?.Text; + } } } \ No newline at end of file From 5ccd0fae792ff2b32ae515d0098703f2d88a8e6f Mon Sep 17 00:00:00 2001 From: Shane Neuville Date: Mon, 5 Jun 2023 09:22:15 -0500 Subject: [PATCH 3/3] - fix up tests --- .../tests/DeviceTests/ControlsHandlerTestBase.iOS.cs | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/Controls/tests/DeviceTests/ControlsHandlerTestBase.iOS.cs b/src/Controls/tests/DeviceTests/ControlsHandlerTestBase.iOS.cs index 8bd964d6d999..ec36ab339b0c 100644 --- a/src/Controls/tests/DeviceTests/ControlsHandlerTestBase.iOS.cs +++ b/src/Controls/tests/DeviceTests/ControlsHandlerTestBase.iOS.cs @@ -6,6 +6,7 @@ using Microsoft.Maui.Controls.Platform.Compatibility; using Microsoft.Maui.DeviceTests.Stubs; using Microsoft.Maui.Graphics; +using Microsoft.Maui.Handlers; using Microsoft.Maui.Platform; using UIKit; using Xunit; @@ -110,14 +111,16 @@ protected object GetTitleView(IElementHandler handler) UIViewController[] GetActiveChildViewControllers(IElementHandler handler) { + if (handler is IWindowHandler wh) + { + handler = wh.VirtualView.Content.Handler; + } + if (handler is ShellRenderer renderer) { if (renderer.ChildViewControllers[0] is ShellItemRenderer sir) { - if (sir.ChildViewControllers[0] is ShellSectionRenderer ssr) - { - return ssr.ChildViewControllers; - } + return sir.SelectedViewController.ChildViewControllers; } }