如何在wpf计算器中使用键盘

如何在wpf计算器中使用键盘,wpf,Wpf,当我尝试获取结果时,“回车”按钮不起作用 public partial class Window1 : Window { static MyTextBox DisplayBox; static MyTextBox PaperBox; static PaperTrail Paper; public Window1() : base() { InitializeComponent(); //sub-class

当我尝试获取结果时,“回车”按钮不起作用

 public partial class Window1 : Window
{
    static MyTextBox DisplayBox;
    static MyTextBox PaperBox;
    static PaperTrail Paper;

    public Window1()
        : base()
    {
        InitializeComponent();
        //sub-class our textBox
        //DisplayBox = new MyTextBox();
        //Grid.SetRow(DisplayBox, 0);
        //Grid.SetColumn(DisplayBox, 0);
        //Grid.SetColumnSpan(DisplayBox, 9);
        //DisplayBox.Height = 30;
        //MyGrid.Children.Add(DisplayBox);

        //sub-class our paper trail textBox
        PaperBox = new MyTextBox();
        Grid.SetRow(PaperBox, 1);
        Grid.SetColumn(PaperBox, 0);
        Grid.SetColumnSpan(PaperBox, 3);
        Grid.SetRowSpan(PaperBox, 5);
        PaperBox.IsReadOnly = true;
        PaperBox.VerticalScrollBarVisibility = ScrollBarVisibility.Visible;
        PaperBox.Margin = new Thickness(3.0,1.0,1.0,1.0);
        PaperBox.HorizontalScrollBarVisibility = ScrollBarVisibility.Auto;

        Paper = new PaperTrail();

        MyGrid.Children.Add(PaperBox);
        ProcessKey('0');
        EraseDisplay = true;

    }

    private enum Operation
    {
        None,
        Devide,
        Multiply,
        Subtract,
        Add,
        Percent,
        Sqrt,
        OneX,
        Negate
    }
    private Operation LastOper;
    private string _display;
    private string _last_val;
    private string _mem_val;
    private bool _erasediplay;

    //flag to erase or just add to current display flag
    private bool EraseDisplay
    {
        get
        {
            return _erasediplay;

        }
        set
        {
            _erasediplay = value;
        }
    }
    //Get/Set Memory cell value
    private Double Memory
    {
        get
        {
            if (_mem_val == string.Empty)
                return 0.0;
            else
                return Convert.ToDouble(_mem_val);
        }
        set
        {
            _mem_val = value.ToString();
        }
    }
    //Lats value entered
    private string LastValue
    {
        get
        {
            if (_last_val == string.Empty)
                return "0";
            return _last_val;

        }
        set
        {
            _last_val = value;
        }
    }
    //The current Calculator display
    private string Display
    {
        get
        {
            return _display;
        }
        set
        {
            _display = value;
        }
    }

    // Sample event handler:  
    private void OnWindowKeyDown(object sender, System.Windows.Input.TextCompositionEventArgs /*System.Windows.Input.KeyEventArgs*/ e)
    {
        string s = e.Text;
        char c = (s.ToCharArray())[0];
        e.Handled = true;

        if ((c >= '0' && c <= '9') || c == '.' || c == '\b')  // '\b' is backspace
        {
            ProcessKey(c);
            return;
        }
        switch (c)
        {
            case '+':
                ProcessOperation("BPlus");
                break;
            case '-':
                ProcessOperation("BMinus");
                break;
            case '*':
                ProcessOperation("BMultiply");
                break;
            case '/':
                ProcessOperation("BDevide");
                break;
            case '%':
                ProcessOperation("BPercent");
                break;
            case '=':
                ProcessOperation("BEqual");
                break;
        }

    }
    private void DigitBtn_Click(object sender, RoutedEventArgs e)
    {
        string s = ((Button)sender).Content.ToString();

        //char[] ids = ((Button)sender).ID.ToCharArray();
        char[] ids = s.ToCharArray();
        ProcessKey(ids[0]);

    }
    private void ProcessKey(char c)
    {
        if (EraseDisplay)
        {
            Display = string.Empty;
            EraseDisplay = false;
        }
        AddToDisplay(c);
    }
    private void ProcessOperation(string s)
    {
        Double d = 0.0;
        switch (s)
        {
            case "BPM":
                LastOper = Operation.Negate;
                LastValue = Display;
                CalcResults();
                LastValue = Display;
                EraseDisplay = true;
                LastOper = Operation.None;
                break;
            case "BDevide":

                if (EraseDisplay)    //stil wait for a digit...
                {  //stil wait for a digit...
                    LastOper = Operation.Devide;
                    break;
                }
                CalcResults();
                LastOper = Operation.Devide;
                LastValue = Display;
                EraseDisplay = true;
                break;
            case "BMultiply":
                if (EraseDisplay)    //stil wait for a digit...
                {  //stil wait for a digit...
                    LastOper = Operation.Multiply;
                    break;
                }
                CalcResults();
                LastOper = Operation.Multiply;
                LastValue = Display;
                EraseDisplay = true;
                break;
            case "BMinus":
                if (EraseDisplay)    //stil wait for a digit...
                {  //stil wait for a digit...
                    LastOper = Operation.Subtract;
                    break;
                }
                CalcResults();
                LastOper = Operation.Subtract;
                LastValue = Display;
                EraseDisplay = true;
                break;
            case "BPlus":
                if (EraseDisplay)
                {  //stil wait for a digit...
                    LastOper = Operation.Add;
                    break;
                }
                CalcResults();
                LastOper = Operation.Add;
                LastValue = Display;
                EraseDisplay = true;
                break;
            case "BEqual":
                if (EraseDisplay)    //stil wait for a digit...
                    break;
                CalcResults();
                EraseDisplay = true;
                LastOper = Operation.None;
                LastValue = Display;
                //val = Display;
                break;
            case "BSqrt":
                LastOper = Operation.Sqrt;
                LastValue = Display;
                CalcResults();
                LastValue = Display;
                EraseDisplay = true;
                LastOper = Operation.None;
                break;
            case "BPercent":
                if (EraseDisplay)    //stil wait for a digit...
                {  //stil wait for a digit...
                    LastOper = Operation.Percent;
                    break;
                }
                CalcResults();
                LastOper = Operation.Percent;
                LastValue = Display;
                EraseDisplay = true;
                //LastOper = Operation.None;
                break;
            case "BOneOver":
                LastOper = Operation.OneX;
                LastValue = Display;
                CalcResults();
                LastValue = Display;
                EraseDisplay = true;
                LastOper = Operation.None;
                break;
            case "BC":  //clear All
                LastOper = Operation.None;
                Display = LastValue = string.Empty;
                Paper.Clear();
                UpdateDisplay();
                break;
            case "BCE":  //clear entry
                LastOper = Operation.None;
                Display = LastValue;
                UpdateDisplay();
                break;
            case "BMemClear":
                Memory = 0.0F;
                DisplayMemory();
                break;
            case "BMemSave":
                Memory = Convert.ToDouble(Display);
                DisplayMemory();
                EraseDisplay = true;
                break;
            case "BMemRecall":
                Display = /*val =*/ Memory.ToString();
                UpdateDisplay();
                //if (LastOper != Operation.None)   //using MR is like entring a digit
                EraseDisplay = false;
                break;
            case "BMemPlus":
                d = Memory + Convert.ToDouble(Display);
                Memory = d;
                DisplayMemory();
                EraseDisplay = true;
                break;
        }

    }

    private void OperBtn_Click(object sender, RoutedEventArgs e)
    {
        ProcessOperation(((Button)sender).Name.ToString());
    }


    private double Calc(Operation LastOper)
    {
        double d = 0.0;

        try {
        switch (LastOper)
        {
            case Operation.Devide:
                Paper.AddArguments(LastValue + " / " + Display);
                d = (Convert.ToDouble(LastValue) / Convert.ToDouble(Display));
                CheckResult(d);
                Paper.AddResult(d.ToString());
                break;
            case Operation.Add:
                Paper.AddArguments(LastValue + " + " + Display);
                d = Convert.ToDouble(LastValue) + Convert.ToDouble(Display);
                CheckResult(d);
                Paper.AddResult(d.ToString());
                break;
            case Operation.Multiply:
                Paper.AddArguments(LastValue + " * " + Display);
                d = Convert.ToDouble(LastValue) * Convert.ToDouble(Display);
                CheckResult(d);
                Paper.AddResult(d.ToString());
                break;
            case Operation.Percent:
                //Note: this is different (but make more sense) then Windows calculator
                Paper.AddArguments(LastValue + " % " + Display);
                d = (Convert.ToDouble(LastValue) * Convert.ToDouble(Display)) / 100.0F;
                CheckResult(d);
                Paper.AddResult(d.ToString());
                break;
            case Operation.Subtract:
                Paper.AddArguments(LastValue + " - " + Display);
                d = Convert.ToDouble(LastValue) - Convert.ToDouble(Display);
                CheckResult(d);
                Paper.AddResult(d.ToString());
                break;
            case Operation.Sqrt:
                Paper.AddArguments("Sqrt( " + LastValue + " )");
                d = Math.Sqrt(Convert.ToDouble(LastValue));
                CheckResult(d);
                Paper.AddResult(d.ToString());
                break;
            case Operation.OneX:
                Paper.AddArguments("1 / " + LastValue);
                d = 1.0F / Convert.ToDouble(LastValue);
                CheckResult(d);
                Paper.AddResult(d.ToString());
                break;
            case Operation.Negate:
                d = Convert.ToDouble(LastValue) * (-1.0F);
                break;
            }
        }
        catch {
            d = 0;
            Window parent = (Window)MyPanel.Parent;
            Paper.AddResult("Error");
            MessageBox.Show(parent, "Operation cannot be perfomed", parent.Title);
        }

        return d;
    }
    private void CheckResult(double d)
    {
        if (Double.IsNegativeInfinity(d) || Double.IsPositiveInfinity(d) || Double.IsNaN(d))
            throw new Exception("Illegal value");
    }

    private void DisplayMemory()
    {
        if (_mem_val != String.Empty)
            BMemBox.Text = "Memory: " + _mem_val;
        else
            BMemBox.Text = "Memory: [empty]";
    }
    private void CalcResults()
    {
        double d;
        if (LastOper == Operation.None)
            return;

        d = Calc(LastOper);
        Display = d.ToString();

        UpdateDisplay();
    }

    private void UpdateDisplay()
    {
        if (Display == String.Empty)
            DisplayBox.Text = "0";
        else
            DisplayBox.Text = Display;
    }
    private void AddToDisplay(char c)
    {
        if (c == '.')
        {
            if (Display.IndexOf('.', 0) >= 0)  //already exists
                return;
            Display = Display + c;
        }
        else
        {
            if (c >= '0' && c <= '9') {
                Display = Display + c;
            }
            else
            if (c == '\b')  //backspace ?
            {
                if (Display.Length <= 1)
                    Display = String.Empty;
                else
                {
                    int i = Display.Length;
                    Display = Display.Remove(i - 1, 1);  //remove last char 
                }
            }

        }

        UpdateDisplay();
    }

    void OnMenuAbout(object sender, RoutedEventArgs e)
    {
        Window parent = (Window)MyPanel.Parent;
        MessageBox.Show(parent, parent.Title + " - By Jossef Goldberg ", parent.Title,MessageBoxButton.OK, MessageBoxImage.Information);
    }
    void OnMenuExit(object sender, RoutedEventArgs e)
    {
        this.Close();
    }
    void OnMenuStandard(object sender, RoutedEventArgs e)
    {
        //((MenuItem)ScientificMenu).IsChecked = false;
        ((MenuItem)StandardMenu).IsChecked = true; //for now always Standard
    }
    //Not implemenetd 
    void OnMenuScientific(object sender, RoutedEventArgs e)
    {
       //((MenuItem)StandardMenu).IsChecked = false; 
    }   
    private class PaperTrail
    {
        string args;

        public PaperTrail()
        {
        }
        public void AddArguments(string a)
        {
            args = a;
        }
        public void AddResult(string r)
        {
            PaperBox.Text += args + " = " + r + "\n";
        }
        public void Clear()
        {
            PaperBox.Text = string.Empty;
            args = string.Empty;
        }
    }
}
公共部分类窗口1:窗口
{
静态MyTextBox显示框;
静态MyTextBox纸盒;
静态文件;
公共窗口1()
:base()
{
初始化组件();
//我们的文本框的子类
//DisplayBox=新的MyTextBox();
//Grid.SetRow(显示框,0);
//Grid.SetColumn(显示框,0);
//Grid.SetColumnSpan(显示框,9);
//显示框,高度=30;
//MyGrid.Children.Add(显示框);
//子类我们的文件跟踪文本框
纸盒=新的MyTextBox();
网格。SetRow(纸盒,1);
网格设置列(纸盒,0);
网格.SetColumnSpan(纸盒,3);
网格设置行跨度(纸盒,5);
PaperBox.IsReadOnly=true;
PaperBox.VerticalScrollBarVisibility=ScrollBarVisibility.Visible;
纸盒。边距=新厚度(3.0,1.0,1.0,1.0);
PaperBox.HorizontalScrollBarVisibility=ScrollBarVisibility.Auto;
纸张=新的书面材料();
MyGrid.Children.Add(纸盒);
ProcessKey('0');
擦除显示=真;
}
私有枚举操作
{
没有一个
德维德,
乘,
减去,
添加
百分比
Sqrt,
OneX,
否定
}
私人经营;
私有字符串显示;
私有字符串_last_val;
私有字符串_mem_val;
私人布卢迪普拉;
//要删除或仅添加到当前显示标志的标志
专用布尔显示器
{
得到
{
返回(擦除)显示;;
}
设置
{
_擦除diplay=值;
}
}
//获取/设置内存单元值
专用双存储器
{
得到
{
if(_mem_val==string.Empty)
返回0.0;
其他的
返回Convert.ToDouble(_mem_val);
}
设置
{
_mem_val=value.ToString();
}
}
//输入的Lats值
私有字符串值
{
得到
{
if(_last_val==string.Empty)
返回“0”;
返回最后一个值;
}
设置
{
_last_val=值;
}
}
//当前计算器显示
专用字符串显示
{
得到
{
返回显示;
}
设置
{
_显示=值;
}
}
//事件处理程序示例:
私有void OnWindowKeyDown(对象发送方,System.Windows.Input.TextCompositionEventArgs/*System.Windows.Input.KeyEventArgs*/e)
{
字符串s=e.Text;
charc=(s.ToCharArray())[0];
e、 已处理=正确;
如果((c>='0'&&c=0)//已存在
返回;
显示=显示+c;
}
其他的
{

如果(c>='0'&&c Hi swetha感谢您的回答,您能告诉我哪些代码应该在块中吗?您应该在块中放置计算器
private void _KeyDown(object sender, KeyEventArgs e)
{
    if (e.Key == Key.Enter || e.Key == Key.Tab)
    {
        //YourCode
    }
}
 private void txtEdtDisplayBox_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.Key == Key.Enter)
        {
            string rest = txtEdtDisplayBox.Text;
            string[] seperaateNumbers;

            seperaateNumbers = rest.Split('+');
            if (seperaateNumbers.Count() > 1)
            {
                txtEdtDisplayBox.Text = Convert.ToString(Convert.ToInt64(seperaateNumbers[0]) + Convert.ToInt64(seperaateNumbers[1]));
                //MessageBox.Show( Convert.ToString(Convert.ToInt64(seperaateNumbers[0]) + Convert.ToInt64(seperaateNumbers[1])));
            }
            else
            {
                DXMessageBox.Show("Wrong Operation","Error",  MessageBoxButton.OK,MessageBoxImage.Error);
            }

            seperaateNumbers = rest.Split('-');
            if (seperaateNumbers.Count() > 1)
            {
                txtEdtDisplayBox.Text = Convert.ToString(Convert.ToInt64(seperaateNumbers[0]) + Convert.ToInt64(seperaateNumbers[1]));
            }

            seperaateNumbers = rest.Split('*');
            if (seperaateNumbers.Count() > 1)
            {
                txtEdtDisplayBox.Text = Convert.ToString(Convert.ToInt64(seperaateNumbers[0]) + Convert.ToInt64(seperaateNumbers[1]));
            }

            seperaateNumbers = rest.Split('/');
            if (seperaateNumbers.Count() > 1)
            {
                txtEdtDisplayBox.Text = Convert.ToString(Convert.ToInt64(seperaateNumbers[0]) + Convert.ToInt64(seperaateNumbers[1]));
            }
        }
    }