오늘은 채팅 프로그램을 작성하던 중 TextBox때문에 어처구니 없이 고생을 했던 경험을 바탕으로 간단하게 Text박스의 enter처리와 채팅에서 사용하기 용이하게 Key Event를 발생시켰던 것을 잠시 기록하려 합니다.


어려운 내용은 절대 아니고 내용도 강의노트처럼 수업내용이 아니라 길지 않을 예정입니다.


먼저 MSDN  : https://msdn.microsoft.com/ko-kr/library/ms752054(v=vs.110).aspx

 위와 같이 c# cs(c# code)파일을 작성을 했지만 계속 enter를 입력하면 개행(다음줄로 바꿈)만 되고 바로 입력이 되거나 enter라는 키가 입력되었다는 것이 keyDown 이벤트 함수에서 잡히지가 않았습니다. 하지만 이것은 제가 TextBox에 여러줄을 입력하기 위해서  AcceptsReturn="True"라고 text box의 속성값을 변경했기 때문인데요, 저 값이 true이면 enter를 입력받는 동시에 다음줄로 바꾸어 줍니다. 따라서 이 키의 입력이 들어와 보이지 않습니다. 

 해결하는 방법은 제가 한 것이 최선은 아닐 수 있지만 가장 간단하게 처리를 하기로 했습니다. 우선,  AcceptsReturn="True"를 xaml코드에서 지웁니다. 아니면 false로 속성값을 변경해줘도 됩니다. 기본값이 false인데 이는 enter키 입력으로 개행을 하지 않게 됩니다.



그러면 이제 이벤트 함수에서 enter키가 입력되는 것을 확인할 수 있는데요, 그럴 경우에는 이제 몇몇 경우로 나눠 봤습니다.


 처음 채팅 방식은 알트키와 enter를 누르는 경우에 채팅이 전송이 되고 그냥 enter키를 누르는 경우에는 개행이 되도록 하였지만, 대표적인 메신져 앱 카카오톡에서는 enter키로 전송을 shift키를 누른 상태로 enter를 누르면 줄바꿈을 합니다. 이것이 훨씬 자연스럽다고 생각을 해서 수정을 하는데 쉽게 되지는 않았습니다.


 그래서 우선 상태키가 눌려있는지 확인을 하고, 그 경우 enter키를 누르면 전송을 하도록 처리를 하였습니다.

아래의 경우는 shift키가 눌려있지 않고 enter키를 누르면 전송을 하도록 하는 코드입니다.

 if (e.Key == Key.Return && !Keyboard.IsKeyDown(Key.LeftShift))

{

sendMessageToServer(tb_message.Text);

}

반면, shift키를 누른경우에는 enter키가 다르게 동작을 하도록 하기 위해 수동으로  개행문자를 추가 해 줬습니다.

if (Keyboard.IsKeyDown(Key.LeftShift))

{

tb_message.AppendText("\n");

tb_message.ScrollToEnd();

tb_message.Focus();

}                

            

줄바꿈을 많이 해 줄이 길어지면 스크롤을 내리고 커서를 이동시키려고 했는데 맘처럼 쉽게 되지않아 다른 방법을 시도 해 보았습니다.

AcceptsReturn="True" 를 이용하는 것인데요


key 눌릴때와 key땔때를 이용해 왼쪽 시프트키가 눌리면 , AcceptsReturn="True" 아니면 AcceptsReturn="false" 로 설정을 해 주었습니다.


그리고 전송 시 Text에 입력한 내용이 없으면 전송하지 않기 위해 내용이 있는지까지 한번 확인을 해서 아래와 같이 작성을 하였습니다.


위와 같이 코드를 작성하니 원하는 데로 동작을 잘 했습니다. 왼쪽 alt키를 같이 처리하고 싶었지만 system키로 인식을 해서 더이상 처리를 할 수가 없었습니다. 이상으로 text box와 enter키에 대한 이벤트 처리에 대한 삽질을 마치겠습니다.

+ Recent posts