2013-07-05 2 views
1

방금 ​​메모 작성 응용 프로그램을 만들었으며 Windows Forms 응용 프로그램의 TextBox 컨트롤이 Tab으로 백 스페이스를 지원하지 않는다는 것을 많이 눈치 챘습니다. 그러나 나는 웹 사이트의 "TextBox"컨트롤 (물론 그 대부분)과 WPF 응용 프로그램의 TextBox 컨트롤도 Tab으로 백 스페이스를 지원한다는 사실을 알고 있습니다.TextBox 컨트롤 간의 일관성없는 동작입니까?

당신은 내가이 무슨 뜻인지 잘 모르는 경우, 다음, 공백으로 구분 된 몇 단어를 입력 Ctrl 키 키를 누른 상태에서 백 스페이스 키를 누릅니다. 하나씩 뒤로가 아니라 전체 탭 공간을 통해 알 수 있습니다.

왜이 동작이 일관성이 없습니까?

최신 버전의 텍스트 입력 컨트롤 만이 동작을 지원하기 때문입니까? 키보드 설정과 관련이 있습니까?

질문 :도 (Windows 용 Tab 키 것 공간, 즉 수를 사용자의 탭 간격 설정을 존중하면서 내가 가장 내 Windows에서 돌아 탭 공간을 강제로/구현하는 방법은 응용 프로그램의 TextBoxControl 양식 때 도청 생산)?

참고 :이 기능을 지원하지 않는 컨트롤에서는 현재 캐럿 위치에 이상한 모양의 사각형 기호가 표시됩니다. 이 TextBox에이 기호를 붙여 넣으려고했지만 표시되지 않습니다.

+0

나는 탭 간격과 관련이 전혀 없습니다. 나는 한 번에 한 단어 씩 그것의 삭제라고 생각한다. – AlSki

+0

내 뇌가 분명히 지체되어 있습니다. 나는 그 생각을하지 못했다고 나는 믿을 수 없다 : - 글쎄, 나의 질문은 여전히 ​​남아있다. 불일치를 어떻게 다룰 것인가? 3이나 4로 백 스페이스를 알고 있지만 사람들은 시스템의 Tab 키에 대해 다른 설정을 가지고 있으므로 설정을 존중하고 싶지만 어떻게해야할지 모릅니다. –

답변

1

글쎄, 이것을 시도해 볼 수 있습니다.

private bool _keyPressHandled; 

    private void textBox1_KeyDown(object sender, KeyEventArgs e) 
    { 
     _keyPressHandled = false; 

     if (e.Control && e.KeyCode == Keys.Back) 
     { 
      // since this isn't called very often I'll write it as clearly as possible 

      var leftPart = // Get the section to the left of the cursor 
       textBox1.Text.Take(textBox1.SelectionStart) 
        // Turn it around 
        .Reverse() 
        // ignore whitespace 
        .SkipWhile(x => string.IsNullOrWhiteSpace(x.ToString())) 
        // remove one word 
        .SkipWhile(x => !string.IsNullOrWhiteSpace(x.ToString())) 
        // Turn it around again 
        .Reverse()       
        .ToArray(); 
      var rightPart = // what was after the cursor 
        textBox1.Text.Skip(textBox1.SelectionStart + textBox1.SelectionLength); 

      textBox1.Text = new string(leftPart.Concat(rightPart).ToArray()); 
      textBox1.SelectionStart = leftPart.Count(); 
      textBox1.SelectionLength = 0; 

      // Going to ignore the keypress in a second 
      _keyPressHandled = true; 
     } 
    } 

    private void textBox1_KeyPress(object sender, KeyPressEventArgs e) 
    { 
     // See http://msdn.microsoft.com/en-us/library/system.windows.forms.control.keydown.aspx 
     if (_keyPressHandled) 
     { 
      //Prevent an additional char being added 
      e.Handled = true; 
     } 
관련 문제