可能重复:
WPF TreeView - How to scroll so expanded branch is visible
我正在开发一个利用WPF中标准TreeView功能的应用程序。我在TreeView中创建了一个搜索函数,它将解析整个树并找到匹配的标题(例如“Create”将用于查找标题为“Create a Project:”的TreeViewItem。如果我按下“enter”键,搜索文本框仍然具有焦点,它将通过树解析下一个可能的TreeViewItem。搜索功能的灵感来自Josh Smith's TreeView Article处的代码,但稍微修改以在我的应用程序及其节点的资源中工作(生成的树是动态的,具体取决于应用程序中导入的文件,我显然拥有自己的Object类。)
当我试图查找这个问题时,我发现了一百万次搜索命中,如何为TreeView设置SelectedItem(我没有遇到任何问题),但我找不到任何特别的我的问题是这样的:每次我进行搜索时,树都会找到SelectedItem(如果它存在),并且递归地调用IsExpanded = true到所有元素直到树的根。但有时发现的元素在TreeView的可视框架之外(我将滚动条设置为auto,因此当树在水平或垂直方向上变得太大时,启用滚动条)。 SelectedItem会相应更改,但我必须向下滚动TreeView才能找到匹配的位置。我希望做的是触发一个事件,该事件将检测SelectedItem何时被更改,然后强制TreeView的Visual在其可见帧内的某个点显示所选项(因此,如果找到它,它永远不会出现可见性) ,但我不知道究竟是怎么做到这一点(我对WPF的体验仅限于上个月左右我开发这个应用程序,因此我仍然对语言不熟悉并随着时间的推移进行选择)。
这有什么解决方案吗?如果需要,我可以提供代码,但我只是想找个人指出如何更改TreeView项目的可见区域的正确方向。
答案 0 :(得分:4)
您需要在所选的TreeViewItem上调用BringIntoView
。要使用此代码不污染ViewModel,可以创建一个Attached Property,当它设置为true时调用此方法并将其绑定到IsSelected
属性。
另一种方法是使用IsSelected
属性上的触发器来调用此方法,如here所示。
答案 1 :(得分:3)
您可以使用TreeViewItem样式中的简单EventSetter在选择项目时调用事件处理程序。然后为该项目调用BringIntoView。
<TreeView >
<TreeView.ItemContainerStyle>
<Style TargetType="{x:Type TreeViewItem}">
<EventSetter Event="Selected" Handler="TreeViewSelectedItemChanged" />
</Style>
</TreeView.ItemContainerStyle>
</TreeView>
private void TreeViewSelectedItemChanged(object sender, RoutedEventArgs e)
{
TreeViewItem item = sender as TreeViewItem;
if (item != null)
{
item.BringIntoView();
e.Handled = true;
}
}