C# 为什么组合框在设置DroppedDown时隐藏光标?
让我们创建WinForms应用程序(我在WindowsVista上运行VisualStudio2008,但从Win98到Vista,在本机或托管代码上,所描述的情况几乎无处不在) 编写这样的代码:C# 为什么组合框在设置DroppedDown时隐藏光标?,c#,winforms,combobox,C#,Winforms,Combobox,让我们创建WinForms应用程序(我在WindowsVista上运行VisualStudio2008,但从Win98到Vista,在本机或托管代码上,所描述的情况几乎无处不在) 编写这样的代码: using System; using System.Drawing; using System.Windows.Forms; namespace WindowsFormsApplication1 { public class Form1 : Form { priva
using System;
using System.Drawing;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
public class Form1 : Form
{
private readonly Button button1 = new Button();
private readonly ComboBox comboBox1 = new ComboBox();
private readonly TextBox textBox1 = new TextBox();
public Form1() {
SuspendLayout();
textBox1.Location = new Point(21, 51);
button1.Location = new Point(146, 49);
button1.Text = "button1";
button1.Click += button1_Click;
comboBox1.Items.AddRange(new[] {"1", "2", "3", "4", "5", "6"});
comboBox1.Location = new Point(21, 93);
AcceptButton = button1;
Controls.AddRange(new Control[] {textBox1, comboBox1, button1});
Text = "Form1";
ResumeLayout(false);
PerformLayout();
}
private void button1_Click(object sender, EventArgs e) {
comboBox1.DroppedDown = true;
}
}
}
然后,运行应用程序。将鼠标光标放在窗体上,不再触摸鼠标。开始在文本框中键入内容-光标将因此而隐藏。当您按Enter键时,事件抛出,组合框将被下拉。但现在光标不会出现,即使你移动它!并且仅当您单击某个位置时才显示
我找到了关于这个问题的讨论。但是没有好的解决办法
有什么想法吗?:) 首先,这是一组非常模糊的情况,我无法想象这是一个有用的界面操作 这似乎是一个bug,它导致编程下拉菜单在文本框中开始编辑,文本框构成下拉控件的一部分,从而有效地双重隐藏光标。要打破它 我怀疑每个隐藏都存储光标的状态,并在退出时将其恢复 文本框已存储并隐藏了实际光标状态 下拉列表将存储隐藏状态,并将光标设置为隐藏。移动光标时,它可能会将其还原,但会将其还原为已保存的隐藏状态,因此光标仍处于隐藏状态
单击表单似乎会强制重新设置该情况,不确定原因,但这是我的2便士价值。事实上,我能够通过以下方式解决此问题:
#region Dirty methods :)
#pragma warning disable 169
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern void mouse_event(long dwFlags, long dx, long dy, long cButtons, long dwExtraInfo);
private const int MOUSEEVENTF_ABSOLUTE = 0x8000;
private const int MOUSEEVENTF_MOVE = 0x1;
private const int MOUSEEVENTF_LEFTDOWN = 0x02;
private const int MOUSEEVENTF_LEFTUP = 0x04;
private const int MOUSEEVENTF_RIGHTDOWN = 0x08;
private const int MOUSEEVENTF_RIGHTUP = 0x10;
#pragma warning restore 169
#endregion
private void button1_Click(object sender, EventArgs e) {
Point oldCursorPos = Cursor.Position; // save pos
Point a = comboBox1.Parent.PointToScreen(comboBox1.Location);
a.X += comboBox1.Width - 3;
a.Y += comboBox1.Height - 3;
Cursor.Position = a;
// simuate click on drop down button
mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
Cursor.Position = oldCursorPos; // restore pos
}
但这不是我想要的解决方案:(
这是一个拐杖,但不是一个解决方案。我能够像这样解决这个问题:
comboBox1.DroppedDown = true;
Cursor.Current = Cursors.Default;
这是一组奇怪的情况,其中组合框是
DropDownList
类型,您可以在代码中调用组合框上的DroppedDown
方法,不管它是否有焦点
光标将消失,就像在窗体后面一样。如果单击窗体,光标将返回,但组合框将关闭,因此不是一个好结果
我可以确认此代码在不关闭组合框列表的情况下修复了问题
cbo_VisitorTypes.DroppedDown = true;
Cursor.Current = Cursors.Default;
我在一个Delphi应用程序中遇到了这个问题。正如我建议的那样,我只是在任何下拉事件之后添加了
SendMessage(ComboBox1.Handle,WM_SETCURSOR,0,0)
,然后它就工作了。是的,我的想法是类似的。但我如何解决这种情况呢?我有一个商业应用程序,其中的文本框中填充了搜索字符串,按钮是“搜索”组合框中充满了搜索结果。所描述的场景是绝对真实的-用户现在正遭受这种情况的折磨!:)我现在尝试模拟鼠标单击下箭头按钮,而不是设置DropedDown,但对我来说这似乎不是一个好的解决方案:(如果搜索填充了组合框,那么使用组合框中的按键事件逐步搜索并填充下拉列表中的大量AJAXified web搜索框如何?即,取消文本框和按钮,并提供更无缝的输出,您可以将搜索返回列表限制为50个项目,以避免下拉列表中出现1000个值或仅显示sear当您有3个或更多字符时,可以使用ch。有很多方法可以改善用户体验。否则,列表框可能是更好的解决方案?这在.NET 4.7.2中仍然是一个问题。此解决方案仍然可以在.NET 4.7.2中恢复光标