AvalonEdit 에서 x,y,length의 단어 highlight

먼저 DocumentColorizingTransformer 를 상속받아 클래스를 하나 만든다.


해당 클래스의 인스턴스는 하나만 만들어 사용해야 함으로 싱글톤이나 static 참조변수로 하나 잡아준다.
그리고, 아래와 비슷한 클래스도 하나 만든다.

    public class Description
    {
        public int col { setget; }
        public int line { setget; }
        public int length { setget; }
    }
ColorizeLine 메소드를 아래와 비슷하게 override한다.
        protected override void ColorizeLine(ICSharpCode.AvalonEdit.Document.DocumentLine line)
        {
            if (desiredList == nullreturn;
                
            foreach (Description d in desiredList)
            {
                if (line.LineNumber == d.line)
                {
                    ChangeLinePart(line.Offset + d.col, line.Offset+d.col + d.length, ApplyChanges);
                }
            }
        }
그리고, highlight 부분을 udpate 해줄려면 
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            int x = int.Parse(txt1.Text);
            int y = int.Parse(txt2.Text);
 
            Description[] d = new Description[]{
                new Description(){col=x,line=y,length=2},
                new Description(){col=x+2,line=y+2,length=2}
            };
            lc.setList(d);
 
            textEditor.TextArea.TextView.LineTransformers.Remove(lc);
            textEditor.TextArea.TextView.LineTransformers.Add(lc);
        }
하면된다.

실제로 ColorizeLine 메소드는 해당 VisualLine의 요소만을 Rendering할수 있는듯하다. 산으로가는 프로젝트 마무리 단계라 코드분석할 시간도 없이 마구잡이로 적용중이다.
 그리고, desiredList 가 갱신된다고 해서 화면이 갱신되지는 않지만 LineTransformers 에서 제거한다음 추가하면 전체 내용이 갱신된다.(VisualLine을 다시 그려줌, 그때 내가 만든 Colorize 클래스가 호출됨)
ColorizeLine에서 current line 이외의 라인을 수정할려고하면 exception이 발생한다.

===============추가 =================
 TextView에 Redraw 메소드가 있다. remove했다가 add 할 필요없이 Redraw() 를 호출 해주면된다.

댓글

이 블로그의 인기 게시물

C#에서 포인터 사용

WPF RichTextBox 와 Document의 바인딩

WPF Template에 Grid 사용하기( UniformGrid, Grid, WrapPanel)