1

我刚刚制作了一个简单的笔记应用程序,我多次注意到 Windows 窗体应用程序中的 TextBox 控件不支持Tab. 但是我注意到网站中的“TextBox”控件(其中大多数)确实如此,而且 WPF 应用程序中的 TextBox 控件也支持通过Tab.

如果您不确定我的意思,请键入几个以空格分隔的单词,然后按住该Ctrl键并点击该Backspace键。您会注意到,它不只是退格一个,而是一个完整的 Tab 空格。

为什么这种行为如此不一致?

是因为只有较新版本的文本输入控件支持这种行为吗?它与我的键盘设置有关吗?

问题:我应该如何最好地在我的 Windows 窗体应用程序中实现/强制使用 Back-Tab 空格TextBox Control,同时还尊重 Windows 的用户 Tab 间距设置(即,Tab 键在点击时将产生的空格数)?

注意:在不支持此功能的控件中,它们只是在当前插入符号位置放置一个看起来很奇怪的方形符号。我尝试将此符号粘贴到此 TextBox 中,但不会出现。

4

1 回答 1

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;
        }
于 2013-07-05T13:43:40.030 回答