Browse Source

Bring selected TreeViewItem into view after layout finishes.

Steven Kirk 5 years ago
parent
commit
9df84abbf3
2 changed files with 298 additions and 252 deletions
  1. 1 1
      src/Avalonia.Controls/TreeView.cs
  2. 297 251
      tests/Avalonia.Controls.UnitTests/TreeViewTests.cs

+ 1 - 1
src/Avalonia.Controls/TreeView.cs

@@ -346,7 +346,7 @@ namespace Avalonia.Controls
 
                 if (container != null)
                 {
-                    container.BringIntoView();
+                    DispatcherTimer.RunOnce(container.BringIntoView, TimeSpan.Zero);
                 }
             }
         }

+ 297 - 251
tests/Avalonia.Controls.UnitTests/TreeViewTests.cs

@@ -118,313 +118,340 @@ namespace Avalonia.Controls.UnitTests
         [Fact]
         public void Clicking_Item_Should_Select_It()
         {
-            var tree = CreateTestTreeData();
-            var target = new TreeView
+            using (Application())
             {
-                Template = CreateTreeViewTemplate(),
-                Items = tree,
-            };
+                var tree = CreateTestTreeData();
+                var target = new TreeView
+                {
+                    Template = CreateTreeViewTemplate(),
+                    Items = tree,
+                };
 
-            var visualRoot = new TestRoot();
-            visualRoot.Child = target;
+                var visualRoot = new TestRoot();
+                visualRoot.Child = target;
 
-            CreateNodeDataTemplate(target);
-            ApplyTemplates(target);
-            ExpandAll(target);
+                CreateNodeDataTemplate(target);
+                ApplyTemplates(target);
+                ExpandAll(target);
 
-            var item = tree[0].Children[1].Children[0];
-            var container = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(item);
+                var item = tree[0].Children[1].Children[0];
+                var container = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(item);
 
-            Assert.NotNull(container);
+                Assert.NotNull(container);
 
-            _mouse.Click(container);
+                _mouse.Click(container);
 
-            Assert.Equal(item, target.SelectedItem);
-            Assert.True(container.IsSelected);
+                Assert.Equal(item, target.SelectedItem);
+                Assert.True(container.IsSelected);
+            }
         }
 
         [Fact]
         public void Clicking_WithControlModifier_Selected_Item_Should_Deselect_It()
         {
-            var tree = CreateTestTreeData();
-            var target = new TreeView
+            using (Application())
             {
-                Template = CreateTreeViewTemplate(),
-                Items = tree
-            };
+                var tree = CreateTestTreeData();
+                var target = new TreeView
+                {
+                    Template = CreateTreeViewTemplate(),
+                    Items = tree
+                };
 
-            var visualRoot = new TestRoot();
-            visualRoot.Child = target;
+                var visualRoot = new TestRoot();
+                visualRoot.Child = target;
 
-            CreateNodeDataTemplate(target);
-            ApplyTemplates(target);
-            ExpandAll(target);
+                CreateNodeDataTemplate(target);
+                ApplyTemplates(target);
+                ExpandAll(target);
 
-            var item = tree[0].Children[1].Children[0];
-            var container = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(item);
+                var item = tree[0].Children[1].Children[0];
+                var container = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(item);
 
-            Assert.NotNull(container);
+                Assert.NotNull(container);
 
-            target.SelectedItem = item;
+                target.SelectedItem = item;
 
-            Assert.True(container.IsSelected);
+                Assert.True(container.IsSelected);
 
-            _mouse.Click(container, modifiers: KeyModifiers.Control);
+                _mouse.Click(container, modifiers: KeyModifiers.Control);
 
-            Assert.Null(target.SelectedItem);
-            Assert.False(container.IsSelected);
+                Assert.Null(target.SelectedItem);
+                Assert.False(container.IsSelected);
+            }
         }
 
         [Fact]
         public void Clicking_WithControlModifier_Not_Selected_Item_Should_Select_It()
         {
-            var tree = CreateTestTreeData();
-            var target = new TreeView
+            using (Application())
             {
-                Template = CreateTreeViewTemplate(),
-                Items = tree
-            };
+                var tree = CreateTestTreeData();
+                var target = new TreeView
+                {
+                    Template = CreateTreeViewTemplate(),
+                    Items = tree
+                };
 
-            var visualRoot = new TestRoot();
-            visualRoot.Child = target;
+                var visualRoot = new TestRoot();
+                visualRoot.Child = target;
 
-            CreateNodeDataTemplate(target);
-            ApplyTemplates(target);
-            ExpandAll(target);
+                CreateNodeDataTemplate(target);
+                ApplyTemplates(target);
+                ExpandAll(target);
 
-            var item1 = tree[0].Children[1].Children[0];
-            var container1 = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(item1);
+                var item1 = tree[0].Children[1].Children[0];
+                var container1 = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(item1);
 
-            var item2 = tree[0].Children[1];
-            var container2 = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(item2);
+                var item2 = tree[0].Children[1];
+                var container2 = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(item2);
 
-            Assert.NotNull(container1);
-            Assert.NotNull(container2);
+                Assert.NotNull(container1);
+                Assert.NotNull(container2);
 
-            target.SelectedItem = item1;
+                target.SelectedItem = item1;
 
-            Assert.True(container1.IsSelected);
+                Assert.True(container1.IsSelected);
 
-            _mouse.Click(container2, modifiers: KeyModifiers.Control);
-            
-            Assert.Equal(item2, target.SelectedItem);
-            Assert.False(container1.IsSelected);
-            Assert.True(container2.IsSelected);
+                _mouse.Click(container2, modifiers: KeyModifiers.Control);
+
+                Assert.Equal(item2, target.SelectedItem);
+                Assert.False(container1.IsSelected);
+                Assert.True(container2.IsSelected);
+            }
         }
 
         [Fact]
         public void Clicking_WithControlModifier_Selected_Item_Should_Deselect_And_Remove_From_SelectedItems()
         {
-            var tree = CreateTestTreeData();
-            var target = new TreeView
+            using (Application())
             {
-                Template = CreateTreeViewTemplate(),
-                Items = tree,
-                SelectionMode = SelectionMode.Multiple
-            };
+                var tree = CreateTestTreeData();
+                var target = new TreeView
+                {
+                    Template = CreateTreeViewTemplate(),
+                    Items = tree,
+                    SelectionMode = SelectionMode.Multiple
+                };
 
-            var visualRoot = new TestRoot();
-            visualRoot.Child = target;
+                var visualRoot = new TestRoot();
+                visualRoot.Child = target;
 
-            CreateNodeDataTemplate(target);
-            ApplyTemplates(target);
-            ExpandAll(target);
+                CreateNodeDataTemplate(target);
+                ApplyTemplates(target);
+                ExpandAll(target);
 
-            var rootNode = tree[0];
+                var rootNode = tree[0];
 
-            var item1 = rootNode.Children[0];
-            var item2 = rootNode.Children.Last();
+                var item1 = rootNode.Children[0];
+                var item2 = rootNode.Children.Last();
 
-            var item1Container = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(item1);
-            var item2Container = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(item2);
+                var item1Container = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(item1);
+                var item2Container = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(item2);
 
-            ClickContainer(item1Container, KeyModifiers.Control);
-            Assert.True(item1Container.IsSelected);
+                ClickContainer(item1Container, KeyModifiers.Control);
+                Assert.True(item1Container.IsSelected);
 
-            ClickContainer(item2Container, KeyModifiers.Control);
-            Assert.True(item2Container.IsSelected);
+                ClickContainer(item2Container, KeyModifiers.Control);
+                Assert.True(item2Container.IsSelected);
 
-            Assert.Equal(new[] {item1, item2}, target.Selection.SelectedItems.OfType<Node>());
+                Assert.Equal(new[] { item1, item2 }, target.Selection.SelectedItems.OfType<Node>());
 
-            ClickContainer(item1Container, KeyModifiers.Control);
-            Assert.False(item1Container.IsSelected);
+                ClickContainer(item1Container, KeyModifiers.Control);
+                Assert.False(item1Container.IsSelected);
 
-            Assert.DoesNotContain(item1, target.Selection.SelectedItems.OfType<Node>());
+                Assert.DoesNotContain(item1, target.Selection.SelectedItems.OfType<Node>());
+            }
         }
 
         [Fact]
         public void Clicking_WithShiftModifier_DownDirection_Should_Select_Range_Of_Items()
         {
-            var tree = CreateTestTreeData();
-            var target = new TreeView
+            using (Application())
             {
-                Template = CreateTreeViewTemplate(),
-                Items = tree,
-                SelectionMode = SelectionMode.Multiple
-            };
+                var tree = CreateTestTreeData();
+                var target = new TreeView
+                {
+                    Template = CreateTreeViewTemplate(),
+                    Items = tree,
+                    SelectionMode = SelectionMode.Multiple
+                };
 
-            var visualRoot = new TestRoot();
-            visualRoot.Child = target;
+                var visualRoot = new TestRoot();
+                visualRoot.Child = target;
 
-            CreateNodeDataTemplate(target);
-            ApplyTemplates(target);
-            ExpandAll(target);
+                CreateNodeDataTemplate(target);
+                ApplyTemplates(target);
+                ExpandAll(target);
 
-            var rootNode = tree[0];
+                var rootNode = tree[0];
 
-            var from = rootNode.Children[0];
-            var to = rootNode.Children.Last();
+                var from = rootNode.Children[0];
+                var to = rootNode.Children.Last();
 
-            var fromContainer = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(from);
-            var toContainer = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(to);
+                var fromContainer = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(from);
+                var toContainer = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(to);
 
-            ClickContainer(fromContainer, KeyModifiers.None);
+                ClickContainer(fromContainer, KeyModifiers.None);
 
-            Assert.True(fromContainer.IsSelected);
+                Assert.True(fromContainer.IsSelected);
 
-            ClickContainer(toContainer, KeyModifiers.Shift);
-            AssertChildrenSelected(target, rootNode);
+                ClickContainer(toContainer, KeyModifiers.Shift);
+                AssertChildrenSelected(target, rootNode);
+            }
         }
 
         [Fact]
         public void Clicking_WithShiftModifier_UpDirection_Should_Select_Range_Of_Items()
         {
-            var tree = CreateTestTreeData();
-            var target = new TreeView
+            using (Application())
             {
-                Template = CreateTreeViewTemplate(),
-                Items = tree,
-                SelectionMode = SelectionMode.Multiple
-            };
+                var tree = CreateTestTreeData();
+                var target = new TreeView
+                {
+                    Template = CreateTreeViewTemplate(),
+                    Items = tree,
+                    SelectionMode = SelectionMode.Multiple
+                };
 
-            var visualRoot = new TestRoot();
-            visualRoot.Child = target;
+                var visualRoot = new TestRoot();
+                visualRoot.Child = target;
 
-            CreateNodeDataTemplate(target);
-            ApplyTemplates(target);
-            ExpandAll(target);
+                CreateNodeDataTemplate(target);
+                ApplyTemplates(target);
+                ExpandAll(target);
 
-            var rootNode = tree[0];
+                var rootNode = tree[0];
 
-            var from = rootNode.Children.Last();
-            var to = rootNode.Children[0];
+                var from = rootNode.Children.Last();
+                var to = rootNode.Children[0];
 
-            var fromContainer = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(from);
-            var toContainer = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(to);
+                var fromContainer = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(from);
+                var toContainer = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(to);
 
-            ClickContainer(fromContainer, KeyModifiers.None);
+                ClickContainer(fromContainer, KeyModifiers.None);
 
-            Assert.True(fromContainer.IsSelected);
+                Assert.True(fromContainer.IsSelected);
 
-            ClickContainer(toContainer, KeyModifiers.Shift);
-            AssertChildrenSelected(target, rootNode);
+                ClickContainer(toContainer, KeyModifiers.Shift);
+                AssertChildrenSelected(target, rootNode);
+            }
         }
 
         [Fact]
         public void Clicking_First_Item_Of_SelectedItems_Should_Select_Only_It()
         {
-            var tree = CreateTestTreeData();
-            var target = new TreeView
+            using (Application())
             {
-                Template = CreateTreeViewTemplate(),
-                Items = tree,
-                SelectionMode = SelectionMode.Multiple
-            };
+                var tree = CreateTestTreeData();
+                var target = new TreeView
+                {
+                    Template = CreateTreeViewTemplate(),
+                    Items = tree,
+                    SelectionMode = SelectionMode.Multiple
+                };
 
-            var visualRoot = new TestRoot();
-            visualRoot.Child = target;
+                var visualRoot = new TestRoot();
+                visualRoot.Child = target;
 
-            CreateNodeDataTemplate(target);
-            ApplyTemplates(target);
-            ExpandAll(target);
+                CreateNodeDataTemplate(target);
+                ApplyTemplates(target);
+                ExpandAll(target);
 
-            var rootNode = tree[0];
+                var rootNode = tree[0];
 
-            var from = rootNode.Children.Last();
-            var to = rootNode.Children[0];
+                var from = rootNode.Children.Last();
+                var to = rootNode.Children[0];
 
-            var fromContainer = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(from);
-            var toContainer = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(to);
+                var fromContainer = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(from);
+                var toContainer = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(to);
 
-            ClickContainer(fromContainer, KeyModifiers.None);
+                ClickContainer(fromContainer, KeyModifiers.None);
 
-            ClickContainer(toContainer, KeyModifiers.Shift);
-            AssertChildrenSelected(target, rootNode);
+                ClickContainer(toContainer, KeyModifiers.Shift);
+                AssertChildrenSelected(target, rootNode);
 
-            ClickContainer(fromContainer, KeyModifiers.None);
+                ClickContainer(fromContainer, KeyModifiers.None);
 
-            Assert.True(fromContainer.IsSelected);
+                Assert.True(fromContainer.IsSelected);
 
-            foreach (var child in rootNode.Children)
-            {
-                if (child == from)
+                foreach (var child in rootNode.Children)
                 {
-                    continue;
-                }
+                    if (child == from)
+                    {
+                        continue;
+                    }
 
-                var container = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(child);
+                    var container = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(child);
 
-                Assert.False(container.IsSelected);
+                    Assert.False(container.IsSelected);
+                }
             }
         }
 
         [Fact]
         public void Setting_SelectedItem_Should_Set_Container_Selected()
         {
-            var tree = CreateTestTreeData();
-            var target = new TreeView
+            using (Application())
             {
-                Template = CreateTreeViewTemplate(),
-                Items = tree,
-            };
+                var tree = CreateTestTreeData();
+                var target = new TreeView
+                {
+                    Template = CreateTreeViewTemplate(),
+                    Items = tree,
+                };
 
-            var visualRoot = new TestRoot();
-            visualRoot.Child = target;
+                var visualRoot = new TestRoot();
+                visualRoot.Child = target;
 
-            CreateNodeDataTemplate(target);
-            ApplyTemplates(target);
-            ExpandAll(target);
+                CreateNodeDataTemplate(target);
+                ApplyTemplates(target);
+                ExpandAll(target);
 
-            var item = tree[0].Children[1].Children[0];
-            var container = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(item);
+                var item = tree[0].Children[1].Children[0];
+                var container = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(item);
 
-            Assert.NotNull(container);
+                Assert.NotNull(container);
 
-            target.SelectedItem = item;
+                target.SelectedItem = item;
 
-            Assert.True(container.IsSelected);
+                Assert.True(container.IsSelected);
+            }
         }
 
         [Fact]
         public void Setting_SelectedItem_Should_Raise_SelectedItemChanged_Event()
         {
-            var tree = CreateTestTreeData();
-            var target = new TreeView
+            using (Application())
             {
-                Template = CreateTreeViewTemplate(),
-                Items = tree,
-            };
+                var tree = CreateTestTreeData();
+                var target = new TreeView
+                {
+                    Template = CreateTreeViewTemplate(),
+                    Items = tree,
+                };
 
-            var visualRoot = new TestRoot();
-            visualRoot.Child = target;
+                var visualRoot = new TestRoot();
+                visualRoot.Child = target;
 
-            CreateNodeDataTemplate(target);
-            ApplyTemplates(target);
-            ExpandAll(target);
+                CreateNodeDataTemplate(target);
+                ApplyTemplates(target);
+                ExpandAll(target);
 
-            var item = tree[0].Children[1].Children[0];
+                var item = tree[0].Children[1].Children[0];
 
-            var called = false;
-            target.SelectionChanged += (s, e) =>
-            {
-                Assert.Empty(e.RemovedItems);
-                Assert.Equal(1, e.AddedItems.Count);
-                Assert.Same(item, e.AddedItems[0]);
-                called = true;
-            };
+                var called = false;
+                target.SelectionChanged += (s, e) =>
+                {
+                    Assert.Empty(e.RemovedItems);
+                    Assert.Equal(1, e.AddedItems.Count);
+                    Assert.Same(item, e.AddedItems[0]);
+                    called = true;
+                };
 
-            target.SelectedItem = item;
-            Assert.True(called);
+                target.SelectedItem = item;
+                Assert.True(called);
+            }
         }
 
         [Fact]
