在 RichTextBox_Click 事件中获取插入符位置
Get caret position in RichTextBox_Click event
我正在开发一个包含 RichTextBox
的文本编辑器。我要实现的功能之一是在 TextBox
中随时显示上述 RichTextBox
插入符号的当前行和列。
这是我使用的部分代码(其余代码与我的问题无关):
int selectionStart = richTextBox.SelectionStart;
int lineFromCharIndex = richTextBox.GetLineFromCharIndex(selectionStart);
int charIndexFromLine = richTextBox.GetFirstCharIndexFromLine(lineFromCharIndex);
currentLine = richTextBox.GetLineFromCharIndex(selectionStart) + 1;
currentCol = richTextBox.SelectionStart - charIndexFromLine + 1;
在这一点上,我应该提一下,当有人使用 RichTextBox
时,插入符号可以通过三种方式更改位置:
- 通过更改
RichTextBox
的 Text
- 使用键盘上的箭头键
- 通过单击
RichTextBox
上的任意位置
我上面发布的代码在前两种情况下没有问题。然而,它在第三种情况下并没有真正起作用。
我尝试使用 Click
事件,我注意到 selectionStart
变量的值始终为 0,这意味着我总是得到相同和错误的结果。此外,在 MouseClick
和 MouseUp
等其他事件上使用相同的代码并没有解决我的问题,因为即使在这些事件的持续时间内 selectionStart
也是 0。
那么,每次用户单击 RichTextBox
时,如何获取当前的行和列?
你想要这样的东西:
private void richTextBox1_MouseUp(object sender, MouseEventArgs e)
{
RichTextBox box = (RichTextBox)sender;
Point mouseLocation = new Point(e.X, e.Y);
box.SelectionStart = box.GetCharIndexFromPosition(mouseLocation);
box.SelectionLength = 0;
int selectionStart = richTextBox.SelectionStart;
int lineFromCharIndex = box.GetLineFromCharIndex(selectionStart);
int charIndexFromLine = box.GetFirstCharIndexFromLine(lineFromCharIndex);
currentLine = box.GetLineFromCharIndex(selectionStart) + 1;
currentCol = box.SelectionStart - charIndexFromLine + 1;
}
在我看来,您真正想要的是处理 TextBoxBase.SelectionChanged
事件。然后 任何 导致选择更改的操作将调用您的代码,作为一个额外的好处,当前选择将在您的事件处理程序被调用时更新,您将确保获得正确的值。
如果那不能解决您的特定需求,那么我一定没有理解这个问题。在这种情况下,请提供 a good, minimal, complete code example 清楚地显示您正在尝试做什么,并准确描述该代码的作用以及它与您想要它做的有何不同。
我正在开发一个包含 RichTextBox
的文本编辑器。我要实现的功能之一是在 TextBox
中随时显示上述 RichTextBox
插入符号的当前行和列。
这是我使用的部分代码(其余代码与我的问题无关):
int selectionStart = richTextBox.SelectionStart;
int lineFromCharIndex = richTextBox.GetLineFromCharIndex(selectionStart);
int charIndexFromLine = richTextBox.GetFirstCharIndexFromLine(lineFromCharIndex);
currentLine = richTextBox.GetLineFromCharIndex(selectionStart) + 1;
currentCol = richTextBox.SelectionStart - charIndexFromLine + 1;
在这一点上,我应该提一下,当有人使用 RichTextBox
时,插入符号可以通过三种方式更改位置:
- 通过更改
RichTextBox
的 - 使用键盘上的箭头键
- 通过单击
RichTextBox
上的任意位置
Text
我上面发布的代码在前两种情况下没有问题。然而,它在第三种情况下并没有真正起作用。
我尝试使用 Click
事件,我注意到 selectionStart
变量的值始终为 0,这意味着我总是得到相同和错误的结果。此外,在 MouseClick
和 MouseUp
等其他事件上使用相同的代码并没有解决我的问题,因为即使在这些事件的持续时间内 selectionStart
也是 0。
那么,每次用户单击 RichTextBox
时,如何获取当前的行和列?
你想要这样的东西:
private void richTextBox1_MouseUp(object sender, MouseEventArgs e)
{
RichTextBox box = (RichTextBox)sender;
Point mouseLocation = new Point(e.X, e.Y);
box.SelectionStart = box.GetCharIndexFromPosition(mouseLocation);
box.SelectionLength = 0;
int selectionStart = richTextBox.SelectionStart;
int lineFromCharIndex = box.GetLineFromCharIndex(selectionStart);
int charIndexFromLine = box.GetFirstCharIndexFromLine(lineFromCharIndex);
currentLine = box.GetLineFromCharIndex(selectionStart) + 1;
currentCol = box.SelectionStart - charIndexFromLine + 1;
}
在我看来,您真正想要的是处理 TextBoxBase.SelectionChanged
事件。然后 任何 导致选择更改的操作将调用您的代码,作为一个额外的好处,当前选择将在您的事件处理程序被调用时更新,您将确保获得正确的值。
如果那不能解决您的特定需求,那么我一定没有理解这个问题。在这种情况下,请提供 a good, minimal, complete code example 清楚地显示您正在尝试做什么,并准确描述该代码的作用以及它与您想要它做的有何不同。