在WPF中等效的KeyPress事件

时间:2012-11-27 15:16:47

标签: c# wpf

我在WPA中有以下代码,我正在尝试将其转换为WPF。我尝试过Keydown而不是Keypress,并改变了,例如,

(e.keyChar == '-') to (e.key == e.Subtract):
  1. 它不能正常工作
  2. 我无法在e.key中找到等号
  3. 第一个代码:

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            foreach (TextBox tb in this.Controls.OfType<TextBox>())
            {
                tb.Enter += textBox_Enter;
            }
        }
    
        void textBox_Enter(object sender, EventArgs e)
        {
            focusedTextbox = (TextBox)sender;
        }
    
    private void Form1_KeyPress(object sender, KeyPressEventArgs e)
        {
    
            if (e.KeyChar == '+')
            {
                operand1.Real = getOperand.Real;
                operand1.Imag = getOperand.Imag;
                flag1 = 1;
                e.Handled = true;
            }
            else if (e.KeyChar == '-')
            {
    
                if (focusedTextbox != null)
                {
                    if (focusedTextbox.Text == "")
                    {
                        e.Handled = false;
                    }
                    else
                    {
                        e.Handled = true;
                        operand1.Real = getOperand.Real;
                        operand1.Imag = getOperand.Imag;
                        flag1 = 2;
                    }
                }
    
            }
            else if (e.KeyChar == '*')
            {
                operand1.Real = getOperand.Real;
                operand1.Imag = getOperand.Imag;
                flag1 = 3;
                e.Handled = true;
            }
            else if (e.KeyChar == '/')
            {
                operand1.Real = getOperand.Real;
                operand1.Imag = getOperand.Imag;
                flag1 = 4;
                e.Handled = true;
            }
            else if (e.KeyChar == '=')
            {
                e.Handled = true;
                operand2.Real = getOperand.Real;
                operand2.Imag = getOperand.Imag;
    
                switch (flag1)
                {
                    case 1:
                        operand1 = operand1 + operand2;
                        break;
                    case 2: operand1 = operand1 - operand2;
                        break;
                    case 3:
                        operand1 = operand1 * operand2;
                        break;
                    case 4:
                        if (operand2.Magnitude == 0)
                        {
                            textBox1.Clear();
                            textBox2.Clear();
                            MessageBox.Show("Cannot divide by a number whose magnitude is zero");
                            operand1 = new Complex();
                            operand2 = new Complex();
                            listBox1.ClearSelected();
    
                        }
                        else
                        operand1 = operand1 / operand2;
                        break;
                }
                string s = operand1.ToString();
                if (flag == 1)
                {
                    string[] s1 = s.Split(' ');
    
                    if (s1[1] == "-")
                    {
                        textBox1.Text = s1[0];
                        textBox2.Text = "-" + s1[3];
                    }
                    else
                    {
                        textBox1.Text = s1[0];
                        textBox2.Text = s1[3];
                    }
                }
                else if (flag == 2)
                {
                    string[] s1 = s.Split('@');
                    textBox1.Text = s1[0].Trim();
                    textBox2.Text = s1[1].Trim();
                }
    
                listBox1.Items.Add(operand1);
            }
    
        }
    

    第二个代码:

    private void win_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Add)
            {
                operand1.Real = getOperand.Real;
                operand1.Imag = getOperand.Imag;
                flag1 = 1;
                e.Handled = true;
    
            }
            else if (e.Key == Key.Subtract)
            {
    
                if (textBox2.Text == "")
                {
                    e.Handled = false;
                }
                else
                {
                    e.Handled = true;
                    operand1.Real = getOperand.Real;
                    operand1.Imag = getOperand.Imag;
                    flag1 = 2;
                }
    
            }
            else if (e.Key == Key.Multiply)
            {
                operand1.Real = getOperand.Real;
                operand1.Imag = getOperand.Imag;
                flag1 = 3;
                e.Handled = true;
            }
            else if (e.Key == Key.Divide)
            {
                operand1.Real = getOperand.Real;
                operand1.Imag = getOperand.Imag;
                flag1 = 4;
                e.Handled = true;
            }
            else if (e.Key == Key.Enter)
            {
                e.Handled = true;
                operand2.Real = getOperand.Real;
                operand2.Imag = getOperand.Imag;
    
                switch (flag1)
                {
                    case 1:
                        operand1 = operand1 + operand2;
                        break;
                    case 2: operand1 = operand1 - operand2;
                        break;
                    case 3:
                        operand1 = operand1 * operand2;
                        break;
                    case 4:
                        if (operand2.Magnitude == 0)
                        {
                            textBox1.Clear();
                            textBox2.Clear();
                            MessageBox.Show("Cannot divide by a number whose magnitude is zero");
                            operand1 = new Complex();
                            operand2 = new Complex();
                            listBox1.UnselectAll();
                        }
                        else
                            operand1 = operand1 / operand2;
                        break;
                }
                string s = operand1.ToString();
                if (flag == 1)
                {
                    string[] s1 = s.Split(' ');
    
                    if (s1[1] == "-")
                    {
                        textBox1.Text = s1[0];
                        textBox2.Text = "-" + s1[3];
                    }
                    else
                    {
                        textBox1.Text = s1[0];
                        textBox2.Text = s1[3];
                    }
                }
                else if (flag == 2)
                {
                    string[] s1 = s.Split('@');
                    textBox1.Text = s1[0].Trim();
                    textBox2.Text = s1[1].Trim();
                }
    
    
                listBox1.Items.Add(operand1);
            }
        }
    

3 个答案:

答案 0 :(得分:21)

它非常相似 - 但你将e.Key与Key枚举进行比较。

在某处注册您的事件处理程序(例如构造函数或window_loaded):

private void Window_Loaded(object sender, RoutedEventArgs e)
{
    this.KeyDown += new KeyEventHandler(MainWindow_KeyDown);
}

然后在事件处理程序中:

void MainWindow_KeyDown(object sender, KeyEventArgs e)
{
    if (e.Key == Key.Subtract)
    {
        // Do something
    }
}

答案 1 :(得分:11)

您正在寻找TextInput事件,或者PreviewTextInput

EventArgs类型为TextCompositionEventArgs;我相信你想要Text属性,但我对此并不确定。

答案 2 :(得分:4)

<TextBox x:Name="txtbx" KeyDown="OnKeyDownHandler" Height="23" Width="250">
</TextBox>

private void OnKeyDownHandler(object sender, KeyEventArgs e)
{
    if (e.Key == Key.Return)
    {
        txtbx.Text = "You Entered: " + txtbx.Text;
    }
}