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 을 기준으로 좌표를 뽑은 것이기 때문이 스크린에 대한 좌표를 구하고 싶으면 컨트롤에 대한 좌표를 뽑아서 더하면 된다.)
'Dev::DotNet > WPF' 카테고리의 다른 글
DPI 비율 구하기 (0) | 2013.12.26 |
---|---|
xaml 에서 enum binding 하기 (0) | 2013.12.16 |
WPF 에서 Resize 시 멈춤 현상 (0) | 2013.12.05 |
NetAdvantage XamDockManager 의 Menu 비활성화 (0) | 2013.12.02 |
ComboBox 의 SelectedValue 와 SelectedItem 의 성능적 차이 (0) | 2013.11.29 |