You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WPF自定义搜索框无法过滤ListBox最上方ListBoxItem问题求助

问题根源
  • 原有逻辑在遍历ListBox条目过程中,触发完全匹配后调用HideAllNonMatch隐藏了其他条目,但遍历操作仍会继续执行,后续同首字母的条目会命中首字母匹配规则,重新将Visibility设为Visible,最终只有遍历顺序中最后一个完全匹配的条目能保留显示状态,靠前的匹配条目会被后续逻辑覆盖。
  • 逻辑执行顺序不合理:完全匹配的判断被嵌套在首字母匹配逻辑内,且和遍历动作耦合,导致状态被反复修改。
修复方案

XAML代码无需修改,保持原有实现即可,只需调整后端C#逻辑如下:

public partial class MainWindow : Window
{
    private List<Rectangle> items = new List<Rectangle>();

    public MainWindow()
    {
        InitializeComponent();
    }

    private void searchBox_TextChanged(object sender, TextChangedEventArgs e)
    {
        string searchText = searchBox.Text.Trim();
        // 搜索框为空时直接显示所有条目
        if (string.IsNullOrEmpty(searchText))
        {
            foreach (var item in listBox.Items)
            {
                ((ListBoxItem)item).Visibility = Visibility.Visible;
            }
            return;
        }

        // 先检查是否存在完全匹配的条目
        ListBoxItem exactMatch = null;
        foreach (var item in listBox.Items)
        {
            ListBoxItem listBoxItem = (ListBoxItem)item;
            if (listBoxItem.Name.Equals(searchText, StringComparison.OrdinalIgnoreCase))
            {
                exactMatch = listBoxItem;
                break;
            }
        }

        // 存在完全匹配则仅显示该条目
        if (exactMatch != null)
        {
            foreach (var item in listBox.Items)
            {
                ListBoxItem listBoxItem = (ListBoxItem)item;
                listBoxItem.Visibility = listBoxItem == exactMatch ? Visibility.Visible : Visibility.Collapsed;
            }
            return;
        }

        // 无完全匹配时按首字母匹配过滤
        char firstChar = searchText[0];
        foreach (var item in listBox.Items)
        {
            ListBoxItem listBoxItem = (ListBoxItem)item;
            listBoxItem.Visibility = listBoxItem.Name.StartsWith(firstChar.ToString(), StringComparison.OrdinalIgnoreCase) 
                ? Visibility.Visible 
                : Visibility.Collapsed;
        }
    }
}

调整说明

  • 拆分了逻辑执行顺序:先处理空搜索场景,再判断是否有完全匹配,最后处理首字母匹配场景,避免状态被反复覆盖
  • 去掉了耦合在遍历中的HideAllNonMatch调用,每个逻辑分支独立处理所有条目的显隐状态,逻辑更清晰
  • 增加了大小写不敏感的匹配规则,适配更多输入场景

内容的提问来源于stack exchange,提问作者user16052640

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 07:06:02