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; } }