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

雪夜
发布: 2025-09-24 08:12:31
原创
833人浏览过

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

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

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

在WPF中实现数据排序的常规方法是使用CollectionViewSourceCollectionViewSource是一种数据集合的代理类,具有两个重要的属性: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;
}
登录后复制

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

接下来是筛选功能。CollectionViewSourceView属性类型为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代码:

<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>
登录后复制

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

简篇AI排版
简篇AI排版

AI排版工具,上传图文素材,秒出专业效果!

简篇AI排版 554
查看详情 简篇AI排版
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

以上就是[WPF自定义控件库]排序、筛选以及高亮的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号