当前位置: 首页 > news >正文

关于WPF中ComboBox文本查询功能

一种方法是使用事件(包括MVVM的绑定)

<ComboBox TextBoxBase.TextChanged="ComboBox_TextChanged" />

然而运行时就会发现,这个事件在疯狂的触发,很频繁

在实际应用中,如果关联查询数据库,网络吞吐什么的,就会卡顿

另一种方法是使用IsTextSearchEnabled属性,在文本框敲键盘会自动选择相关项

<ComboBox IsTextSearchEnabled="True" IsTextSearchCaseSensitive="False" TextSearch.TextPath="Name" />

然而又有新的问题,选择项不会显示到文本框(文本框仍然是键盘敲的内容,当然还可能跟Framework版本有关),于是我们需要更深入

试验数据含 3 个项

                    <ComboBox TextBoxBase.TextChanged="ComboBox_TextChanged"><ComboBoxItem>啊啊啊</ComboBoxItem><ComboBoxItem>哦哦哦</ComboBoxItem><ComboBoxItem>呃呃呃</ComboBoxItem></ComboBox>

试验一:绑定 TextChanged 和 SelectionChanged 调试

        private void Combobox_TextChanged(object sender, TextChangedEventArgs e){// e.OriginalSource == TextBox, e.Source == sender == Comboboxvar tb = e.OriginalSource as TextBox;var cb = e.Source as ComboBox;var cs = e.Changes.ToArray();int alen = -1, offs = -1, rlen = -1;if (cs.Length > 0) { alen = cs[0].AddedLength; offs = cs[0].Offset; rlen = cs[0].RemovedLength; }var str1 = TextSearch.GetText(cmbStudios);System.Diagnostics.Debug.Print($"TextBox.Text={tb.Text},ComboBox.Text={cb.Text},TextSearch.Text={str1},Action={e.UndoAction}, Changes={cs.Length}: [0]={{{alen},{offs},{rlen}}}\r\n");}private void Combobox_SelectionChanged(object sender, SelectionChangedEventArgs e){var cb = e.Source as ComboBox;System.Diagnostics.Debug.Print($"ComboBox.Text={cb.Text},SelectedItem={cb.SelectedItem}\r\n");}

记录

TextBox.Text=a,ComboBox.Text=,TextSearch.Text=,Action=Create, Changes=1: [0]={1,0,0}
TextBox.Text=啊,ComboBox.Text=啊,TextSearch.Text=,Action=Create, Changes=1: [0]={1,0,1}
TextBox.Text=啊,ComboBox.Text=啊,TextSearch.Text=,Action=None, Changes=0: [0]={-1,-1,-1}
TextBox.Text=啊,ComboBox.Text=啊,TextSearch.Text=,Action=Create, Changes=1: [0]={1,0,1}
ComboBox.Text=啊,SelectedItem=啊啊啊
TextBox.Text=啊啊啊,ComboBox.Text=啊啊啊,TextSearch.Text=,Action=Create, Changes=1: [0]={3,0,1}

也就是选择项目正常设置Text属性,但是现在我们要让Text改变自动选择项目

试验二:启用IsTextSearchEnabled属性

TextBox.Text=a,ComboBox.Text=,TextSearch.Text=,Action=Create, Changes=1: [0]={1,0,0}
ComboBox.Text=,SelectedItem=啊啊啊
TextBox.Text=啊,ComboBox.Text=啊啊啊,TextSearch.Text=,Action=Create, Changes=1: [0]={1,0,1}
TextBox.Text=啊,ComboBox.Text=啊,TextSearch.Text=,Action=None, Changes=0: [0]={-1,-1,-1}
TextBox.Text=啊,ComboBox.Text=啊,TextSearch.Text=,Action=Create, Changes=1: [0]={1,0,1}
TextBox.Text=啊,ComboBox.Text=啊,TextSearch.Text=,Action=Create, Changes=1: [0]={1,0,1}

敲a一次,空格变成“啊”自动选择“啊啊啊”项目,然后就开始抽,完全看不到适当的介入时机

用过Win10的都知道,文件夹右上角的搜索框,能在输入法完成后才开始搜索,所以一定是可以实现的

换网,查英文资料发现Win11中有TextCompositionEnded事件,但是WPF中找不到,类似的TextCompositionManager外挂

实验三:启用TextComposition事件

<TextBox TextCompositionManager.TextInputStart="TextBox_TextInputStart" TextCompositionManager.TextInputUpdate="TextBox_TextInputUpdate" TextCompositionManager.TextInput="TextBox_TextInput" />

事件响应代码

        private void TextBox_TextInputStart(object sender, TextCompositionEventArgs e){var tc = e.TextComposition;string text = $" CompositionText={tc.CompositionText},ControlText={tc.ControlText},ControlText={tc.SystemText},Text={tc.Text} ";System.Diagnostics.Debug.Print($"TextInputStart() ControlText={e.ControlText},SystemText={e.SystemText},Text={e.Text},TextComposition={{{text}}}\r\n");}private void TextBox_TextInputUpdate(object sender, TextCompositionEventArgs e){var tc = e.TextComposition;string text = $" CompositionText={tc.CompositionText},ControlText={tc.ControlText},ControlText={tc.SystemText},Text={tc.Text} ";System.Diagnostics.Debug.Print($"TextInputUpdate() ControlText={e.ControlText},SystemText={e.SystemText},Text={e.Text},TextComposition={{{text}}}\r\n");}private void TextBox_TextInput(object sender, TextCompositionEventArgs e){var tc = e.TextComposition;string text = $" CompositionText={tc.CompositionText},ControlText={tc.ControlText},ControlText={tc.SystemText},Text={tc.Text} ";System.Diagnostics.Debug.Print($"TextInput() ControlText={e.ControlText},SystemText={e.SystemText},Text={e.Text},TextComposition={{{text}}}\r\n");}

记录

TextInputStart() ControlText=,SystemText=,Text=,TextComposition={ CompositionText=,ControlText=,ControlText=,Text= }
TextInputUpdate() ControlText=,SystemText=,Text=,TextComposition={ CompositionText=a,ControlText=,ControlText=,Text= }
TextInputUpdate() ControlText=,SystemText=,Text=,TextComposition={ CompositionText=啊,ControlText=,ControlText=,Text= }

没有TextInput事件!

英文资料显示,会依次触发 TextCompositionStarted、TextChanging、TextChanged、TextCompositionChanged、TextCompositionEnded 事件

思考是隧道事件的问题:

如上面提到的外挂,WPF中的控件其实都外挂的,而且还可以自己给现有的类添加属性、方法和事件(参考:Binding Property)

由于可以任意的排布所有的控件,因此事件的响应与传统的MFC控件就开始有差异

如图,如果鼠标点在2上,传统的事件会由2响应,容器1对此一无所知

这有什么问题?有没有问题就看你怎么看问题。

所谓路由事件是把响应规则扩展为3类:

1.直接事件:等同传统事件

2.冒泡事件:从內向外依次触发,直到Handled被设置

3.隧道事件:从外向内依次触发,直到Handled被设置,这样容器就有机会在内部控件之前做出响应,事件一般以Preview开头,常见的如多个带滚动条的控件互相包含

试验四:加入Preview事件

PreviewTextInputStart() ControlText=,SystemText=,Text=,TextComposition={ CompositionText=,ControlText=,ControlText=,Text= }
TextInputStart() ControlText=,SystemText=,Text=,TextComposition={ CompositionText=,ControlText=,ControlText=,Text= }
PreviewTextInputUpdate() ControlText=,SystemText=,Text=,TextComposition={ CompositionText=a,ControlText=,ControlText=,Text= }
TextInputUpdate() ControlText=,SystemText=,Text=,TextComposition={ CompositionText=a,ControlText=,ControlText=,Text= }
PreviewTextInputUpdate() ControlText=,SystemText=,Text=,TextComposition={ CompositionText=啊,ControlText=,ControlText=,Text= }
TextInputUpdate() ControlText=,SystemText=,Text=,TextComposition={ CompositionText=啊,ControlText=,ControlText=,Text= }
PreviewTextInput() ControlText=,SystemText=,Text=啊,TextComposition={ CompositionText=,ControlText=,ControlText=,Text=啊 }

所有的都可以不管,只看PreviewTextInput检查Text属性就是输入法敲出完整的文本时

策略响应的也就简单了

1.加入一个Timer

2.在TextInput事件启动计时器,其它如Start和Update时停止计时器

3.计时器响应执行过滤逻辑,然后停止计时器

当然这是Windows文件搜索框的逻辑,也就是你敲键盘很快的话,中途不会执行搜索,你也可以根据需要进行调整,比如Start也开始计时器,如果Update过一段时间未触发,一样执行逻辑

相关文章:

关于WPF中ComboBox文本查询功能

一种方法是使用事件&#xff08;包括MVVM的绑定&#xff09; <ComboBox TextBoxBase.TextChanged"ComboBox_TextChanged" /> 然而运行时就会发现&#xff0c;这个事件在疯狂的触发&#xff0c;很频繁 在实际应用中&#xff0c;如果关联查询数据库&#xff0…...

07_游戏加载窗口

隐藏动态提示窗口 创建空节点 命名为 LoadingWnd 意为加载窗口 并设置全屏 在子级下创建Image作为加载背景 也设置成全屏 将以下资源放进Art文件夹中 设置好精灵模式后拖拽至 Image的Source Image框选 创建文本作为提示内容 增加描边组件OutLine可以美化字体 创建Image作为加载…...

awk命令进阶

1.连接文件 awk NRFNR{a[$1]$0;next} NR!FNR{ if(($5) in a) print a[$1],$0 } file1 file2 命令详解&#xff1a; 这个命令的目的是将 file1 和 file2 基于某个共同字段进行连接&#xff08;类似于 SQL 中的 JOIN 操作&#xff09;。下面我们逐步解析它的工作原理。 1. NRF…...

解锁Java中的国密算法:安全保障的密钥

一、引言 在数字化浪潮席卷全球的当下&#xff0c;信息安全已然成为国家、企业乃至个人无法忽视的重要议题。国密算法&#xff0c;作为我国自主研发的密码算法体系&#xff0c;宛如坚固的盾牌&#xff0c;为国家信息安全筑起了一道坚不可摧的防线。它的诞生&#xff0c;不仅承载…...

基于迁移学习的ResNet50模型实现石榴病害数据集多分类图片预测

完整源码项目包获取→点击文章末尾名片&#xff01; 番石榴病害数据集 背景描述 番石榴 &#xff08;Psidium guajava&#xff09; 是南亚的主要作物&#xff0c;尤其是在孟加拉国。它富含维生素 C 和纤维&#xff0c;支持区域经济和营养。不幸的是&#xff0c;番石榴生产受到降…...

在现有 Docker Desktop 环境下安装与配置独立 Kubernetes环境(Mac)

在现有 Docker Desktop 环境下安装与配置独立 Kubernetes 集群环境 目标 在已安装Docker Desktop自带Kubernetes的情况下&#xff0c;搭建一个独立 Kubernetes 集群环境。配置独立的 kubectl 工具&#xff0c;使其默认管理独立的 Kubernetes 集群。保留 Docker Desktop 的 Ku…...

Linux探秘坊-------3.开发工具详解(1)

1 初识vim编辑器 创建第一个vim编辑的代码 1.新建文件 2.使用vim打开 3.打开默认是命令模式&#xff0c;写代码需要在屏幕上输出“i”字符 1.写完代码后要按Esc键退出到指令模式2.再按shift:wq即可保存并退出vim &#xff08;因为不支持鼠标&#xff0c;通常 使用键盘上的箭…...

Spring Boot整合Thymeleaf、JDBC Template与MyBatis配置详解

本文将详细介绍如何在Spring Boot项目中整合Thymeleaf模板引擎、JDBC Template和MyBatis&#xff0c;涵盖YAML配置、依赖版本匹配、项目结构设计及代码示例。 一、版本兼容性说明 Spring Boot版本与Java版本对应关系 Spring Boot 2.x&#xff1a;支持Java 8、11&#xff08;推…...

白玉微瑕:闲谈 SwiftUI 过渡(Transition)动画的“口是心非”(下)

概述 秃头小码农们都知道&#xff0c;SwiftUI 不仅仅是一个静态 UI 构建框架那么简单&#xff0c;辅以海量默认或自定义的动画和过渡&#xff08;Transition&#xff09;特效&#xff0c;我们可以将 App 界面的绚丽升华到极致。 不过&#xff0c;目前 SwiftUI 中的过渡&#x…...

论文:深度可分离神经网络存内计算处理芯片

引言&#xff1a;SRAM - CIM芯片在处理深度可分离神经网络时面临的挑战 深度可分离卷积&#xff08;Depthwise separable convolution, DSC&#xff09;由逐深度卷积&#xff08;DW&#xff09;和逐点卷积&#xff08;PW)组成&#xff0c;逐深度卷积用于提取空间特征&#xff…...

hdrnet,Deep Bilateral Learning for Real-Time Image Enhancement解读

论文、代码和ppt地址&#xff1a;Deep Bilateral Learning for Real-Time Image Enhancement 论文使用的数据集&#xff1a; HDR: 这是一个复杂的摄影管道&#xff0c;包括色彩校正、自动曝光、去雾和色调映射等操作。 MIT “FiveK” 数据集: 这个数据集由 Bychkovsky 等人 提…...

Android系统开发(十五):从 60Hz 到 120Hz,多刷新率进化简史

引言 欢迎来到“帧率探索实验室”&#xff01;今天&#xff0c;我们要聊聊 Android 11 中对多种刷新率设备的支持。你可能会问&#xff1a;“这和我写代码有什么关系&#xff1f;”别急&#xff0c;高刷新率不仅仅让屏幕更顺滑&#xff0c;还会直接影响用户体验。想象一下&…...

js判断一个数组对象中是否有相同的值

let userTitleLevelList[{title:医生,code:20},{title:老师,code:21}]; 如果一个数组对象格式如上面。如果有一样的对象就提示。即&#xff1a;title和code都是一样的内容、 const hasDuplicate userTitleLevelList.some((item, index, array) > { return array.filter(…...

基于深度学习的视觉检测小项目(十五) 用户的登录界面

用户管理离不开的是消息框&#xff08;QMessageBox&#xff09;和对话框&#xff08;QDialog&#xff09;&#xff0c;比如对话框用于用户名和密码输入&#xff0c;消息框用于提示登录成功、密码错误。 • 基础知识&#xff1a;PySide6&#xff08;PyQT5&#xff09;的常用对话…...

redis-排查命中率降低问题

1.命中率降低带来的问题 高并发系统&#xff0c;当命中率低于平常的的运行情况&#xff0c;或者低于70%时&#xff0c;会产生2个影响。 有大量的请求需要查DB&#xff0c;加大DB的压力&#xff1b;影响redis自身的性能 不同的业务场景&#xff0c;阈值不一样&#xff0c;一般…...

ui文件转py程序的工具

源博客连接&#xff1a; PyCharm中利用外部工具uic转成的py文件&#xff0c;里面全是C代码&#xff0c;并非python类型的代码&#xff0c;导致大量报错。。。_pyside6-uic为什么把ui转为了c-CSDN博客 如果想把ui文件转为py文件&#xff0c;首先设置pycharm的外部工具&#xf…...

Alluxio 联手 Solidigm 推出针对 AI 工作负载的高级缓存解决方案

作者&#xff1a;Wayne Gao, Yi Wang, Jie Chen, Sarika Mehta Alluxio 作为全球领先的 AI 缓存解决方案供应商&#xff0c; 提供针对 GPU 驱动 AI 负载的高速缓存。其可扩展架构支持数万个节点&#xff0c;能显著降低存储带宽的消耗。Alluxio 在解决 AI 存储挑战方面的前沿技…...

Oracle 数据库常见字段类型大全及详细解析

在工作期间会遇到数据库建表的业务&#xff0c;经常会使用复制粘帖等操作&#xff0c;而不清楚数据库的字段类型。本文记录了 Oracle 数据库常见字段类型&#xff0c;根据不同的数据需求&#xff0c;可以选择不同的字段类型来存储数据。 文章目录 一、字符类型&#xff08;Char…...

U3D的.Net学习

Mono&#xff1a;这是 Unity 最初采用的方式&#xff0c;它将 C# 代码编译为中间语言 (IL)&#xff0c;然后在目标平台上使用虚拟机 (VM) 将其转换为本地机器码执行。 IL2CPP&#xff1a;这是一种较新的方法&#xff0c;它会将 C# 代码先编译为 C 代码&#xff0c;再由 C 编译器…...

Tomcat下载配置

目录 Win下载安装 Mac下载安装配置 Win 下载 直接从官网下载https://tomcat.apache.org/download-10.cgi 在圈住的位置点击下载自己想要的版本 根据自己电脑下载64位或32位zip版本 安装 Tomcat是绿色版,直接解压到自己想放的位置即可 Mac 下载 官网 https://tomcat.ap…...

北京交通大学 | 基于TD3算法的层叠超表面辅助多用户MISO系统联合优化研究

引言随着无线通信技术的不断发展&#xff0c;可重构智能表面&#xff08;RIS&#xff09;技术因其低功耗和信号操控能力而受到广泛关注。然而&#xff0c;RIS的单层结构和离散相移能力限制了其性能表现。层叠智能超表面&#xff08;SIM&#xff09;作为一项创新技术&#xff0c…...

**发散创新:服务端渲染(SSR)的深度实践与性能优化实战**在现代前端架构

发散创新&#xff1a;服务端渲染&#xff08;SSR&#xff09;的深度实践与性能优化实战 在现代前端架构中&#xff0c;服务端渲染&#xff08;Server-Side Rendering, SSR&#xff09; 已不再是“可选特性”&#xff0c;而是提升首屏加载速度、SEO友好度和用户体验的核心手段之…...

航美实木板:以匠心守健康,用实力赢信赖——一位经销商的真情告白

“一张好的板材&#xff0c;守护的不是一个人&#xff0c;而是一个家庭的健康与幸福。”说这句话的汪总&#xff0c;是实木行业的“老炮儿”&#xff0c;深耕实木定制多年的他&#xff0c;对木材“热胀冷缩必变形开裂”的特性深信不疑。直到刷到航美实木板的宣传视频&#xff0…...

【MATLAB自编程求解二维质量守恒方程+动量守恒NS方程算例】 理论上通过代码极难求解NS方程 1

【MATLAB自编程求解二维质量守恒方程&#xff0b;动量守恒NS方程算例】理论上通过代码极难求解NS方程1.编写了求解NS方程的计算方法2.可通过求解NS方程计算x和y方向的速度场&#xff0c;以及二维整体的压力场3.可自行设置二维几何参数&#xff0c;进口速度等边界条件二维NS方程…...

thinkphp8官方文档

以下是ThinkPHP 8官方文档的核心内容和相关资源整理&#xff1a;官方文档入口ThinkPHP 8的官方文档可通过其官网访问&#xff0c;文档地址为&#xff1a;https://www.thinkphp.cn/doc主要文档内容ThinkPHP 8文档包含完整的框架使用指南&#xff0c;涵盖安装、配置、路由、控制器…...

Netty-learning-example IoT服务器开发:手撕MQTT协议实现高性能物联网平台

Netty-learning-example IoT服务器开发&#xff1a;手撕MQTT协议实现高性能物联网平台 【免费下载链接】netty-learning-example :egg: Netty实践学习案例&#xff0c;见微知著&#xff01;带着你的心&#xff0c;跟着教程。我相信你行欧。 项目地址: https://gitcode.com/gh…...

Spring Data测试终极指南:Testcontainers集成测试与Mock数据策略详解

Spring Data测试终极指南&#xff1a;Testcontainers集成测试与Mock数据策略详解 【免费下载链接】spring-data-examples Spring Data Example Projects 项目地址: https://gitcode.com/gh_mirrors/sp/spring-data-examples Spring Data测试是确保数据访问层可靠性的关键…...

综合布线入门技术培训ppt

综合布线是弱电项目中最基础的系统&#xff0c;也是最重要的系统之一。不少施工过程不是很楚&#xff0c;主要集中在两个问题&#xff1a;1、综合布线项目如何做&#xff1f;2、有哪些流程&#xff1f;本期我们通过一个培训ppt来详细总结下。来源&#xff1a;弱电行业网...

LocalVocal:本地化语音识别的隐私保护方案 - 从部署到优化的全流程指南

LocalVocal&#xff1a;本地化语音识别的隐私保护方案 - 从部署到优化的全流程指南 【免费下载链接】obs-localvocal OBS plugin for local speech recognition and captioning using AI 项目地址: https://gitcode.com/gh_mirrors/ob/obs-localvocal 在数字化沟通日益频…...

Matplotlib核心知识全解析:从基础绘图到高级定制

一、Matplotlib简介与核心概念Matplotlib是Python最经典的数据可视化库&#xff0c;提供类似MATLAB的绘图接口&#xff0c;支持生成出版级质量的图表。其核心模块pyplot通过状态机模式管理图形&#xff0c;基础绘图流程遵循“创建画布→绘制图形→展示/保存”的逻辑。import ma…...