讲师中心 微信公众号
AI工具推荐 视频效率加速

[WPF自定义控件库]排序、筛选以及高亮

梦杰小哥_4108

梦杰小哥_4108

发布时间:2025-09-24 08:12:31

|

893人浏览过

|

来源于php中文网

原创

要让列表的内容更容易查找,我们可以通过排序、筛选和高亮功能来优化列表。假设有一个本地数据源的列表,由于内容太多,查找特定数据会比较困难。通过改造后的列表,可以看到这些优化后的效果。

[WPF自定义控件库]排序、筛选以及高亮

[WPF自定义控件库]排序、筛选以及高亮

在WPF中实现数据排序的常规方法是使用CollectionViewSource。CollectionViewSource是一种数据集合的代理类,具有两个重要的属性:Source表示数据源的集合,而View则是经过处理后的数据视图。它们的关系类似于数据库中的表和视图。

以下是使用CollectionViewSource进行排序的代码示例:

private readonly CollectionViewSource _viewSource;
public HighlightSample()
{
    InitializeComponent();
    _viewSource = new CollectionViewSource
    {
        Source = Employee.AllExecutives
    };
    _viewSource.View.Culture = new System.Globalization.CultureInfo("zh-CN");
    _viewSource.View.SortDescriptions.Add(new SortDescription(nameof(Employee.FirstName), ListSortDirection.Ascending));
    EmployeeElement.ItemsSource = _viewSource.View;
}

这段代码设置了CollectionViewSource的Source属性,并将CollectionViewSource的View属性作为ListBox的数据源。SortDescriptions用于描述视图的排序方式。如果列表包含中文,记得将Culture设置为zh-CN。

接下来是筛选功能。CollectionViewSource的View属性类型为ICollectionView接口,它提供了Filter属性用于实现数据的过滤。以下是实现筛选功能的代码:

_viewSource.View.Filter = (obj) => (obj as Employee).DisplayName.ToLower().Contains(FilterElement.Text);
private void OnFilterTextChanged(object sender, TextChangedEventArgs e)
{
    if (_viewSource != null)
        _viewSource.View.Refresh();
}

这段代码在输入框文本改变时刷新视图。Refresh方法用于重新创建视图,实现视图的刷新。ICollectionView还提供了一个DeferRefresh函数,用于将更改合并到视图并延迟自动刷新,适用于多次操作大数据集合的情况。

最后是高亮功能。在WPF中,高亮可以通过自定义的TextBlockService.HighlightText附加属性实现。以下是实现高亮功能的XAML代码:

Windows-Android_SSH_Remote_Control
Windows-Android_SSH_Remote_Control

通过 SSH 隧道从 Android 设备在互联网上对 Windows PC 实现完整远程控制的设置与使用指南,适用于远程桌面访问、安全 RDP 等。

下载
<textbox textchanged="OnFilterTextChanged" x:name="FilterElement"></textbox>
<listbox grid.row="1" height="200" margin="0,8,0,0" name="EmployeeElement">
    <listbox.itemtemplate>
        <datatemplate>
            <stackpanel orientation="Horizontal">
                <textblock kino:textblockservice.highlighttext="{Binding ElementName=FilterElement,Path=Text}" text="{Binding DisplayName}"></textblock>
            </stackpanel>
        </datatemplate>
    </listbox.itemtemplate>
</listbox>

高亮功能的实现代码如下:

private static void MarkHighlight(TextBlock target, string highlightText)
{
    var text = target.Text;
    target.Inlines.Clear();
    if (string.IsNullOrWhiteSpace(text))
        return;
    if (string.IsNullOrWhiteSpace(highlightText))
    {
        target.Inlines.Add(new Run { Text = text });
        return;
    }
    while (text.Length > 0)
    {
        var runText = string.Empty;
        var index = text.IndexOf(highlightText, StringComparison.InvariantCultureIgnoreCase);
        if (index > 0)
        {
            runText = text.Substring(0, index);
            target.Inlines.Add(new Run { Text = runText, Foreground = _noHighlightBrush });
        }
        else if (index == 0)
        {
            runText = text.Substring(0, highlightText.Length);
            target.Inlines.Add(new Run { Text = runText });
        }
        else if (index == -1)
        {
            runText = text;
            target.Inlines.Add(new Run { Text = runText, Foreground = _noHighlightBrush });
        }
        text = text.Substring(runText.Length);
    }
}

虽然使用Regex.Split可以使代码更简洁,但这里未作修改。实际使用中,发现将未匹配的文字置灰效果更好,因此采用了这种实现方式。

本文介绍了使用CollectionViewSource实现排序和筛选功能,以及使用附加属性和Inlines实现高亮功能。不过,目前的高亮功能存在一个问题:无法定义高亮或低亮的颜色。一种解决方法是参考ToolTipService,定义多个附加属性:

<textbox textchanged="OnFilterTextChanged" tooltipservice.horizontaloffset="10" tooltipservice.tooltip="Filter Text" tooltipservice.verticaloffset="10" x:name="FilterElement"></textbox>

这种方法的缺点是会导致代码复杂且难以维护。另一种方法是创建一个ToolTip类作为附加属性的值:

<textbox textchanged="OnFilterTextChanged" x:name="FilterElement">
    <tooltipservice.tooltip>
        <tooltip content="Filter Text" horizontaloffset="10" verticaloffset="10"></tooltip>
    </tooltipservice.tooltip>
</textbox>

这种方法更易于维护,但可能有人不明白ToolTipService.ToolTip属性为何可以同时接受文本或ToolTip类型的值。关于这一点,我将在下一篇文章中详细解释,并重新实现高亮功能以支持样式等功能。

也可以参考SearchableTextBlock创建一个支持高亮的文本框,但我想通过这个有趣的功能介绍更多的知识。

参考资料:

  • CollectionViewSource Class (System.Windows.Data) Microsoft Docs
  • TextBlock.Inlines Property (System.Windows.Controls) Microsoft Docs
  • A WPF Searchable TextBlock Control with Highlighting WPF

源码:

  • TextBlockService.cs at master

热门AI工具

更多
Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

相关专题

更多
硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

3148

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

4889

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3789

2025.12.29

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

446

2026.01.19

class在c语言中的意思
class在c语言中的意思

在C语言中,"class" 是一个关键字,用于定义一个类。想了解更多class的相关内容,可以阅读本专题下面的文章。

3896

2024.01.03

python中class的含义
python中class的含义

本专题整合了python中class的相关内容,阅读专题下面的文章了解更多详细内容。

306

2025.12.06

windows查看端口占用情况
windows查看端口占用情况

Windows端口可以认为是计算机与外界通讯交流的出入口。逻辑意义上的端口一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。怎么查看windows端口占用情况呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

3239

2023.07.26

查看端口占用情况windows
查看端口占用情况windows

端口占用是指与端口关联的软件占用端口而使得其他应用程序无法使用这些端口,端口占用问题是计算机系统编程领域的一个常见问题,端口占用的根本原因可能是操作系统的一些错误,服务器也可能会出现端口占用问题。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2798

2023.07.27

OpenJDK JVM参数怎么调优
OpenJDK JVM参数怎么调优

Java应用运行缓慢,如何调整JVM参数?本专题介绍OpenJDK JVM性能调优的基本流程,涵盖性能指标确认、运行数据采集、内存配置和垃圾回收分析,帮助你先定位瓶颈,再通过对照测试验证效果,避免直接套用参数而影响应用稳定性。

60

2026.10.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn