代码之家  ›  专栏  ›  技术社区  ›  ymbcKxSw

如何在WPF RichTextBox中突出显示数字

  •  2
  • ymbcKxSw  · 技术社区  · 6 年前

    我正在努力回忆WPF中的所有数字 RichTextBox 颜色不同。我一直在跟踪 this tutorial ,但我发现文本中的字母几乎是随机突出显示的。这是我目前掌握的处理程序:

    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;
    }
    
    2 回复  |  直到 6 年前
        1
  •  0
  •   Lion King    6 年前

    试试这个

    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;
    
        2
  •  0
  •   ymbcKxSw    6 年前

    在对评论中链接的问题进行修改后,我完成了以下工作:(我已经给出了相关的代码隐藏)

    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;
    }