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. 41
      SharpTreeView/SharpTreeView.cs

2
SharpTreeView/SharpTreeNodeView.cs

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

41
SharpTreeView/SharpTreeView.cs

@ -3,6 +3,7 @@ @@ -3,6 +3,7 @@
using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Diagnostics;
using System.Linq;
using System.Text;
@ -130,10 +131,30 @@ namespace ICSharpCode.TreeView @@ -130,10 +131,30 @@ namespace ICSharpCode.TreeView
Root.IsExpanded = true;
}
flattener = new TreeFlattener(Root, ShowRoot);
flattener.CollectionChanged += flattener_CollectionChanged;
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()
{
return new SharpTreeViewItem();
@ -151,8 +172,16 @@ namespace ICSharpCode.TreeView @@ -151,8 +172,16 @@ namespace ICSharpCode.TreeView
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)
{
if (doNotScrollOnExpanding)
return;
SharpTreeNode lastVisibleChild = node;
while (true) {
SharpTreeNode tmp = lastVisibleChild.Children.LastOrDefault(c => c.IsVisible);
@ -174,16 +203,6 @@ namespace ICSharpCode.TreeView @@ -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)
{
SharpTreeViewItem container = e.OriginalSource as SharpTreeViewItem;
@ -269,8 +288,10 @@ namespace ICSharpCode.TreeView @@ -269,8 +288,10 @@ namespace ICSharpCode.TreeView
{
if (node == null)
throw new ArgumentNullException("node");
doNotScrollOnExpanding = true;
foreach (SharpTreeNode ancestor in node.Ancestors())
ancestor.IsExpanded = true;
doNotScrollOnExpanding = false;
base.ScrollIntoView(node);
}

Loading…
Cancel
Save