我需要密切注意TextBox中的插入位置;这有什么事吗?我不想使用计时器(例如,如果位置改变,每隔10ms检查一次)。
我正在使用Windows窗体。
答案 0 :(得分:2)
本机Windows控件不会为此生成通知。试图解决这个限制是痛苦的一个方法,你只是无法分辨插入符号的位置。 SelectionStart属性是不是一个可靠的指标,插入符号可以出现在选择的任一端,具体取决于用户选择文本的方向。当控件具有焦点时,Pinvoking GetCaretPos()给出插入位置,但由于TextRenderer.MeasureText()中的不准确,将其映射回字符索引并不容易。
不要去那里。相反,解释为什么你认为你需要这个。
答案 1 :(得分:2)
希望这会有所帮助。我在Mouse Move
上做了这个private void txtTest_MouseMove(object sender, MouseEventArgs e)
{
string str = "Character{0} is at Position{1}";
Point pt = txtTest.PointToClient(Control.MousePosition);
MessageBox.Show(
string.Format(str
, txtTest.GetCharFromPosition(pt).ToString()
, txtTest.GetCharIndexFromPosition(pt).ToString())
);
}
答案 2 :(得分:0)
大多数文字控件都会有KeyDown
和KeyUp
个事件,您可以使用这些事件找出按下了哪个键。
我已链接到winforms TextBox
,因为您没有指定使用的是哪种技术。
然而,没有直接的方法来判断光标在字段中的位置。
答案 3 :(得分:0)
我不确定SelectionChanged事件是否在更改了插入符号位置时触发了evon,但您应该尝试一下。
如果不是,您可以创建计时器并检查SelectionStart属性值是否更改。
更新:创建一个引发SelectionChanged事件的TextBox类非常简单:
public class TextBoxEx : TextBox
{
#region SelectionChanged Event
public event EventHandler SelectionChanged;
private int lastSelectionStart;
private int lastSelectionLength;
private string lastSelectedText;
private void RaiseSelectionChanged()
{
if (this.SelectionStart != lastSelectionStart || this.SelectionLength != lastSelectionLength || this.SelectedText != lastSelectedText)
OnSelectionChanged();
lastSelectionStart = this.SelectionStart;
lastSelectionLength = this.SelectionLength;
lastSelectedText = this.SelectedText;
}
protected virtual void OnSelectionChanged()
{
var eh = SelectionChanged;
if (eh != null)
{
eh(this, EventArgs.Empty);
}
}
#endregion
protected override void OnKeyDown(KeyEventArgs e)
{
base.OnKeyDown(e);
RaiseSelectionChanged();
}
protected override void OnKeyUp(KeyEventArgs e)
{
base.OnKeyUp(e);
RaiseSelectionChanged();
}
protected override void OnMouseDown(MouseEventArgs e)
{
base.OnMouseDown(e);
RaiseSelectionChanged();
}
protected override void OnMouseUp(MouseEventArgs mevent)
{
base.OnMouseUp(mevent);
RaiseSelectionChanged();
}
}