فهرست منبع

Clear TabOnceActiveElement on removed container.

Steven Kirk 9 سال پیش
والد
کامیت
d8cf474274

+ 17 - 0
src/Perspex.Controls/Primitives/SelectingItemsControl.cs

@@ -377,6 +377,23 @@ namespace Perspex.Controls.Primitives
             }
         }
 
+        /// <inheritdoc/>
+        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;
+                }
+            }
+        }
+
         /// <inheritdoc/>
         protected override void OnDataContextChanging()
         {

+ 0 - 24
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

+ 52 - 0
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<string>(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()
         {