TreeView.SelectItemHelper.cs 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. using System.Collections.Generic;
  2. using System.Windows.Controls;
  3. using System.Windows.Media;
  4. namespace System.Windows.Forms
  5. {
  6. public partial class TreeView
  7. {
  8. private static class SelectItemHelper
  9. {
  10. public static void Select(CustomControls.TreeView tree, TreeNode newNode)
  11. {
  12. if (!tree.IsLoaded)
  13. return;
  14. if (newNode == null)
  15. return;
  16. var nodeDynasty = new List<TreeNode> { newNode };
  17. var parent = newNode.Parent;
  18. while (parent != null)
  19. {
  20. nodeDynasty.Insert(0, parent);
  21. parent = parent.Parent;
  22. }
  23. var currentParent = tree as ItemsControl;
  24. foreach (var node in nodeDynasty)
  25. {
  26. // first try the easy way
  27. var newParent = currentParent.ItemContainerGenerator.ContainerFromItem(node) as TreeViewItem;
  28. if (newParent == null)
  29. {
  30. // if this failed, it's probably because of virtualization, and we will have to do it the hard way.
  31. // see also the question at http://stackoverflow.com/q/183636/46635
  32. var itemsPresenter = (ItemsPresenter)currentParent.Template.FindName("ItemsHost", currentParent);
  33. if (itemsPresenter == null)
  34. return;
  35. var virtualizingPanel = (VirtualizingPanel)VisualTreeHelper.GetChild(itemsPresenter, 0);
  36. var index = currentParent.Items.IndexOf(node);
  37. if (index < 0)
  38. return;
  39. virtualizingPanel.BringIndexIntoViewPublic(index);
  40. newParent = currentParent.ItemContainerGenerator.ContainerFromIndex(index) as TreeViewItem;
  41. }
  42. if (newParent == null)
  43. return;
  44. if (node == newNode)
  45. {
  46. newParent.IsSelected = true;
  47. newParent.BringIntoView();
  48. break;
  49. }
  50. newParent.IsExpanded = true;
  51. currentParent = newParent;
  52. }
  53. }
  54. }
  55. }
  56. }