繁体   English   中英

WPF中的按键按下时文本框按键更改

[英]Textbox key change on keydown in WPF

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

我正在像下面的代码一样在WinForm应用程序中正常运行,将英语键char发送到函数,该函数返回其等效于Urdu的char,并在Textbox中显示,而不是English char。

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

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

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

比WinForms方法KeyInterop.VirtualKeyFromKey() ,但这应该可以工作(使用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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM