WPFデフォルトのTreeViewは、ツリービューのトップビューを表示する必要がある場合、ノードの下部まで自動的にスクロールされます。どうやってするか?WPF TreeViewは自動的に下にスクロールされますか?
また、ビジュアルツリーを歩いてスクロールビューアを取得できませんでした。
WPFデフォルトのTreeViewは、ツリービューのトップビューを表示する必要がある場合、ノードの下部まで自動的にスクロールされます。どうやってするか?WPF TreeViewは自動的に下にスクロールされますか?
また、ビジュアルツリーを歩いてスクロールビューアを取得できませんでした。
トップノードを事前に選択し、選択変更イベントでTreeViewItem.BringIntoViewメソッドを呼び出します。 TreeViewItemを保持するには、TreeView.ItemContainerGenerator.ContainerFromItem(e.NewValue)を呼び出します。
このコードは非常に粗いです。 TreeViewItem.BringIntoView()を取得して上部にアイテムを取得するためのキーは、最初にTreeViewを上部ではなく下部にスクロールすることです。 これを行うには、まずツリービューのコントロールテンプレート内のScrollViewerにアクセスする必要があります。 IMOをめちゃくちゃにすることは、当初からフレームワークで提供されていたはずです。
この場合のアイテムコントロールは、上に到達しようとしているTreeViewItemである必要があります。 uxTreeコントロールはTreeViewです。
item.IsSelected = true;
ScrollViewer scroller = (ScrollViewer)this.FindVisualChildElement(this.uxTree, typeof(ScrollViewer));
scroller.ScrollToBottom();
item.BringIntoView();
private FrameworkElement FindVisualChildElement(DependencyObject element, Type childType)
{
int count = VisualTreeHelper.GetChildrenCount(element);
for (int i = 0; i < count; i++)
{
var dependencyObject = VisualTreeHelper.GetChild(element, i);
var fe = (FrameworkElement)dependencyObject;
if (fe.GetType() == childType)
{
return fe;
}
FrameworkElement ret = null;
if (fe.GetType().Equals(typeof(ScrollViewer)))
{
ret = FindVisualChildElement((fe as ScrollViewer).Content as FrameworkElement, childType);
}
else
{
ret = FindVisualChildElement(fe, childType);
}
if (ret != null)
{
return ret;
}
}
return null;
}