【问题标题】:Textbox key change on keydown in WPFWPF中keydown上的文本框键更改
【发布时间】:2013-07-22 22:30:54
【问题描述】:

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

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

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

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

【问题讨论】:

  • 您可能必须使用 WPF 中的 KeyDown 事件才能使该代码正常工作。

标签: c# wpf


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    比 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;
    }
    

    【讨论】:

    • 感谢您的解决方案。但是 e.Key 总是返回大写键,例如如果按下小 a,它将返回大写 A。不同于带有 winforms 的 e.KeyChar
    • 我明白了。我已经更新了我的示例以包括一些基本的大写/小写检查(AsciiToUrdu 现在得到一个char 而不是Key 枚举)。要处理更高级的场景,您可能需要执行一些 win32 互操作调用。请参阅此帖子以获取示例:how to capture the '#' character on different locale keyboards in WPF/C#?
    • 您的解决方案有效,但存在一个问题,因为乌尔都语书写方向是从右到左,但文本框插入符号仍是从左到右方向。为了解决这个问题,我将乌尔都语文本框放入 Grid 并将 Grid 的 FlowDirection 属性设置为 RightToLeft。现在它工作 100% 好。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-15
    • 1970-01-01
    • 2014-05-19
    相关资源
    最近更新 更多