@@ -564,7 +591,7 @@ namespace Avalonia.Controls.UnitTests
         [Fact]
         public void Keyboard_Navigation_Should_Move_To_Last_Selected_Node()
         {
-            using (UnitTestApplication.Start(TestServices.RealFocus))
+            using (Application())
             {
                 var focus = FocusManager.Instance;
                 var navigation = AvaloniaLocator.Current.GetService<IKeyboardNavigationHandler>();
@@ -647,7 +674,7 @@ namespace Avalonia.Controls.UnitTests
         [Fact]
         public void Pressing_SelectAll_Gesture_With_Downward_Range_Selected_Should_Select_All_Nodes()
         {
-            using (UnitTestApplication.Start())
+            using (Application())
             {
                 var tree = CreateTestTreeData();
                 var target = new TreeView
@@ -694,7 +721,7 @@ namespace Avalonia.Controls.UnitTests
         [Fact]
         public void Pressing_SelectAll_Gesture_With_Upward_Range_Selected_Should_Select_All_Nodes()
         {
-            using (UnitTestApplication.Start())
+            using (Application())
             {
                 var tree = CreateTestTreeData();
                 var target = new TreeView
@@ -768,97 +795,106 @@ namespace Avalonia.Controls.UnitTests
         [Fact]
         public void Right_Click_On_UnselectedItem_Should_Clear_Existing_Selection()
         {
-            var tree = CreateTestTreeData();
-            var target = new TreeView
+            using (Application())
             {
-                Template = CreateTreeViewTemplate(),
-                Items = tree,
-                SelectionMode = SelectionMode.Multiple,
-            };
+                var tree = CreateTestTreeData();
+                var target = new TreeView
+                {
+                    Template = CreateTreeViewTemplate(),
+                    Items = tree,
+                    SelectionMode = SelectionMode.Multiple,
+                };
 
-            var visualRoot = new TestRoot();
-            visualRoot.Child = target;
+                var visualRoot = new TestRoot();
+                visualRoot.Child = target;
 
-            CreateNodeDataTemplate(target);
-            ApplyTemplates(target);
-            target.ExpandSubTree((TreeViewItem)target.Presenter.Panel.Children[0]);
+                CreateNodeDataTemplate(target);
+                ApplyTemplates(target);
+                target.ExpandSubTree((TreeViewItem)target.Presenter.Panel.Children[0]);
 
-            var rootNode = tree[0];
-            var to = rootNode.Children[0];
-            var then = rootNode.Children[1];
+                var rootNode = tree[0];
+                var to = rootNode.Children[0];
+                var then = rootNode.Children[1];
 
-            var fromContainer = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(rootNode);
-            var toContainer = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(to);
-            var thenContainer = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(then);
+                var fromContainer = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(rootNode);
+                var toContainer = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(to);
+                var thenContainer = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(then);
 
-            ClickContainer(fromContainer, KeyModifiers.None);
-            ClickContainer(toContainer, KeyModifiers.Shift);
+                ClickContainer(fromContainer, KeyModifiers.None);
+                ClickContainer(toContainer, KeyModifiers.Shift);
 
-            Assert.Equal(2, target.Selection.SelectedItems.Count);
+                Assert.Equal(2, target.Selection.SelectedItems.Count);
 
-            _mouse.Click(thenContainer, MouseButton.Right);
+                _mouse.Click(thenContainer, MouseButton.Right);
 
-            Assert.Equal(1, target.Selection.SelectedItems.Count);
+                Assert.Equal(1, target.Selection.SelectedItems.Count);
+            }
         }
 
         [Fact]
         public void Shift_Right_Click_Should_Not_Select_Multiple()
         {
-            var tree = CreateTestTreeData();
-            var target = new TreeView
+            using (Application())
             {
-                Template = CreateTreeViewTemplate(),
-                Items = tree,
-                SelectionMode = SelectionMode.Multiple,
-            };
+                var tree = CreateTestTreeData();
+                var target = new TreeView
+                {
+                    Template = CreateTreeViewTemplate(),
+                    Items = tree,
+                    SelectionMode = SelectionMode.Multiple,
+                };
 
-            var visualRoot = new TestRoot();
-            visualRoot.Child = target;
+                var visualRoot = new TestRoot();
+                visualRoot.Child = target;
 
-            CreateNodeDataTemplate(target);
-            ApplyTemplates(target);
-            target.ExpandSubTree((TreeViewItem)target.Presenter.Panel.Children[0]);
+                CreateNodeDataTemplate(target);
+                ApplyTemplates(target);
+                target.ExpandSubTree((TreeViewItem)target.Presenter.Panel.Children[0]);
 
-            var rootNode = tree[0];
-            var from = rootNode.Children[0];
-            var to = rootNode.Children[1];
-            var fromContainer = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(from);
-            var toContainer = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(to);
+                var rootNode = tree[0];
+                var from = rootNode.Children[0];
+                var to = rootNode.Children[1];
+                var fromContainer = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(from);
+                var toContainer = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(to);
 
-            _mouse.Click(fromContainer);
-            _mouse.Click(toContainer, MouseButton.Right, modifiers: KeyModifiers.Shift);
+                _mouse.Click(fromContainer);
+                _mouse.Click(toContainer, MouseButton.Right, modifiers: KeyModifiers.Shift);
 
-            Assert.Equal(1, target.Selection.SelectedItems.Count);
+                Assert.Equal(1, target.Selection.SelectedItems.Count);
+            }
         }
 
         [Fact]
         public void Ctrl_Right_Click_Should_Not_Select_Multiple()
         {
-            var tree = CreateTestTreeData();
-            var target = new TreeView
+            using (Application())
             {
-                Template = CreateTreeViewTemplate(),
-                Items = tree,
-                SelectionMode = SelectionMode.Multiple,
-            };
+                var tree = CreateTestTreeData();
+                var target = new TreeView
+                {
+                    Template = CreateTreeViewTemplate(),
+                    Items = tree,
+                    SelectionMode = SelectionMode.Multiple,
+                };
 
-            var visualRoot = new TestRoot();
-            visualRoot.Child = target;
+                var visualRoot = new TestRoot();
+                visualRoot.Child = target;
 
-            CreateNodeDataTemplate(target);
-            ApplyTemplates(target);
-            target.ExpandSubTree((TreeViewItem)target.Presenter.Panel.Children[0]);
+                CreateNodeDataTemplate(target);
+                ApplyTemplates(target);
+                target.ExpandSubTree((TreeViewItem)target.Presenter.Panel.Children[0]);
 
-            var rootNode = tree[0];
-            var from = rootNode.Children[0];
-            var to = rootNode.Children[1];
-            var fromContainer = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(from);
-            var toContainer = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(to);
+                var rootNode = tree[0];
+                var from = rootNode.Children[0];
+                var to = rootNode.Children[1];
+                var fromContainer = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(from);
+                var toContainer = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(to);
 
-            _mouse.Click(fromContainer);
-            _mouse.Click(toContainer, MouseButton.Right, modifiers: KeyModifiers.Control);
+                _mouse.Click(fromContainer);
+                _mouse.Click(toContainer, MouseButton.Right, modifiers: KeyModifiers.Control);
 
-            Assert.Equal(1, target.Selection.SelectedItems.Count);
+                Assert.Equal(1, target.Selection.SelectedItems.Count);
+            }
         }
 
         [Fact]
@@ -944,7 +980,7 @@ namespace Avalonia.Controls.UnitTests
         public void Auto_Expanding_In_Style_Should_Not_Break_Range_Selection()
         {
             /// Issue #2980.
-            using (UnitTestApplication.Start(TestServices.RealStyler))
+            using (Application())
             {
                 var target = new DerivedTreeView
                 {
@@ -1183,12 +1219,12 @@ namespace Avalonia.Controls.UnitTests
             }
         }
 
-        void ClickContainer(IControl container, KeyModifiers modifiers)
+        private void ClickContainer(IControl container, KeyModifiers modifiers)
         {
             _mouse.Click(container, modifiers: modifiers);
         }
 
-        void AssertChildrenSelected(TreeView treeView, Node rootNode)
+        private void AssertChildrenSelected(TreeView treeView, Node rootNode)
         {
             foreach (var child in rootNode.Children)
             {
@@ -1198,6 +1234,16 @@ namespace Avalonia.Controls.UnitTests
             }
         }
 
+        private IDisposable Application()
+        {
+            return UnitTestApplication.Start(
+                TestServices.MockThreadingInterface.With(
+                    focusManager: new FocusManager(),
+                    keyboardDevice: () => new KeyboardDevice(),
+                    keyboardNavigation: new KeyboardNavigationHandler(),
+                    inputManager: new InputManager()));
+        }
+
         private class Node : NotifyingBase
         {
             private IAvaloniaList<Node> _children;