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