Winforms组合框:插入符号移动时的事件

本文关键字:移动 事件 符号 插入 组合 Winforms | 更新日期: 2023-09-27 18:25:55

我正在使用WinForms ComboBox构建一种自动完成文本输入,我需要根据插入符号在字符串中的位置来更改自动完成行为。

然而,ComboBox似乎并没有公开事件来捕捉插入符号位置的变化。当用户输入时,我可以捕捉到TextUpdated。但当用户导航时,我需要处理KeyDown,并检查KeyCodeLeftRightHome还是End。但是,事件是在插入符号更改之前触发的,所以我需要计算新的插入符号位置。这非常令人讨厌,因为当按下Ctrl时,可能还有一些我不知道的特殊辅助功能设置时,这需要特殊处理。

所以我想知道是否有更好的方法。每次插入符号在ComboBox中的位置发生变化时,是否都会触发一个事件,或者在ComboBox处理KeyDown事件后,我是否可以执行代码?

Winforms组合框:插入符号移动时的事件

您可以在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触发一次的计时器,检查插入符号的位置是否改变。不过,这将是一个非常糟糕的解决方案。