0

我想在 KeyDown 的文本框中显示乌尔都语字符而不是英文字符,例如,如果键入“b”,那么乌尔都语单词“ب”应该出现在文本框中。

我在 WinForm 应用程序中执行此操作,如下面的代码运行良好,将英文键字符发送到返回其乌尔都语等效字符并在文本框中显示而不是英文字符的函数。

private void RTBUrdu_KeyPress(object sender, KeyPressEventArgs e)
{
e.KeyChar = AsciiToUrdu(e.KeyChar); //Write Urdu
}

我在 WPF 中找不到上述代码的等效项。

4

2 回答 2

2

如果您可以确保该语言在用户系统中注册为输入语言,您实际上可以使用InputLanguageManager完全自动完成此操作。通过在文本框上设置附加属性,您可以在文本框被选中时有效地更改键盘输入语言,在文本框被取消选中时将其重置。

于 2013-07-26T02:39:10.000 回答
1

比 WinForms 方法略丑,但这应该有效(使用KeyDown事件和KeyInterop.VirtualKeyFromKey()转换器):

private void TextBox_KeyDown(object sender, KeyEventArgs e)
{
    var ch = (char)KeyInterop.VirtualKeyFromKey(e.Key);
    if (!char.IsLetter(ch)) { return; }

    bool upper = false;
    if (Keyboard.IsKeyToggled(Key.Capital) || Keyboard.IsKeyToggled(Key.CapsLock))
    {
        upper = !upper;
    }
    if (Keyboard.IsKeyDown(Key.LeftShift) || Keyboard.IsKeyDown(Key.RightShift))
    {
        upper = !upper;
    }
    if (!upper)
    {
        ch = char.ToLower(ch);
    }

    var box = (sender as TextBox);
    var text = box.Text;
    var caret = box.CaretIndex;

    //string urdu = AsciiToUrdu(e.Key);
    string urdu = AsciiToUrdu(ch);

    //Update the TextBox' text..
    box.Text = text.Insert(caret, urdu);
    //..move the caret accordingly..
    box.CaretIndex = caret + urdu.Length;
    //..and make sure the keystroke isn't handled again by the TextBox itself:
    e.Handled = true;
}
于 2013-07-22T23:29:35.193 回答