より良いエンジニアを目指して

1日1つ。良くなる!上手くなる!

WPFのTreeViewで指定のTreeViewItemまでスクロールする

TreeViewで選択している項目を保存して、アプリを起動し直した時に選択していた項目を復元する

といったことを実現したのですが、しかし選択項目までスクロールされないんですね。

それにはBringIntoViewを使います。

しかし、Bindingされているオブジェクトから取得したい、ではどうすれば良いか。

そこでItemContainerGeneratorと絡める必要があるようです。

いきなり、TreeView.ItemContainer.containerFromItem(オブジェクト)としても取得できない可能性があります。

それは、トップノードの直下で、子のノードであれば良いのですが、その孫であると取得ができないようです。

親から子へと取得していく必要があるようです。

私は以下のようなコードを書いて実現しました。

        private void ScrollSelectedTreeNodeItem(TreeNodeItem selectedItem)
        {
            var container =
                (TreeViewItem) TreeView.ItemContainerGenerator.ContainerFromItem(topTreeNodeItem);
            var parents = new List<TreeNodeItem>();
            var indexItem = selectedItem;
            do
            {
                parents.Insert(0, indexItem);
                indexItem = indexItem.Parent;
            } while (indexItem != null);

            // 一番最初のTreeNodeItemは、スキップする 
            foreach (var treeNodeItem in parents.Skip(1))
            {
                var targetContainer = (TreeViewItem) container.ItemContainerGenerator.ContainerFromItem(treeNodeItem);
                targetContainer.BringIntoView();
                container = targetContainer;
            }
        }

参考サイト

blog.okazuki.jp