我目前正在开发WPF TreeView显示器。此TreeView的内容来自普通的数据绑定:
<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进行关键字突出显示。
例如,如果有一个带有标题“这是一个苹果”的TreeViewItem,并且用户输入“apple”作为过滤关键字,它应该显示一个TreeViewItem看起来像:
我尝试了一些方法,但没有太多运气。
使用内置样式:
突出显示需要字符串匹配并将颜色块放在匹配的子字符串下面。似乎没有可以通过这种方式打扮的内置样式模板。
在ViewModel对象中绘制到画布并将画布绑定到TreeViewItem:
它仅在未选择TreeViewItem时有效,一旦选中,内置绘制调用无法找到以“突出显示”样式绘制画布的方法,只留下空白区域。
创建TreeViewItem的子类并覆盖OnRender函数,然后替换TreeView的ItemContainerGenerator返回我的TreeViewItem的子类:
不可能,TreeView的ItemContainerGenerator不可设置且非虚拟。
我只能想到另一个选择:
放弃数据绑定,将TreeViewItem的子类与覆盖的OnRender函数一起推送到TreeView的Items列表中。
它给了我实验的积极结果。但是我对放弃数据绑定范例感到不舒服。所以我想问一下,有没有其他方法可以使用数据绑定提示进行所有者绘制。
谢谢。
答案 0 :(得分:0)
创建一个用户控件,将文本分成3个区域:高亮显示,高亮显示和高亮显示。您可以使用标准绑定和样式完成所有操作。每个TreeViewItem都是这些控件之一。