【问题标题】:Highlight all occurrences of selected word in AvalonEdit在 AvalonEdit 中突出显示所有出现的选定单词
【发布时间】:2012-03-02 16:19:05
【问题描述】:

我需要在 AvalonEdit 中突出显示所有出现的选定单词。我创建了一个 HihglinghtingRule 类的实例:

 var rule = new HighlightingRule()
   {
       Regex = regex, //some regex for finding occurences
       Color = new HighlightingColor {Background = new SimpleHighlightingBrush(Colors.Red)}
   };

之后我该怎么办? 谢谢。

【问题讨论】:

    标签: c# wpf highlighting textedit avalonedit


    【解决方案1】:

    要使用 HighlightingRule,您必须创建另一个突出显示引擎实例(HighlightingColorizer 等)

    写一个DocumentColorizingTransformer来突出你的词更容易和更有效:

    public class ColorizeAvalonEdit : DocumentColorizingTransformer
    {
        protected override void ColorizeLine(DocumentLine line)
        {
            int lineStartOffset = line.Offset;
            string text = CurrentContext.Document.GetText(line);
            int start = 0;
            int index;
            while ((index = text.IndexOf("AvalonEdit", start)) >= 0) {
                base.ChangeLinePart(
                    lineStartOffset + index, // startOffset
                    lineStartOffset + index + 10, // endOffset
                    (VisualLineElement element) => {
                        // This lambda gets called once for every VisualLineElement
                        // between the specified offsets.
                        Typeface tf = element.TextRunProperties.Typeface;
                        // Replace the typeface with a modified version of
                        // the same typeface
                        element.TextRunProperties.SetTypeface(new Typeface(
                            tf.FontFamily,
                            FontStyles.Italic,
                            FontWeights.Bold,
                            tf.Stretch
                        ));
                    });
                start = index + 1; // search for next occurrence
            }
        }
    }
    

    【讨论】:

    • 我不明白这是如何回答这个问题的。用户想要一种行为,如果匹配,所有单词都会在文本中突出显示。类似于视觉工作室的东西。
    【解决方案2】:

    我们必须决定是否有选择:

    TextEditor.TextArea.SelectionChanged += (sender, args) =>
    {
      if (string.IsNullOrWhiteSpace(TextEditor.SelectedText))
      {
        foreach (var markSameWord in TextEditor.TextArea.TextView.LineTransformers.OfType<MarkSameWord>().ToList())
        {
          TextEditor.TextArea.TextView.LineTransformers.Remove(markSameWord);
        }
      }
      else
      {
        TextEditor.TextArea.TextView.LineTransformers.Add(new MarkSameWord(TextEditor.SelectedText));
      }
    };
    

    这里是DocumentColorizingTransformer 类:

    public class MarkSameWord : DocumentColorizingTransformer
    {
      private readonly string _selectedText;
    
      public MarkSameWord(string selectedText)
      {
        _selectedText = selectedText;
      }
    
      protected override void ColorizeLine(DocumentLine line)
      {
        if (string.IsNullOrEmpty(_selectedText))
        {
          return;
        }
    
        int lineStartOffset = line.Offset;
        string text = CurrentContext.Document.GetText(line);
        int start = 0;
        int index;
    
        while ((index = text.IndexOf(_selectedText, start, StringComparison.Ordinal)) >= 0)
        {
          ChangeLinePart(
            lineStartOffset + index, // startOffset
            lineStartOffset + index + _selectedText.Length, // endOffset
            element => element.TextRunProperties.SetBackgroundBrush(Brushes.LightSkyBlue));
          start = index + 1; // search for next occurrence
        }
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2013-08-17
      • 1970-01-01
      • 2014-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-08
      • 2015-06-10
      • 2011-10-16
      相关资源
      最近更新 更多