diff --git a/SharpTreeView/SharpTreeNodeView.cs b/SharpTreeView/SharpTreeNodeView.cs index 135e6158c..4a0980943 100644 --- a/SharpTreeView/SharpTreeNodeView.cs +++ b/SharpTreeView/SharpTreeNodeView.cs @@ -95,7 +95,9 @@ namespace ICSharpCode.TreeView } } } else if (e.PropertyName == "IsExpanded") { - if (Node.IsExpanded == false) + if (Node.IsExpanded) + ParentTreeView.HandleExpanding(Node); + else ParentTreeView.HandleCollapsing(Node); } } diff --git a/SharpTreeView/SharpTreeView.cs b/SharpTreeView/SharpTreeView.cs index 4d1112736..d9409b79b 100644 --- a/SharpTreeView/SharpTreeView.cs +++ b/SharpTreeView/SharpTreeView.cs @@ -151,12 +151,35 @@ namespace ICSharpCode.TreeView container.ParentTreeView = this; } - internal void HandleCollapsing(SharpTreeNode Node) + internal void HandleExpanding(SharpTreeNode node) + { + SharpTreeNode lastVisibleChild = node; + while (true) { + SharpTreeNode tmp = lastVisibleChild.Children.LastOrDefault(c => c.IsVisible); + if (tmp != null) { + lastVisibleChild = tmp; + } else { + break; + } + } + if (lastVisibleChild != node) { + // Make the the expanded children are visible; but don't scroll down + // to much (keep node itself visible) + base.ScrollIntoView(lastVisibleChild); + // For some reason, this only works properly when delaying it... + Dispatcher.BeginInvoke(DispatcherPriority.Loaded, new Action( + delegate { + base.ScrollIntoView(node); + })); + } + } + + internal void HandleCollapsing(SharpTreeNode node) { - var selectedChilds = Node.VisibleDescendants().Where(n => n.IsSelected); + var selectedChilds = node.VisibleDescendants().Where(n => n.IsSelected); if (selectedChilds.Any()) { var list = SelectedItems.Cast().Except(selectedChilds).ToList(); - list.AddOnce(Node); + list.AddOnce(node); SetSelectedItems(list); } }