方法获取word游标是,在WPF RichTextBox控件中 [英] Way to obtain the word cursor is on, in WPF RichTextBox Control
问题描述
我想知道如何在WPF RichTextBox中获得当前光标所在的单词。我知道RichTextBox有选择属性。但是,这只会给我在RichTextBox中突出显示的文本。相反,我想知道光标所在的单词,即使整个单词没有突出显示。
任何提示都会被感谢。
I would like to know how I can get the word that current cursor is on, in WPF RichTextBox. I am aware that RichTextBox has Selection Property. However, this only gives me the text that is highlighted in the RichTextBox. Instead I would like to know the word the cursor is on even if the whole word is not highlighted.
Any tips are appreciated.
Thank you very much.
推荐答案
将此函数附加到任意RichTextBox,现在称为testRTB, for result:
Attach this function to an arbitrary RichTextBox, now called testRTB, and see Output window for results:
private void testRTB_MouseUp(object sender, MouseButtonEventArgs e)
{
TextPointer start = testRTB.CaretPosition; // this is the variable we will advance to the left until a non-letter character is found
TextPointer end = testRTB.CaretPosition; // this is the variable we will advance to the right until a non-letter character is found
String stringBeforeCaret = start.GetTextInRun(LogicalDirection.Backward); // extract the text in the current run from the caret to the left
String stringAfterCaret = start.GetTextInRun(LogicalDirection.Forward); // extract the text in the current run from the caret to the left
Int32 countToMoveLeft = 0; // we record how many positions we move to the left until a non-letter character is found
Int32 countToMoveRight = 0; // we record how many positions we move to the right until a non-letter character is found
for (Int32 i = stringBeforeCaret.Length - 1; i >= 0; --i)
{
// if the character at the location CaretPosition-LeftOffset is a letter, we move more to the left
if (Char.IsLetter(stringBeforeCaret[i]))
++countToMoveLeft;
else break; // otherwise we have found the beginning of the word
}
for (Int32 i = 0; i < stringAfterCaret.Length; ++i)
{
// if the character at the location CaretPosition+RightOffset is a letter, we move more to the right
if (Char.IsLetter(stringAfterCaret[i]))
++countToMoveRight;
else break; // otherwise we have found the end of the word
}
start = start.GetPositionAtOffset(-countToMoveLeft); // modify the start pointer by the offset we have calculated
end = end.GetPositionAtOffset(countToMoveRight); // modify the end pointer by the offset we have calculated
// extract the text between those two pointers
TextRange r = new TextRange(start, end);
String text = r.Text;
// check the result
System.Diagnostics.Debug.WriteLine("[" + text + "]");
}
将Char.IsLetter(...)更改为Char.IsLetterOrDigit 。)或任何其他适当的,取决于您是否希望保持数字。
Change Char.IsLetter(...) to Char.IsLetterOrDigit(...) or whatever else appropriately depending on whether you wish to keep digits as well.
提示:将此解压到一个单独的程序集中的扩展方法,以便在需要时访问它。
Tip: extract this into an extension method in a separate assembly to access it whenever needed.
这篇关于方法获取word游标是,在WPF RichTextBox控件中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!