diff --git a/src/Avalonia.Controls/ComboBox.cs b/src/Avalonia.Controls/ComboBox.cs index 5e53483d5ff..b15f2abb8de 100644 --- a/src/Avalonia.Controls/ComboBox.cs +++ b/src/Avalonia.Controls/ComboBox.cs @@ -429,18 +429,22 @@ private void SelectFocusedItem() private void SelectNext() { - if (ItemCount >= 1) - { - MoveSelection(NavigationDirection.Next, WrapSelection); - } + int next = SelectedIndex + 1; + + if (next >= ItemCount) + next = 0; + + SelectedIndex = next; } private void SelectPrev() { - if (ItemCount >= 1) - { - MoveSelection(NavigationDirection.Previous, WrapSelection); - } + int prev = SelectedIndex - 1; + + if (prev < 0) + prev = ItemCount - 1; + + SelectedIndex = prev; } } } diff --git a/src/Avalonia.Controls/ItemsControl.cs b/src/Avalonia.Controls/ItemsControl.cs index bebb6a66268..77894fd2b84 100644 --- a/src/Avalonia.Controls/ItemsControl.cs +++ b/src/Avalonia.Controls/ItemsControl.cs @@ -509,6 +509,7 @@ protected static IInputElement GetNextControl( do { result = container.GetControl(direction, c, wrap); + from = from ?? result; if (result != null && result.Focusable && diff --git a/src/Avalonia.Controls/StackPanel.cs b/src/Avalonia.Controls/StackPanel.cs index 3fed089194f..9e087b7fd32 100644 --- a/src/Avalonia.Controls/StackPanel.cs +++ b/src/Avalonia.Controls/StackPanel.cs @@ -123,7 +123,7 @@ protected virtual IInputElement GetControlInDirection(NavigationDirection direct index = Children.Count - 1; break; case NavigationDirection.Next: - ++index; + if (index != -1) ++index; break; case NavigationDirection.Previous: if (index != -1) --index; diff --git a/tests/Avalonia.Controls.UnitTests/ComboBoxTests.cs b/tests/Avalonia.Controls.UnitTests/ComboBoxTests.cs index 98695fe88e7..cb2fd11175d 100644 --- a/tests/Avalonia.Controls.UnitTests/ComboBoxTests.cs +++ b/tests/Avalonia.Controls.UnitTests/ComboBoxTests.cs @@ -36,81 +36,6 @@ public void Clicking_On_Control_Toggles_IsDropDownOpen() Assert.False(target.IsDropDownOpen); } - [Fact] - public void WrapSelection_Should_Work() - { - using (UnitTestApplication.Start(TestServices.RealFocus)) - { - var items = new[] - { - new ComboBoxItem() { Content = "bla" }, - new ComboBoxItem() { Content = "dd" }, - new ComboBoxItem() { Content = "sdf", IsEnabled = false } - }; - var target = new ComboBox - { - Items = items, - Template = GetTemplate(), - WrapSelection = true - }; - var root = new TestRoot(target); - target.ApplyTemplate(); - target.Presenter.ApplyTemplate(); - target.Focus(); - Assert.Equal(target.SelectedIndex, -1); - Assert.True(target.IsFocused); - target.RaiseEvent(new KeyEventArgs - { - RoutedEvent = InputElement.KeyDownEvent, - Key = Key.Up, - }); - Assert.Equal(target.SelectedIndex, 1); - target.RaiseEvent(new KeyEventArgs - { - RoutedEvent = InputElement.KeyDownEvent, - Key = Key.Down, - }); - Assert.Equal(target.SelectedIndex, 0); - } - } - - [Fact] - public void Focuses_Next_Item_On_Key_Down() - { - using (UnitTestApplication.Start(TestServices.RealFocus)) - { - var items = new[] - { - new ComboBoxItem() { Content = "bla" }, - new ComboBoxItem() { Content = "dd", IsEnabled = false }, - new ComboBoxItem() { Content = "sdf" } - }; - var target = new ComboBox - { - Items = items, - Template = GetTemplate() - }; - var root = new TestRoot(target); - target.ApplyTemplate(); - target.Presenter.ApplyTemplate(); - target.Focus(); - Assert.Equal(target.SelectedIndex, -1); - Assert.True(target.IsFocused); - target.RaiseEvent(new KeyEventArgs - { - RoutedEvent = InputElement.KeyDownEvent, - Key = Key.Down, - }); - Assert.Equal(target.SelectedIndex, 0); - target.RaiseEvent(new KeyEventArgs - { - RoutedEvent = InputElement.KeyDownEvent, - Key = Key.Down, - }); - Assert.Equal(target.SelectedIndex, 2); - } - } - [Fact] public void SelectionBoxItem_Is_Rectangle_With_VisualBrush_When_Selection_Is_Control() {