From dee53015e4950922a44ecad198a2d560b9c14da9 Mon Sep 17 00:00:00 2001 From: Corvin Date: Sat, 15 Mar 2025 19:14:30 +0100 Subject: [PATCH 1/2] make the selection in the AutoSuggestBox wrap around when using the Up- and Down Arrow keys --- .../AutoSuggestBox.cs | 9 ++- .../AutoSuggestTextBoxTests.cs | 64 ++++++++++++++++++- 2 files changed, 70 insertions(+), 3 deletions(-) diff --git a/src/MaterialDesignThemes.Wpf/AutoSuggestBox.cs b/src/MaterialDesignThemes.Wpf/AutoSuggestBox.cs index 2c43b480db..11214da0f9 100644 --- a/src/MaterialDesignThemes.Wpf/AutoSuggestBox.cs +++ b/src/MaterialDesignThemes.Wpf/AutoSuggestBox.cs @@ -268,7 +268,9 @@ private void DecrementSelection() if (_autoSuggestBoxList is null || Suggestions is null) return; ICollectionView collectionView = CollectionViewSource.GetDefaultView(Suggestions); - if (collectionView.IsCurrentBeforeFirst) + + // If we're at the first item, wrap around to the last. + if (collectionView.CurrentPosition == 0) collectionView.MoveCurrentToLast(); else collectionView.MoveCurrentToPrevious(); @@ -280,7 +282,10 @@ private void IncrementSelection() if (_autoSuggestBoxList is null || Suggestions is null) return; ICollectionView collectionView = CollectionViewSource.GetDefaultView(Suggestions); - if (collectionView.IsCurrentAfterLast) + int itemCount = collectionView.Cast().Count(); + + // If we're at the last item, wrap around to the first. + if (collectionView.CurrentPosition == itemCount - 1) collectionView.MoveCurrentToFirst(); else collectionView.MoveCurrentToNext(); diff --git a/tests/MaterialDesignThemes.UITests/WPF/AutoSuggestBoxes/AutoSuggestTextBoxTests.cs b/tests/MaterialDesignThemes.UITests/WPF/AutoSuggestBoxes/AutoSuggestTextBoxTests.cs index aec0d5f268..97ab3c860a 100644 --- a/tests/MaterialDesignThemes.UITests/WPF/AutoSuggestBoxes/AutoSuggestTextBoxTests.cs +++ b/tests/MaterialDesignThemes.UITests/WPF/AutoSuggestBoxes/AutoSuggestTextBoxTests.cs @@ -1,4 +1,5 @@ -using System.ComponentModel; +using System.Collections; +using System.ComponentModel; using MaterialDesignThemes.UITests.Samples.AutoSuggestBoxes; using MaterialDesignThemes.UITests.Samples.AutoSuggestTextBoxes; using Xunit.Sdk; @@ -159,6 +160,67 @@ public async Task AutoSuggestBox_MovesFocusToNextElement_WhenPopupIsClosed() recorder.Success(); } + [Fact] + [Description("Issue 3815")] + public async Task AutoSuggestBox_KeysUpAndDown_WrapAround() + { + await using var recorder = new TestRecorder(App); + + //Arrange + IVisualElement suggestBox = (await LoadUserControl()).As(); + IVisualElement popup = await suggestBox.GetElement(); + IVisualElement suggestionListBox = await popup.GetElement(); + + const int delay = 50; + + //Act & Assert + await suggestBox.MoveKeyboardFocus(); + await suggestBox.SendInput(new KeyboardInput("e")); + await Task.Delay(delay); + + //var itemSource = (await suggestBox.GetSuggestions()).Cast().ToList(); + + //var suggestions = await suggestionListBox.GetProperty(nameof(ListBox.ItemsSource)); + //int itemCount = suggestions.Cast().Count(); + + int itemCount = CountNonGenericEnumerable(await suggestBox.GetSuggestions()); + + //Assert that initially the first item is selected + int selectedIndex = await suggestionListBox.GetSelectedIndex(); + Assert.Equal(0, selectedIndex); + await Task.Delay(delay); + + //Assert that the last item is selected after pressing ArrowUp + await suggestBox.SendInput(new KeyboardInput(Key.Up)); + Assert.Equal(itemCount - 1, await suggestionListBox.GetSelectedIndex()); + await Task.Delay(delay); + + //Assert that the first item is selected after pressing ArrowDown + await suggestBox.SendInput(new KeyboardInput(Key.Down)); + Assert.Equal(0, await suggestionListBox.GetSelectedIndex()); + + + } + + internal static int CountNonGenericEnumerable(IEnumerable? source) + { + ArgumentNullException.ThrowIfNull(source); + + if (source is ICollection collection) + { + return collection.Count; + } + + int count = 0; + IEnumerator e = source.GetEnumerator(); + while (e.MoveNext()) + { + count++; + } + + return count; + } + private static async Task AssertExists(IVisualElement suggestionListBox, string text, bool existsOrNotCheck = true) { try From 0453f346c78f9a14ef9d59bab110fdbc2b62869d Mon Sep 17 00:00:00 2001 From: Corvin <43533385+corvinsz@users.noreply.github.com> Date: Fri, 21 Mar 2025 16:04:12 +0100 Subject: [PATCH 2/2] get the Suggestion count of the AutoSuggestBox via RemoteExecute --- .../AutoSuggestTextBoxTests.cs | 34 ++++--------------- 1 file changed, 7 insertions(+), 27 deletions(-) diff --git a/tests/MaterialDesignThemes.UITests/WPF/AutoSuggestBoxes/AutoSuggestTextBoxTests.cs b/tests/MaterialDesignThemes.UITests/WPF/AutoSuggestBoxes/AutoSuggestTextBoxTests.cs index 97ab3c860a..5d4c7494c6 100644 --- a/tests/MaterialDesignThemes.UITests/WPF/AutoSuggestBoxes/AutoSuggestTextBoxTests.cs +++ b/tests/MaterialDesignThemes.UITests/WPF/AutoSuggestBoxes/AutoSuggestTextBoxTests.cs @@ -1,4 +1,4 @@ -using System.Collections; +using System.Collections; using System.ComponentModel; using MaterialDesignThemes.UITests.Samples.AutoSuggestBoxes; using MaterialDesignThemes.UITests.Samples.AutoSuggestTextBoxes; @@ -178,12 +178,13 @@ public async Task AutoSuggestBox_KeysUpAndDown_WrapAround() await suggestBox.SendInput(new KeyboardInput("e")); await Task.Delay(delay); - //var itemSource = (await suggestBox.GetSuggestions()).Cast().ToList(); - - //var suggestions = await suggestionListBox.GetProperty(nameof(ListBox.ItemsSource)); - //int itemCount = suggestions.Cast().Count(); + static int? GetSuggestionCount(AutoSuggestBox autoSuggestBox) + { + int? count = autoSuggestBox.Suggestions?.OfType().Count(); + return count; + } - int itemCount = CountNonGenericEnumerable(await suggestBox.GetSuggestions()); + int itemCount = await suggestBox.RemoteExecute(GetSuggestionCount) ?? 0; //Assert that initially the first item is selected int selectedIndex = await suggestionListBox.GetSelectedIndex(); @@ -198,27 +199,6 @@ public async Task AutoSuggestBox_KeysUpAndDown_WrapAround() //Assert that the first item is selected after pressing ArrowDown await suggestBox.SendInput(new KeyboardInput(Key.Down)); Assert.Equal(0, await suggestionListBox.GetSelectedIndex()); - - - } - - internal static int CountNonGenericEnumerable(IEnumerable? source) - { - ArgumentNullException.ThrowIfNull(source); - - if (source is ICollection collection) - { - return collection.Count; - } - - int count = 0; - IEnumerator e = source.GetEnumerator(); - while (e.MoveNext()) - { - count++; - } - - return count; } private static async Task AssertExists(IVisualElement suggestionListBox, string text, bool existsOrNotCheck = true)