Wpf 如何查看扩展的TreeView项目的所有TreeView项目

Wpf 如何查看扩展的TreeView项目的所有TreeView项目,wpf,treeview,Wpf,Treeview,在我的窗口中我有树状视图TreeView.ItemsSource绑定到我的数据(分层数据结构)。当我展开当前滚动条位置底部的一些TreeViewItem时,我的子项被隐藏,我必须滚动才能看到它们。是否有任何方法可以查看扩展项的所有子项 我尝试过这个,但没有成功: public void TreeViewItem_Expanded(object sender, RoutedEventArgs e) { TreeViewItem tvi = e.OriginalSource as TreeV

在我的
窗口中
我有
树状视图
TreeView.ItemsSource
绑定到我的数据(分层数据结构)。当我展开当前滚动条位置底部的一些
TreeViewItem
时,我的子项被隐藏,我必须滚动才能看到它们。是否有任何方法可以查看扩展项的所有子项

我尝试过这个,但没有成功:

public void TreeViewItem_Expanded(object sender, RoutedEventArgs e)
{
    TreeViewItem tvi = e.OriginalSource as TreeViewItem;
    if (tvi != null)
    {
        Debug.WriteLine("TreeNode '{0}' was expanded", tvi.Header);
        tvi.BringIntoView();
    }
}

基本上,选择最后一个子项,并在展开项时将其显示在视图中。如果它没有子项,则将该项本身置于视图中

棘手的部分是,在执行事件时,子项不一定可用,因此我建议您检查
ItemContainerGenerator.Status
,如果尚未完成,请订阅
ItemContainerGenerator.StatusChanged
事件

下面的代码只使用静态项进行测试,如果它对动态数据源造成问题,我可能需要重新检查一些细节

void TreeViewItem_Expanded(object sender, RoutedEventArgs e)
{
    TreeViewItem tvi = e.OriginalSource as TreeViewItem;
    if (tvi != null)
    {
        if (tvi.HasItems)
        {
            if (tvi.ItemContainerGenerator.Status == GeneratorStatus.ContainersGenerated)
            {
                BringLastItemIntoView(tvi.ItemContainerGenerator);
            }
            else
            {
                tvi.ItemContainerGenerator.StatusChanged += ItemContainerGenerator_StatusChanged;
            }
        }
        else
        {
            tvi.BringIntoView();
        }
    }
}

void ItemContainerGenerator_StatusChanged(object sender, EventArgs e)
{
    var s = sender as ItemContainerGenerator;
    if (s.Status == GeneratorStatus.ContainersGenerated)
    {
        BringLastItemIntoView(s);
        s.StatusChanged -= ItemContainerGenerator_StatusChanged;
    }
}

void BringLastItemIntoView(ItemContainerGenerator generator)
{
    var tvi = generator.ContainerFromItem(generator.Items.LastOrDefault()) as TreeViewItem;
    if (tvi != null)
    {
        tvi.BringIntoView();
    }
}