Browse Source

Fix #74 Jumping to other type doesn't scroll the tree

pull/252/head
Daniel Grunwald 15 years ago
parent
commit
7789284161
  1. 2
      SharpTreeView/SharpTreeNodeView.cs
  2. 43
      SharpTreeView/SharpTreeView.cs

2
SharpTreeView/SharpTreeNodeView.cs

@ -97,8 +97,6 @@ namespace ICSharpCode.TreeView
} else if (e.PropertyName == "IsExpanded") { } else if (e.PropertyName == "IsExpanded") {
if (Node.IsExpanded) if (Node.IsExpanded)
ParentTreeView.HandleExpanding(Node); ParentTreeView.HandleExpanding(Node);
else
ParentTreeView.HandleCollapsing(Node);
} }
} }

43
SharpTreeView/SharpTreeView.cs

@ -3,6 +3,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Collections.Specialized;
using System.Diagnostics; using System.Diagnostics;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
@ -130,10 +131,30 @@ namespace ICSharpCode.TreeView
Root.IsExpanded = true; Root.IsExpanded = true;
} }
flattener = new TreeFlattener(Root, ShowRoot); flattener = new TreeFlattener(Root, ShowRoot);
flattener.CollectionChanged += flattener_CollectionChanged;
this.ItemsSource = flattener; this.ItemsSource = flattener;
} }
} }
void flattener_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
// Deselect nodes that are being hidden
if (e.Action == NotifyCollectionChangedAction.Remove) {
List<SharpTreeNode> selectedOldItems = null;
foreach (SharpTreeNode node in e.OldItems) {
if (node.IsSelected) {
if (selectedOldItems == null)
selectedOldItems = new List<SharpTreeNode>();
selectedOldItems.Add(node);
}
}
if (selectedOldItems != null) {
var list = SelectedItems.Cast<SharpTreeNode>().Except(selectedOldItems).ToList();
SetSelectedItems(list);
}
}
}
protected override DependencyObject GetContainerForItemOverride() protected override DependencyObject GetContainerForItemOverride()
{ {
return new SharpTreeViewItem(); return new SharpTreeViewItem();
@ -151,8 +172,16 @@ namespace ICSharpCode.TreeView
container.ParentTreeView = this; container.ParentTreeView = this;
} }
bool doNotScrollOnExpanding;
/// <summary>
/// Handles the node expanding event in the tree view.
/// This method gets called only if the node is in the visible region (a SharpTreeNodeView exists).
/// </summary>
internal void HandleExpanding(SharpTreeNode node) internal void HandleExpanding(SharpTreeNode node)
{ {
if (doNotScrollOnExpanding)
return;
SharpTreeNode lastVisibleChild = node; SharpTreeNode lastVisibleChild = node;
while (true) { while (true) {
SharpTreeNode tmp = lastVisibleChild.Children.LastOrDefault(c => c.IsVisible); SharpTreeNode tmp = lastVisibleChild.Children.LastOrDefault(c => c.IsVisible);
@ -174,16 +203,6 @@ namespace ICSharpCode.TreeView
} }
} }
internal void HandleCollapsing(SharpTreeNode node)
{
var selectedChilds = node.VisibleDescendants().Where(n => n.IsSelected);
if (selectedChilds.Any()) {
var list = SelectedItems.Cast<SharpTreeNode>().Except(selectedChilds).ToList();
list.AddOnce(node);
SetSelectedItems(list);
}
}
protected override void OnKeyDown(KeyEventArgs e) protected override void OnKeyDown(KeyEventArgs e)
{ {
SharpTreeViewItem container = e.OriginalSource as SharpTreeViewItem; SharpTreeViewItem container = e.OriginalSource as SharpTreeViewItem;
@ -269,8 +288,10 @@ namespace ICSharpCode.TreeView
{ {
if (node == null) if (node == null)
throw new ArgumentNullException("node"); throw new ArgumentNullException("node");
doNotScrollOnExpanding = true;
foreach (SharpTreeNode ancestor in node.Ancestors()) foreach (SharpTreeNode ancestor in node.Ancestors())
ancestor.IsExpanded = true; ancestor.IsExpanded = true;
doNotScrollOnExpanding = false;
base.ScrollIntoView(node); base.ScrollIntoView(node);
} }

Loading…
Cancel
Save