diff --git a/src/Perspex.Controls/Primitives/SelectingItemsControl.cs b/src/Perspex.Controls/Primitives/SelectingItemsControl.cs index 629dbd8d6f..e683fc43f9 100644 --- a/src/Perspex.Controls/Primitives/SelectingItemsControl.cs +++ b/src/Perspex.Controls/Primitives/SelectingItemsControl.cs @@ -377,6 +377,23 @@ namespace Perspex.Controls.Primitives } } + /// + protected override void OnContainersDematerialized(ItemContainerEventArgs e) + { + base.OnContainersDematerialized(e); + + var panel = (InputElement)Presenter.Panel; + + foreach (var container in e.Containers) + { + if (KeyboardNavigation.GetTabOnceActiveElement(panel) == container.ContainerControl) + { + KeyboardNavigation.SetTabOnceActiveElement(panel, null); + break; + } + } + } + /// protected override void OnDataContextChanging() { diff --git a/tests/Perspex.Controls.UnitTests/ListBoxTests.cs b/tests/Perspex.Controls.UnitTests/ListBoxTests.cs index a502d3b186..82702adef8 100644 --- a/tests/Perspex.Controls.UnitTests/ListBoxTests.cs +++ b/tests/Perspex.Controls.UnitTests/ListBoxTests.cs @@ -104,30 +104,6 @@ namespace Perspex.Controls.UnitTests dataContexts); } - [Fact] - public void Setting_SelectedItem_Should_Set_Panel_Keyboard_Navigation() - { - var target = new ListBox - { - Template = new FuncControlTemplate(CreateListBoxTemplate), - Items = new[] { "Foo", "Bar", "Baz " }, - }; - - ApplyTemplate(target); - - target.Presenter.Panel.Children[1].RaiseEvent(new PointerPressedEventArgs - { - RoutedEvent = InputElement.PointerPressedEvent, - MouseButton = MouseButton.Left, - }); - - var panel = target.Presenter.Panel; - - Assert.Equal( - KeyboardNavigation.GetTabOnceActiveElement((InputElement)panel), - panel.Children[1]); - } - private Control CreateListBoxTemplate(ITemplatedControl parent) { return new ScrollViewer diff --git a/tests/Perspex.Controls.UnitTests/Primitives/SelectingItemsControlTests.cs b/tests/Perspex.Controls.UnitTests/Primitives/SelectingItemsControlTests.cs index 361d6a5d08..46fba11250 100644 --- a/tests/Perspex.Controls.UnitTests/Primitives/SelectingItemsControlTests.cs +++ b/tests/Perspex.Controls.UnitTests/Primitives/SelectingItemsControlTests.cs @@ -8,6 +8,7 @@ using Perspex.Collections; using Perspex.Controls.Presenters; using Perspex.Controls.Primitives; using Perspex.Controls.Templates; +using Perspex.Input; using Perspex.Interactivity; using Perspex.Markup.Xaml.Data; using Perspex.UnitTests; @@ -604,6 +605,57 @@ namespace Perspex.Controls.UnitTests.Primitives Assert.Equal(0, root.SelectedIndex); } + [Fact] + public void Setting_SelectedItem_With_Pointer_Should_Set_TabOnceActiveElement() + { + var target = new ListBox + { + Template = Template(), + Items = new[] { "Foo", "Bar", "Baz " }, + }; + + target.ApplyTemplate(); + target.Presenter.ApplyTemplate(); + + target.Presenter.Panel.Children[1].RaiseEvent(new PointerPressedEventArgs + { + RoutedEvent = InputElement.PointerPressedEvent, + MouseButton = MouseButton.Left, + }); + + var panel = target.Presenter.Panel; + + Assert.Equal( + KeyboardNavigation.GetTabOnceActiveElement((InputElement)panel), + panel.Children[1]); + } + + [Fact] + public void Removing_SelectedItem_Should_Clear_TabOnceActiveElement() + { + var items = new ObservableCollection(new[] { "Foo", "Bar", "Baz " }); + + var target = new ListBox + { + Template = Template(), + Items = items, + }; + + target.ApplyTemplate(); + target.Presenter.ApplyTemplate(); + + target.Presenter.Panel.Children[1].RaiseEvent(new PointerPressedEventArgs + { + RoutedEvent = InputElement.PointerPressedEvent, + MouseButton = MouseButton.Left, + }); + + items.RemoveAt(1); + + var panel = target.Presenter.Panel; + + Assert.Null(KeyboardNavigation.GetTabOnceActiveElement((InputElement)panel)); + } private FuncControlTemplate Template() {