diff --git a/src/Avalonia.Controls/ComboBox.cs b/src/Avalonia.Controls/ComboBox.cs index b15f2abb8d..c31e13149d 100644 --- a/src/Avalonia.Controls/ComboBox.cs +++ b/src/Avalonia.Controls/ComboBox.cs @@ -429,22 +429,18 @@ namespace Avalonia.Controls private void SelectNext() { - int next = SelectedIndex + 1; - - if (next >= ItemCount) - next = 0; - - SelectedIndex = next; + if (ItemCount >= 1) + { + MoveSelection(NavigationDirection.Next, false); + } } private void SelectPrev() { - int prev = SelectedIndex - 1; - - if (prev < 0) - prev = ItemCount - 1; - - SelectedIndex = prev; + if (ItemCount >= 1) + { + MoveSelection(NavigationDirection.Previous, false); + } } } } diff --git a/src/Avalonia.Controls/ItemsControl.cs b/src/Avalonia.Controls/ItemsControl.cs index 77894fd2b8..bebb6a6626 100644 --- a/src/Avalonia.Controls/ItemsControl.cs +++ b/src/Avalonia.Controls/ItemsControl.cs @@ -509,7 +509,6 @@ namespace Avalonia.Controls 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 9e087b7fd3..3fed089194 100644 --- a/src/Avalonia.Controls/StackPanel.cs +++ b/src/Avalonia.Controls/StackPanel.cs @@ -123,7 +123,7 @@ namespace Avalonia.Controls index = Children.Count - 1; break; case NavigationDirection.Next: - if (index != -1) ++index; + ++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 cb2fd11175..98695fe88e 100644 --- a/tests/Avalonia.Controls.UnitTests/ComboBoxTests.cs +++ b/tests/Avalonia.Controls.UnitTests/ComboBoxTests.cs @@ -36,6 +36,81 @@ namespace Avalonia.Controls.UnitTests 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() {