突出显示 WPF ListView 中的搜索文本






4.80/5 (11投票s)
这是“突出显示 WPF ListView 中的搜索文本”的替代方案
介绍
这是 Jan Vilášek 的文章的替代实现,该文章位于此处:Highlight-Searched-Text-in-WPF-ListView
此方法展示了如何在筛选 + 排序数千个条目的同时,高亮显示与您的搜索词匹配的文本,同时利用虚拟化,以避免 WPF 程序运行速度比平时更慢。
这个近乎 100% 原创且重写的版本中的新增功能是:
- 能够搜索并筛选掉不匹配的项目。
- 能够通过单击列表视图的列标题对项目进行排序。
- 一种高度高效的实现,不依赖于递归来应用高亮显示效果。
- 一个“WPF 自定义控件类库”的例子!! (您需要知道的是它只是一个常规的类库,但是您需要配置它的 AssemblyInfo.cs 并拥有一个带有 "Generic.xaml" 的 "Themes" 文件夹,才能使其工作)。
使用代码
该程序非常易于使用。只需在搜索框中键入一些文本,列表视图中可供查看的项目数量将受到限制,因此只有包含您的搜索请求的项目才会可见。此外,您可以单击“名字”和“姓氏”列对项目进行排序。
为此项目创建的 HighlightTextBox
控件也具有很高的可重用性,因此值得熟悉其简单的设计和用法:
要使用此控件,只需使用 HighlightPhrase
属性指定要高亮显示的内容,如果此字符串片段包含在 Text
属性中,则将使用 HighlightBrush
高亮显示它。
此控件用于列表视图的 DataTemplate 中,以定义如何动态处理列表视图项的呈现。 这是实际 XAML 的最小表示:
<ListView Name="listView"
VirtualizingStackPanel.IsVirtualizing="True"
VirtualizingStackPanel.VirtualizationMode="Recycling">
<ListView.View>
<GridView>
<GridViewColumn Width="200">
<GridViewColumnHeader Content="First Name" />
<GridViewColumn.CellTemplate>
<DataTemplate>
<controls:HighlightTextBlock Text="{Binding Path=FirstName}"
HighlightPhrase="{Binding ElementName=textBoxSearch, Path=Text}" />
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn Width="200">
<GridViewColumnHeader Content="Last Name" />
<GridViewColumn.CellTemplate>
<DataTemplate>
<controls:HighlightTextBlock Text="{Binding Path=LastName}"
HighlightPhrase="{Binding ElementName=textBoxSearch, Path=Text}" />
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
</GridView>
</ListView.View>
</ListView>
关注点
我在编写此代码时了解到的一件事可能是解决此问题的方案:WPF ListBox VirtualizingStackPanel.VirtualizationMode=“Recycling” 导致滚动时始终显示相同的列表项。
现在我没有遇到完全相同的问题,但我确实遇到了类似的行为,即,将虚拟化模式设置为标准可以解决该问题(但会损害性能),并且只有在滚动时才会发生这种情况。 在我的问题版本中,当您快速滚动项目时,高亮显示不会显示出来,但是对于您第一次在搜索框中键入内容时可以看到的项目,它可以完美地工作。
解决方案是重载 HighlightTextBox
的“Text
”和“TextProperty
”并设置 PropertyChangedCallback
,这会导致在文本更改时重新应用高亮显示(我知道,现在这似乎是显而易见的,因为缺少此代码绝对是一个错误,因为您需要更新高亮显示,如果文本更改与高亮短语更改一样多,但是令人惊讶的是,我编写的代码看起来如此完美,以至于只有在回收虚拟化模式下滚动时才看到该问题)。
新的“Text
”属性解决问题的原因是,当您在回收虚拟化模式下滚动时,HighlightTextBox
的现有实例正在设置其 Text
属性,也许我期望 HighlightPhrase 属性也会被设置,但只有在您在该搜索文本框中键入内容时才会实际发生(根据我在 *MainWindow.xaml* 中的绑定)。
因此总结一下:如果您在回收模式下遇到任何问题,则需要修复您在 DataTemplate 中使用的控件。
历史
- 2010年6月25日:修复了错误。 同时清理了代码 + 添加了一种查看虚拟化实际运行的方式,即窗口标题中更详细的信息。
- 2012年6月24日:首次发布。