如何更改树视图的视觉效果以自动显示SelectedItem?

时间:2011-08-23 17:32:40

标签: wpf c#-4.0 treeview

  

可能重复:
  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项目的可见区域的正确方向。

2 个答案:

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