Winforms组合框:插入符号移动时的事件
本文关键字:移动 事件 符号 插入 组合 Winforms | 更新日期: 2023-09-27 18:25:55
我正在使用WinForms ComboBox
构建一种自动完成文本输入,我需要根据插入符号在字符串中的位置来更改自动完成行为。
然而,ComboBox
似乎并没有公开事件来捕捉插入符号位置的变化。当用户输入时,我可以捕捉到TextUpdated
。但当用户导航时,我需要处理KeyDown
,并检查KeyCode
是Left
、Right
、Home
还是End
。但是,事件是在插入符号更改之前触发的,所以我需要计算新的插入符号位置。这非常令人讨厌,因为当按下Ctrl时,可能还有一些我不知道的特殊辅助功能设置时,这需要特殊处理。
所以我想知道是否有更好的方法。每次插入符号在ComboBox
中的位置发生变化时,是否都会触发一个事件,或者在ComboBox
处理KeyDown
事件后,我是否可以执行代码?
您可以在KeyDown处理后立即执行代码:
private void comboBox1_KeyDown(object sender, KeyEventArgs e)
{
BeginInvoke(new MethodInvoker(_CheckCaretPosition));
}
void _CheckCaretPosition()
{
int caretPosition = comboBox1.SelectionStart;
Debug.WriteLine(caretPosition);
}
@ogggre的答案只是解决方案的一半。插入符号也可能被鼠标移动,所以鼠标事件需要相同的事件处理程序,并且通过编程,在大多数情况下,除了更改文本属性之外,事件无法跟踪插入符号,所以要尽可能接近跟踪插入符号的位置,您需要这些事件:
private void comboBox1_KeyDown(object sender, KeyEventArgs e)
{
CheckCaretPosition();
}
private void comboBox1_MouseDown(object sender, MouseEventArgs e)
{
CheckCaretPosition();
}
private void comboBox1_MouseMove(object sender, MouseEventArgs e)
{
if((Control.MouseButtons | MouseButtons.Left) != 0)
CheckCaretPosition();
}
private void comboBox1_MouseDoubleClick(object sender, MouseEventArgs e)
{
CheckCaretPosition();
}
private void comboBox1_TextChanged(object sender, EventArgs e)
{
CheckCaretPosition();
}
void CheckCaretPosition()
{
int caretPosition = comboBox1.SelectionStart;
Debug.WriteLine(caretPosition);
}
或者,如果你真的需要在任何情况下跟踪组合框中的插入符号,你可以使用每隔50-100ms触发一次的计时器,检查插入符号的位置是否改变。不过,这将是一个非常糟糕的解决方案。