如果只给你选择某个文本的索引和长度(或EndIndex),你如何在WPF版本的RichTextBox中执行此操作?
这在Textbox中是非常可行的,因为你可以调用Textbox.Select(startIndex,Length)但我在RTB中看不到任何等效的内容。
编辑:我找到了做出选择的答案
internal string Select(RichTextBox rtb, int index, int length)
{
TextRange textRange = new TextRange(rtb.Document.ContentStart, rtb.Document.ContentEnd);
if (textRange.Text.Length >= (index + length))
{
TextPointer start = textRange.Start.GetPositionAtOffset(index, LogicalDirection.Forward);
TextPointer end = textRange.Start.GetPositionAtOffset(index + length, LogicalDirection.Backward);
rtb.Selection.Select(start, end);
}
return rtb.Selection.Text;
}
但是,当我尝试在选择之后突出显示该行时:
rtb.Selection.ApplyPropertyValue(TextElement.BackgroundProperty, new SolidColorBrush(Colors.LightBlue));
突出显示功能仅在第一次尝试时起作用,在第二次尝试后中断。有人知道这个的原因吗?
答案 0 :(得分:5)
好的,这个问题已经过时但我终于找到了答案,所以我把它放在这里。
当我尝试使用RichTextBox创建一些Syntaxhighlighter时,我遇到了类似的问题。 我发现,当你用 ApplyPropertyValue 玩arround时,你不能再使用 GetPositionAtOffset 了。我认为,应用财产价值似乎会改变内部职位"文件中的TextTokens,因此制动'这个功能。
解决方法:
每当您需要使用 GetPositionAtOffset 时,首先在文档的完整TextRange上调用 ClearAllProperties ,然后使用 ApplyPropertyValue 重新应用所有属性,但此时从右到左。 (右边意味着最高的偏移量)
我不知道你是否已经应用任何PropertyValues期望选择突出显示,所以你可能需要更多的思考。
这是我的代码在导致问题时的外观:
private void _highlightTokens(FlowDocument document)
{
TextRange fullRange = new TextRange(document.ContentStart, document.ContentEnd);
foreach (Token token in _tokenizer.GetTokens(fullRange.Text))
{
TextPointer start = fullRange.Start.GetPositionAtOffset(token.Position);
TextPointer end = start.GetPositionAtOffset(token.Length);
TextRange range = new TextRange(start, end);
range.ApplyPropertyValue(TextElement.ForegroundProperty, _getTokenColor(token));
}
}
我修好了这个:
private void _highlightTokens(FlowDocument document)
{
TextRange fullRange = new TextRange(document.ContentStart, document.ContentEnd);
fullRange.ClearAllProperties(); // NOTICE: first remove allProperties.
foreach (Token token in _tokenizer.GetTokens(fullRange.Text).Reverse()) // NOTICE: Reverse() to make the "right to left" work
{
TextPointer start = fullRange.Start.GetPositionAtOffset(token.Position);
TextPointer end = start.GetPositionAtOffset(token.Length);
TextRange range = new TextRange(start, end);
range.ApplyPropertyValue(TextElement.ForegroundProperty, _getTokenColor(token));
}
}
答案 1 :(得分:-1)
使用Select()属性上的RichTextBox.Selection方法。
答案 2 :(得分:-1)
Blockquote你可以在空格之间得到文字......
私有字符串RichWordOver(RichTextBox rch,int x,int y) {
int pos = rch.GetCharIndexFromPosition(new Point(x, y));
if (pos <= 0) return "";
string txt = rch.Text;
int start_pos;
for (start_pos = pos; start_pos >= 0; start_pos--)
{
char ch = txt[start_pos];
if (!char.IsLetterOrDigit(ch) && !(ch=='_')) break;
}
start_pos++;
int end_pos;
for (end_pos = pos; end_pos < txt.Length; end_pos++)
{
char ch = txt[end_pos];
if (!char.IsLetterOrDigit(ch) && !(ch == '_')) break;
}
end_pos--;
if (start_pos > end_pos) return "";
return txt.Substring(start_pos, end_pos - start_pos + 1);
}
private void rchText_MouseClick(对象发送者,MouseEventArgs e) { MessageBox.Show(RichWordOver(rchText,e.X,e.Y)); }