Просмотр исходного кода

Allow selection of multiple consecutive blocks in SelectingItemsControl. (#16907)

* Stop Selection.Clear() when selecting a range to enable multiple consecutive blocks to be selected.

* Reinstated Selection.Clear() when range is true and toggleModifier is false.
When range and toggleModifier are true, consecutive ranges are selected.
Added new unit test.
Brubning 1 год назад
Родитель
Сommit
3858a7214b

+ 4 - 1
src/Avalonia.Controls/Primitives/SelectingItemsControl.cs

@@ -817,7 +817,10 @@ namespace Avalonia.Controls.Primitives
             else if (range)
             {
                 using var operation = Selection.BatchUpdate();
-                Selection.Clear();
+                if (!toggleModifier)
+                {
+                    Selection.Clear();
+                }
                 Selection.SelectRange(Selection.AnchorIndex, index);
             }
             else if (!fromFocus && toggle)

+ 30 - 0
tests/Avalonia.Controls.UnitTests/ListBoxTests_Multiple.cs

@@ -167,6 +167,36 @@ namespace Avalonia.Controls.UnitTests
             }
         }
 
+        [Fact]
+        public void ToggleModifier_And_Range_Should_Select_Second_Range()
+        {
+            using (UnitTestApplication.Start(TestServices.MockPlatformRenderInterface))
+            {
+                var target = new ListBox
+                {
+                    Template = new FuncControlTemplate(CreateListBoxTemplate),
+                    ItemsSource = new[] { "Foo", "Bar", "Baz", "Gap", "Boo", "Far", "Faz" },
+                    SelectionMode = SelectionMode.Multiple,
+                    Width = 100,
+                    Height = 100,
+                };
+
+                var root = new TestRoot(target);
+                root.LayoutManager.ExecuteInitialLayoutPass();
+
+                AvaloniaLocator.CurrentMutable.Bind<PlatformHotkeyConfiguration>().ToConstant(new PlatformHotkeyConfiguration());
+                // Select first range
+                _helper.Click(target.Presenter.Panel.Children[0]);
+                _helper.Click(target.Presenter.Panel.Children[2], modifiers: KeyModifiers.Shift);
+
+                // Select second range
+                _helper.Click(target.Presenter.Panel.Children[4], modifiers: KeyModifiers.Control);
+                _helper.Click(target.Presenter.Panel.Children[6], modifiers: KeyModifiers.Control | KeyModifiers.Shift);
+
+                Assert.Equal(new[] { "Foo", "Bar", "Baz", "Boo", "Far", "Faz" }, target.SelectedItems);
+            }
+        }
+
         [Fact]
         public void Should_Ctrl_Select_Correct_Item_When_Duplicate_Items_Are_Present()
         {