0

我目前正在开发 WPF TreeView 显示。这个TreeView的内容来自普通的Data Binding:

<TreeView HorizontalAlignment="Stretch" 
      x:Name="LogMonitor" 
      VerticalAlignment="Stretch"
      ItemsSource="{Binding LogEntries, UpdateSourceTrigger = PropertyChanged }">
    <TreeView.Resources>
        <HierarchicalDataTemplate 
                DataType="{x:Type Log:SystemLog}"
                ItemsSource="{Binding Path=Lines}">
                <TextBlock Text="{Binding Header}"/>
        </HierarchicalDataTemplate>
    </TreeView.Resources>
</TreeView>

TreeView 是按关键字过滤的,但我还希望对保留在 TreeView 中的所有 TreeViewItem 进行关键字突出显示。

例如,如果有一个带有标题“This is an apple”的 TreeViewItem,并且用户键入“apple”作为过滤关键字,它应该显示一个 TreeViewItem,如下所示:

强调

我尝试了一些方法,但运气不佳。

  1. 使用内置样式:
    突出显示需要字符串匹配并将颜色块放在匹配的子字符串下方。似乎没有可以这样装扮的内置样式模板。

  2. 在 ViewModel 对象中绘制到画布并将画布绑定到 TreeViewItem :
    它仅在未选择 TreeViewItem 时有效,一旦选择,内置的绘制调用无法找到以“突出显示”样式绘制画布的方法并离开一个空白区域。

  3. 创建 TreeViewItem 的子类并重写 OnRender 函数,然后替换 TreeView 的 ItemContainerGenerator 以返回我的 TreeViewItem 子类:
    不可能,TreeView 的 ItemContainerGenerator 不可设置且非虚拟。

    而且我只能想到另一种选择:

  4. 放弃Data Binding,自己将重写了OnRender函数的TreeViewItem的子类推入TreeView的Items列表中。

它在实验中给了我积极的结果。但我对放弃数据绑定范式感到不舒服。所以我想问有没有其他方法可以用数据绑定礼物来做所有者绘制。

谢谢你。

4

1 回答 1

0

创建一个用户控件,将文本分成 3 个区域:prehighlight、highlight 和 post highlight。您可以使用标准绑定和样式来完成这一切。每个 TreeViewItem 都是这些控件之一。

于 2012-11-20T03:00:14.910 回答