[C#] Infragistics UltraTextEditor 한글 잘림 현상

Infragistics 라는 소프트웨어라이브러리가 있습니다.
웹,윈폼,WPF 등을 모두 지원하며, 강력한(글쎄…) 그리드 기능이 있어 업무용 프로그램 용도로 사용할 만한(글쎄…) 라이브러리 입니다.

회사에서 이 제품을 사용하는데. 최근 문제가 좀 발견되었습니다.
(.NET Framework 4.0 용 12.2.20122.2123 버전)
문제는, 에디트박스에서 한글을 입력하다가 마우스 클릭 등으로 다른 곳으로 포커스를 옮길 경우, 마지막 입력된 한글 한 글자가 사라지는 현상입니다. 이 내용은 우리 회사로서는 최근 보고 되었지만(그 만큼 유저 수가 적다는 건가), 좀 검색을 해 보니, Infragistics 커뮤니티에 해당 문제 제기를 한 분이 있었습니다.
https://www.infragistics.com/community/forums/f/ultimate-ui-for-windows-forms/105014/ultratexteditor-bug-happens-in-windows-10
재차, 검색을 해 보니, 네이버 블로그에도 나오는데, 아마도 이 분이 저 질문을 올린 듯 하고, 어찌어찌 해결책을 찾아 제시해 주기도 하셨습니다.(대단… 저는 찾아보기만 할 뿐, 영어로 질문을 작성하진….)
http://tank51882.blog.me/220687584745

AlwaysInEditMode 를 true 로 세팅하면 해결이 된다는 답변이 있으나, 이렇게 될 경우, NullText(웹 input의 placeholder에 해당)도 사용할 수 없으며, 여러가지 제약이 있지 않을까 싶어 좀 더 근본적인 해결책이 필요하다 생각이 들었고, 후킹(?)까지도 해서 어떻게든 처리를 해야 하지 않을까 생각하게 되었죠. 사실, 이 문제는 테스트 해 본 결과, Windows 7, Windows 8 까지는 발생하지 않습니다. Windows 8.1, Windows 10 에서만 발생하는 현상 입니다.

정확히 어떤 내용인지는 상기 블로그에 들어가서 영상을 한 번 보시길.(또는 검색을 통해 이 글을 읽고 있다면, 그건, 문제를 알고 들어오신 거겠고요.)

착안은 그렇습니다.
우선, 인프라지스틱스의 모든 에디터는 Embedded 된 에디트 컨트롤이 따로 있으며, 이 객체는 키 입력 등으로 에디트를 시작할 때에만 접근이 가능하고(생성되고), 에디트가 종료되면 다시 null 로 바뀝니다.
그래서, 여러가지 이벤트핸들러를 통해 어느 시점에 제대로 된 한글이 보이는 지 체크했고, 그 와중에 KeyUp 이벤트를 잡아 낼 수 있었습니다.
일단은 간단하게, KeyUp 이벤트에서 어느 정도까지 제대로 입력되었다는 가정 하에, CurrentEditText 프로퍼티에 제대로 된 전체 글자들이 담겨 있음을 보고, 이 값을 잠시 저장해 두었다가, 에디트 종료 시점에 값(Value)과 비교, 치환해 주는 꼼수 코딩인 겁니다.

아직 테스트 해 보진 않았지만, 차 후 우리 시스템에도 적용할 지 여부를 다각도로 테스트 해 보려 합니다.
예제는 그냥 멤버 컨트롤에 이벤트를 붙였지만, 실 적용할 경우 상속받은 사용자 컨트롤 단에서 작업을 하면 전체 적용도 어렵진 않을 듯 합니다. 단지, 이로 인한 다른 문제가 발생하지 않을까 좀 두렵네요.

private void Init()
{
 this.myUltraText.AfterEnterEditMode -= new EventHandler(MyText_AfterEnterEditMode);
 this.myUltraText.AfterEnterEditMode += new EventHandler(MyText_AfterEnterEditMode);
}

private void MyText_AfterEnterEditMode(object sender, EventArgs e)
{
 try
 {
  UltraTextEditor ute = sender as UltraTextEditor;
  if (ute != null && ute.Editor != null)
  {
   ute.Editor.KeyUp -= new KeyEventHandler(Editor_KeyUp);
   ute.Editor.KeyUp += new KeyEventHandler(Editor_KeyUp);

   ute.Editor.BeforeExitEditMode -= new Infragistics.Win.BeforeExitEditModeEventHandler(Editor_BeforeExitEditMode);
   ute.Editor.BeforeExitEditMode += new Infragistics.Win.BeforeExitEditModeEventHandler(Editor_BeforeExitEditMode);
  }
 }
 catch
 {
 }
}

private string sValue1 = string.Empty;
private string sValue2 = string.Empty;
private void Editor_KeyUp(object sender, KeyEventArgs e)
{
 EmbeddableEditorBase x = sender as EmbeddableEditorBase;

 if (x != null)
 {
  sValue1 = string.Format("{0}", x.Value);
  sValue2 = x.CurrentEditText;
 }
}

private void Editor_BeforeExitEditMode(object sender, Infragistics.Win.BeforeExitEditModeEventArgs e)
{
 EmbeddableEditorBase x = sender as EmbeddableEditorBase;

 if (x != null && sValue1 != sValue2)
 {
  x.Value = sValue2;
 }
}

 

덧붙여,
Infragistics 너무 짜증 나요. 사실, 그리드에서도 키 입력과 동시에 에디트가 가능하도록 별도의 코딩을 한 적이 있습니다.(영문으로는 기본적으로 가능하나, 이 때에도 한글로는 먹지 않아서요.)

원문 – http://boring-text.blogspot.com/2018/01/infragisticsUltraTextEditorkoreantrim.html

Post Author: 김 키티

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다