我使用以下代码查找以“@”开头的每一行,并将其格式化为粗体:
foreach (var line in tweetText.Document.Blocks)
{
var text = new TextRange(line.ContentStart,
line.ContentEnd).Text;
line.FontWeight = text.StartsWith("@") ?
FontWeights.Bold : FontWeights.Normal;
}
但是,我想使用代码查找每个单词而不是以“@”开头的行,所以我可以格式化一个段落,如:
Blah blah blah blah @username blah blah blah blah blah @anotherusername
答案 0 :(得分:7)
这可能会使用一些优化,因为我快速做到了,但这应该让你开始
private void RichTextBox_TextChanged(object sender, TextChangedEventArgs e)
{
tweetText.TextChanged -= RichTextBox_TextChanged;
int pos = tweetText.CaretPosition.GetOffsetToPosition(tweetText.Document.ContentEnd);
foreach (Paragraph line in tweetText.Document.Blocks.ToList())
{
string text = new TextRange(line.ContentStart,line.ContentEnd).Text;
line.Inlines.Clear();
string[] wordSplit = text.Split(new char[] { ' ' });
int count = 1;
foreach (string word in wordSplit)
{
if (word.StartsWith("@"))
{
Run run = new Run(word);
run.FontWeight = FontWeights.Bold;
line.Inlines.Add(run);
}
else
{
line.Inlines.Add(word);
}
if (count++ != wordSplit.Length)
{
line.Inlines.Add(" ");
}
}
}
tweetText.CaretPosition = tweetText.Document.ContentEnd.GetPositionAtOffset(-pos);
tweetText.TextChanged += RichTextBox_TextChanged;
}
答案 1 :(得分:1)
我不知道您的具体要求,但我建议您不要使用RichtextBox进行语法高亮显示。 有一个很好的组件AvalonEdit可以很容易地用于此。您可以在本文中阅读有关AvalonEdit的更多信息:http://www.codeproject.com/Articles/42490/Using-AvalonEdit-WPF-Text-Editor
您的要求的语法定义:
<SyntaxDefinition name="customSyntax"
xmlns="http://icsharpcode.net/sharpdevelop/syntaxdefinition/2008">
<Color name="User" foreground="Blue" fontWeight="bold" />
<RuleSet>
<Span color="User" begin="@" end =" "/>
</RuleSet>
</SyntaxDefinition>
完整的演示项目可以在这里下载:http://oberaffig.ch/stackoverflow/avalonEdit.zip