Я пытаюсь перекрасить все числа в WPF RichTextBox по-другому. Я слежу за этот учебник, но обнаружил, что буквы в тексте выделяются почти случайным образом. Это обработчик, который у меня есть на данный момент:
private void DescriptionText_TextChanged(object sender, TextChangedEventArgs e)
{
var range = new TextRange(DescriptionText.Document.ContentStart, DescriptionText.Document.ContentEnd);
var regex = new Regex("[0-9]+");
var num_ranges = new List<TextRange>();
// add all the ranges with numbers
foreach (Match match in num_reg.Matches(range.Text))
{
var start = range.Start.GetPositionAtOffset(match.Index);
var end = range.Start.GetPositionAtOffset(match.Index + match.Length);
num_ranges.Add(new TextRange(start, end));
}
// unsuscribe before making changes
DescriptionText.TextChanged -= this.DescriptionText_TextChanged;
range.ClearAllProperties();
range.ApplyPropertyValue(TextElement.ForegroundProperty, new SolidColorBrush(Colors.Black));
foreach (var r in num_ranges)
{
r.ApplyPropertyValue(TextElement.ForegroundProperty, new SolidColorBrush(Colors.Red));
}
DescriptionText.TextChanged += this.DescriptionText_TextChanged;
}





Попробуй это
DescriptionText.TextChanged -= this.DescriptionText_TextChanged;
var regExp = new Regex(@"^-*[0-9,\.]+$");
foreach (Match match in regExp.Matches(rtb.Text))
{
var textRange = rtb.Selection;
textRange.Select(match.Index, match.Length);
textRange.ApplyPropertyValue(TextElement.ForegroundProperty, new SolidColorBrush(Colors.Red));
//rtb.SelectionColor = Color.Red;
}
DescriptionText.TextChanged += this.DescriptionText_TextChanged;
Ваш ответ работает для Windows Forms RichTextBox, но API не позволяет мне выбирать таким образом для WPF RichTextBox
После внесения изменений в вопросы, указанные в комментариях, я получил следующие результаты: (Я дал соответствующий код)
public class Tag
{
public TextPointer StartPosition;
public TextPointer EndPosition;
}
private void DescriptionText_TextChanged(object sender, TextChangedEventArgs e)
{
string text;
DescriptionText.TextChanged -= this.DescriptionText_TextChanged;
var range = new TextRange(DescriptionText.Document.ContentStart, DescriptionText.Document.ContentEnd);
range.ClearAllProperties();
var tags = new List<Tag>();
TextPointer navigator = DescriptionText.Document.ContentStart;
while (navigator.CompareTo(DescriptionText.Document.ContentEnd) < 0)
{
TextPointerContext context = navigator.GetPointerContext(LogicalDirection.Backward);
if (context == TextPointerContext.ElementStart && navigator.Parent is Run)
{
text = ((Run)navigator.Parent).Text;
if (text != "")
tags.AddRange(CheckWordsInRun(text, (Run)navigator.Parent));
}
navigator = navigator.GetNextContextPosition(LogicalDirection.Forward);
}
foreach (Tag tag in tags)
{
var r = new TextRange(tag.StartPosition, tag.EndPosition);
r.ApplyPropertyValue(TextElement.ForegroundProperty, new SolidColorBrush(Colors.Red));
}
DescriptionText.TextChanged += this.DescriptionText_TextChanged;
}
private List<Tag> CheckWordsInRun(string text, Run theRun)
{
List<Tag> m_tags = new List<Tag>();
for (int i = 0; i < text.Length; i++)
{
if (Char.IsNumber(text[i]))
{
Tag t = new Tag();
t.StartPosition = theRun.ContentStart.GetPositionAtOffset(i, LogicalDirection.Forward);
t.EndPosition = theRun.ContentStart.GetPositionAtOffset(i + 1, LogicalDirection.Backward);
m_tags.Add(t);
}
}
return m_tags;
}
У меня была аналогичная проблема, и мне потребовалось много проб и ошибок, чтобы понять, что происходит. Когда вы выделяете таким образом, появляется своего рода «невидимый» тег цвета, который вставляется (я не уверен, что это технический термин, прошу прощения). Я бы предложил следующий ответ: stackoverflow.com/a/18149516/6538434