c# - 聚焦时如何自动打开组合框?
问题描述
我有一个包含几个组合框的表单。
我希望它们中的一个 ComboBox 在获得焦点时打开元素列表,无论是从键盘还是鼠标。
DroppedDown
ComboBox 类的属性管理元素列表的可见性。
最适合我需要的事件是Enter
,所以我写的代码是:
private void comboBox1_Enter(object sender, EventArgs e)
{
this.comboBox1.DroppedDown = true;
}
它可以工作,但是当直接单击位于没有焦点的组合框右侧的图标时,元素列表打开,打开后突然消失。
我尝试了很多方法来解决这种奇怪的行为,检查Focused
属性或使用其他事件,如DropDown
or MouseClick
,但没有得到任何可接受的结果。
解决方案
一种简单的方法(不会强制您覆盖ComboBox
派生的 Control's WndProc
)是模拟HitTest,测试MouseDown是否发生在ComboBox
按钮区域;然后,DroppedDown = true;
仅在没有设置的情况下设置。
因此,当鼠标单击按钮时,您不会导致双重效果,以意想不到的方式移动焦点(对于控件)。
private void comboBox1_Enter(object sender, EventArgs e)
{
ComboBox combo = sender as ComboBox;
if (!combo.DroppedDown)
{
if (combo.PointToClient(Cursor.Position).X <
combo.ClientRectangle.Width - SystemInformation.VerticalScrollBarWidth)
{
combo.DroppedDown = true;
Cursor = Cursors.Arrow;
}
}
}
推荐阅读
- react-native - 为什么我无法在本机反应中读取状态?
- python - 按下按钮时在 TkInter 中添加按钮
- ios - 在ios swift中使用alamofire 5从multipartformdata上传带有参数的文件
- objective-c - NSScrubber 平移动画结束通知
- javascript - 如何增加所见即所得编辑器的高度?
- java - 从文件中读取文本并将其与一系列字符进行比较
- python - 无限期运行python脚本
- multithreading - Weblogic阻塞线程导致应用程序无响应
- html - column-count 属性在 safari 和 firefox 中无法正常工作
- node.js - Mongoose 多对多关系