如何在 TextBox 中附加一个不间断的 space?

How to append a non-breaking space in a TextBox?

我有一个 WinForms 项目,我在其中将波斯语文本输入到 TextBox 控件中。我在 HMTL 页面中看到过这种用法。但是我在这里需要的是我想设置一个键盘快捷键,这样当按下快捷键时,TextBox 会在文本中附加一个不间断的 space ,用户可以继续输入其余部分。这个元素对于波斯语等某些语言非常重要,如下所示:

普通文本:

کتابخانههاو ال带

不间断 Space :

کتابخانه‌هاو الکترونیکی

如何在 WinForms 中使用它?

您可以处理 KeyPress 事件,例如,如果用户按下 Ctrl+Space,将 space 替换为 \u200B 字符:

using System.Windows.Forms;
public class ExTextBox : TextBox
{
    protected override void OnKeyPress(KeyPressEventArgs e)
    {
        if(e.KeyChar==' ' && ModifierKeys== Keys.Control)
            e.KeyChar='\u200B';
        base.OnKeyPress(e);
    }
}

您可以捕获 KeyPress 事件并在插入点插入您想要的字符,如下所示:

private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
    if (e.KeyChar == (char)Keys.Space &&
        ModifierKeys == Keys.Control)
    {
        char nbrsp = '\u2007';                 // non-breaking space
        char zerospace = '\u200B';            // zero space
        char zerospacenobinding = '\u200C';  //zero space no character binding
        char zerospacebinding = '\u200D';   // zero space with character binding

        int s = textBox1.SelectionStart;
        textBox1.Text = textBox1.Text.Insert(s, nbrsp.ToString() );
        e.Handled = true;
        textBox1.SelectionStart = s + 1;
    }
}

请注意,虽然 Word 使用 I Ctl-Shift-Space,但此组合也可以在 Right-To-LeftLeft-To-Right 之间切换。所以让我们使用 Ctrl-Space 代替。

另请注意,虽然 KeyDown 确实有一个 e.Handled 参数,但将其设置为 true 不会抑制输入的字符。所以我们需要使用KeyPress事件..