WPF 의 TextBox에서 2바이트 문자 (double-byte character) 입력시, 이런저런 문제가 발생한다.
(Winform TextBox에서는 발생하지 않는 문제이기 때문에 WPF TextBox 의 문제라는 생각함)
엔터를 쳐서 새로운 라인을 삽입하고 바로 2바이트 문자를 입력하다가 Backspace로 삭제를 하면
TextBox 의 Caret 이 윗줄 맨 뒤에서 깜빡이고 있다는 것이다.
더 웃긴 건 거기서 다시 입력을 하면 다시 원래 위치인 아래 줄에서 입력이 시작된다.
만약 엔터를 친다면 현재 Caret 이 위치한 라인의 아래 아래 줄로 내려가 버린다.
또한 2바이트 문자인 한글, 일본어에 따라서도 Caret 이 잘못 움직이는 것도 서로 다르게 움직인다.
문제를 해결하기 위해서는 우선
1 2 | textbox.PreviewTextInput += this.OnPreviewTextInput; TextCompositionManager.AddPreviewTextInputUpdateHandler(textbox, this.OnPreviewTextInputUpdate); | cs |
PreviewTextInput 과 PreviewTextInputUpdate 이벤트가 필요하며
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | private bool IsImeDel = false; private void OnPreviewTextInput(object sender, TextCompositionEventArgs e) { if (this.IsImeDel) { this.IsImeDel = false; e.Handled = true; } } private void OnPreviewTextInputUpdate(object sender, TextCompositionEventArgs e) { if (e != null && e.TextComposition != null && string.IsNullOrEmpty(e.TextComposition.CompositionText)) { this.IsImeDel = true; } } | cs |
PreviewTextInputUpdate 이벤트에서는 2바이트 문제를 입력하다가 완전히 삭제되는 시점에 flag 를 설정하고
PreviewTextInput 이벤트에서는 Update 이벤트 이후에 발생하는 삭제시점의 PreviewTextInput 를 Handled 처리 해버리면 이상하게 움직이던 Caret 의 문제를 해결할 수 있다.
'Dev::DotNet > WPF' 카테고리의 다른 글
BitmapSource 이미지 일부 잘라내기 (0) | 2018.10.26 |
---|---|
DependencyPropertyDescriptor 사용시 주의사항 - Memory leak (0) | 2017.12.09 |
WebBrowser Control Zoom 조절 (0) | 2017.05.17 |
Window 를 특정 Thread 에서 위임하는 법 (0) | 2016.12.28 |
WPF 에서 Image 파일 로드시 속도 / 메모리 관련 소소한 Tip (0) | 2016.12.22 |