본문 바로가기

Dev::DotNet/WPF

WPF TextBox Caret 의 좌표 가져오기

WPF 의 TextBox 를 이용해서 

현재 입력하고 있는 문자열에 자동완성 비스무리한 기능을 넣으려고 하다 보니 

현재 Caret (현재 커서가 간 위치) 위치에 삽입할 수 있는 문자열을 표시할 팝업 창을 보여줘야 했다.


그러다 보니 그 팝업 창을 보여주기 위해서 Caret 의 좌표가 필요했다.


public Point GetCaretPos(TextBox textBox)
{
    int tRowIdx = textBox.GetLineIndexFromCharacterIndex(textBox.CaretIndex);
    int tLineFir = textBox.GetCharacterIndexFromLineIndex(tRowIdx);
    int tColIdx = textBox.CaretIndex - tLineFir;

    FormattedText formattedText = new FormattedText(
        textBox.Text.Substring(tLineFir, textBox.CaretIndex - tLineFir),
        System.Globalization.CultureInfo.CurrentCulture,
        FlowDirection.LeftToRight,
        new Typeface(textBox.FontFamily.ToString()),
        textBox.FontSize,
        textBox.Foreground
    );

    return new Point(formattedText.Width, (tRowIdx + 1) * formattedText.Height);
}


다행히 TextBox 컨트롤에 문자열에 대한 각종 인덱스를 가져오는 기능은 이미 있었다.

그래서 현재 Caret 이 몇 번째 라인에 위치하는지 그 라인에서 몇 번째 문자열인지를 찾아서 

그 라인의 문자열에 대한 사이즈를 계산하여 위치를 계산해봤다. 


무식해서 더 쉽게 할 수 있는 방법은 아직은 잘 몰라서 이대로 쓰기로 했다.ㅎ


(참고로 해당 TextBox 을 기준으로 좌표를 뽑은 것이기 때문이 스크린에 대한 좌표를 구하고 싶으면 컨트롤에 대한 좌표를 뽑아서 더하면 된다.)