C# 自定义文本框控件,可自动切换键盘语言c WPF

C# 自定义文本框控件,可自动切换键盘语言c WPF,c#,wpf,textbox,char,ascii,C#,Wpf,Textbox,Char,Ascii,我需要做一些像那样的东西 但对于WPF和C 我试着用一个简单的if语句来做,但我不得不放另一个这样的文本框 private void textBox2_TextChanged(object sender, TextChangedEventArgs e) { textBox1.Focus(); if (textBox1.Text == "Q" || textBox1.Text == "q") { textBox

我需要做一些像那样的东西 但对于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 ..
    }

它可以工作,但我想做一些类似上面链接的事情,你可以在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;

        }
    }
}

这个链接不是为您提供了源代码以及关于发生了什么以及如何工作的解释吗?似乎最好的方法是研究你链接到的完整解决方案,在适当的地方进行编辑,当你被困在某个特定的地方时提出问题。首先我要感谢你。。。。第二,我有一些问题,比如当用户在这个文本框中键入并按空格键时,它会以一种奇怪的方式进行操作,我需要您尝试一下,当用户选择一些东西并再次键入他选择的文本时,他选择的文本不正确deleted@AhmedTarek我注意到了。之所以会发生这种情况,是因为我们告诉TextBox我们将手动处理所有关键事件。我已编辑代码以正确处理“空格”等。处理您想要的所有案例,默认设置为e。Handled=false,以便TextBox可以处理。感谢您的重播,但这种方式的代码给了我一个错误>>控件无法从一个案例标签“default:”切换到另一个案例标签。。。其实就算我放断了;编辑后,它仍然不起作用。。它总是有我告诉过你的同样的问题,对不起,我忘了这里是C,我们必须加上break;在每个案例之后。我测试过了。现在工作正常我告诉过你的问题仍然存在空格键按下和选定的文本在键入后仍然出现