본문 바로가기

Dev::DotNet/WPF

TextBox 에 2바이트 문자 입력중 삭제시 Caret 문제

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 의 문제를 해결할 수 있다.