WPF中按下键时的文本框键更改
本文关键字:文本 WPF | 更新日期: 2023-09-27 18:24:14
我想在KeyDown的Textbox中显示乌尔都语字符,而不是英语字符,例如,如果键入"b",那么乌尔都语单词"ب"应该出现在Textbox上。
我在WinForm应用程序中这样做,就像下面的代码一样,它运行得很好,将英文键字符发送到函数,该函数返回其乌尔都语等价字符,并显示在Textbox中,而不是英文字符。
private void RTBUrdu_KeyPress(object sender, KeyPressEventArgs e)
{
e.KeyChar = AsciiToUrdu(e.KeyChar); //Write Urdu
}
我在WPF中找不到与上述代码等效的代码。
如果您可以确保该语言在用户的系统中注册为输入语言,那么您实际上可以使用InputLanguageManager完全自动地执行此操作。通过设置文本框上的附加属性,您可以在选择文本框时有效地更改键盘输入语言,并在取消选择时重置它。
比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;
}