【问题标题】:Custom TextBox Control that Switches Keyboard Language Automatically c# WPF自动切换键盘语言的自定义文本框控件 c# WPF
【发布时间】:2023-04-07 04:06:01
【问题描述】:

我需要做类似的东西 http://www.codeproject.com/Articles/301832/Custom-Text-box-Control-that-Switch-keyboard-langu 但对于 WPF 和 C#

我试图用一个简单的 if 语句来做到这一点,但我不得不放另一个这样的文本框

    private void textBox2_TextChanged(object sender, TextChangedEventArgs e)
    {
        textBox1.Focus();
        if (textBox1.Text == "Q" || textBox1.Text == "q")
        {
            textBox2.Text = textBox2.Text+ "ض";
            textBox1.Text = "";
        }
        else if (textBox1.Text == "W" || textBox1.Text == "w")
        {
            textBox2.Text = textBox2.Text + "ص";
            textBox1.Text = "";
        }
        // and so ..
    }

它有效,但我想做类似上面链接的事情

【问题讨论】:

  • 该链接不是为您提供了源代码以及对正在发生的事情及其工作原理的解释吗?似乎最好的方法是研究您链接到的完整解决方案,在适当的地方进行编辑,并在遇到特定问题时提出问题。

标签: c# wpf textbox char ascii


【解决方案1】:

您可以在 WPF 中通过创建一个继承 TextBox 的新自定义控件来做到这一点。在那创建一个新的 TextLanguage 属性并覆盖 OnKeyDown 方法

namespace WpfApplication
{
    public enum TextLanguage
    {
        English,
        Arabic
    }

    public class CustomTextBox : TextBox
    {        
        public TextLanguage TextLanguage { get; set; }

        protected override void OnKeyDown(KeyEventArgs e)
        {
            if (TextLanguage != WpfApplication.TextLanguage.English)
            {
                e.Handled = true;
                if (Keyboard.Modifiers == ModifierKeys.Shift)
                {
                    // Shift key is down
                    switch (e.Key)
                    {
                        case Key.Q:
                            AddChars("ص");
                            break;
                        // Handle Other Cases too
                        default:
                            e.Handled = false;
                            break;
                    }
                }
                else if (Keyboard.Modifiers == ModifierKeys.None)
                {
                    switch (e.Key)
                    {
                        case Key.Q:
                            AddChars("ض");
                            break;
                        // Handle Other Cases too
                        default:
                            e.Handled = false;
                            break;
                    }
                }
            }
            base.OnKeyDown(e);
        }

        void AddChars(string str)
        {
            if (SelectedText.Length == 0)
                AppendText(str);
            else
                SelectedText = str;

            this.SelectionLength = 0;
            this.CaretIndex = Text.Length;

        }
    }
}

【讨论】:

  • 首先我要谢谢你....其次我遇到了一些问题,当用户在这个文本框中输入并按“空格”时,它会以奇怪的方式“我需要你试试”当用户选择一些东西并再次输入时,他选择的文本不会被删除
  • @AhmedTarek 我注意到了。这是因为我们告诉 TextBox 我们将手动处理所有关键事件。我已经编辑了代码以正确处理“空格”等。处理您想要的所有情况,默认设置为e.Handled = false,以便 TextBox 可以处理。
  • 感谢您的重播,但这种方式的代码给了我一个错误>>“控制不能从一个案例标签('默认:')落到另一个”......实际上即使我把@ 987654323@ 编辑后它仍然无法正常工作.. 它总是有我告诉你的同样的问题
  • 对不起,我忘了它是 C# 这里我们必须在每个案例之后添加 break;。我测试了它。现在一切正常
  • 我告诉你的问题仍然存在“按空格键和选择的文本在输入后仍然出现”
猜你喜欢
  • 2011-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多