WPF实现键盘鼠标输入简易计算器
使用的开发工具为VS2010,简单操作如下:
首先创建项目,整体为单页面应用
在App.xaml中指明启动初始页面
<Application x:Class="Calcluator.App" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" StartupUri="MainWindow.xaml"> <Application.Resources> </Application.Resources> </Application>
q前台代码
MainWindow.xaml
<Window x:Class="Calculator.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="计算器" Height="600" Width="400" Icon="Images/calculatorIcon.png" KeyDown="Calcluator_KeyDown"> <Grid> <Grid.RowDefinitions> <RowDefinition Height="3*"></RowDefinition> <RowDefinition Height="2*"></RowDefinition> <RowDefinition Height="2*"></RowDefinition> <RowDefinition Height="2*"></RowDefinition> <RowDefinition Height="2*"></RowDefinition> <RowDefinition Height="2*"></RowDefinition> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition/> <ColumnDefinition/> <ColumnDefinition/> <ColumnDefinition/> </Grid.ColumnDefinitions> <TextBlock Grid.Row="0" Grid.ColumnSpan="4" Height="Auto" Name="textBlockExpression" Margin="0,0,15,0" HorizontalAlignment="Right" FontSize="36" Width="Auto"/> <TextBlock Grid.Row="0" Grid.ColumnSpan="4" Height="60" Name="textBlockResult" Margin="0,0,15,0" HorizontalAlignment="Right" FontSize="36" Text="0" /> <Button Grid.Row="1" Grid.Column="0" Name="buttonClear" Content="C" FontSize="40" Click="buttonClear_Click"></Button> <Button Grid.Row="1" Grid.Column="1" Name="buttonDelete" Content="←" FontSize="40" Click="buttonDelete_Click"></Button> <Button Grid.Row="1" Grid.Column="2" Name="buttonTemp" Content="" FontSize="40"></Button> <Button Grid.Row="1" Grid.Column="3" Name="buttonAdd" Content="+" Click="buttonMark_Click" FontSize="40"></Button> <Button Grid.Row="2" Grid.Column="0" Name="buttonNum1" Content="1" Click="buttonNum_Click" FontSize="40"></Button> <Button Grid.Row="2" Grid.Column="1" Name="buttonNum2" Content="2" Click="buttonNum_Click" FontSize="40"></Button> <Button Grid.Row="2" Grid.Column="2" Name="buttonNum3" Content="3" Click="buttonNum_Click" FontSize="40"></Button> <Button Grid.Row="2" Grid.Column="3" Name="buttonMinus" Content="-" Click="buttonMark_Click" FontSize="40"></Button> <Button Grid.Row="3" Grid.Column="0" Name="buttonNum4" Content="4" Click="buttonNum_Click" FontSize="40"></Button> <Button Grid.Row="3" Grid.Column="1" Name="buttonNum5" Content="5" Click="buttonNum_Click" FontSize="40"></Button> <Button Grid.Row="3" Grid.Column="2" Name="buttonNum6" Content="6" Click="buttonNum_Click" FontSize="40"></Button> <Button Grid.Row="3" Grid.Column="3" Name="buttonMultiply" Content="×" Click="buttonMark_Click" FontSize="40"></Button> <Button Grid.Row="4" Grid.Column="0" Name="buttonNum7" Content="7" Click="buttonNum_Click" FontSize="40"></Button> <Button Grid.Row="4" Grid.Column="1" Name="buttonNum8" Content="8" Click="buttonNum_Click" FontSize="40"></Button> <Button Grid.Row="4" Grid.Column="2" Name="buttonNum9" Content="9" Click="buttonNum_Click" FontSize="40"></Button> <Button Grid.Row="4" Grid.Column="3" Name="buttonDivide" Content="÷" Click="buttonMark_Click" FontSize="40"></Button> <Button Grid.Row="5" Grid.ColumnSpan="2" Name="buttonNum0" Content="0" Click="buttonNum_Click" FontSize="40"></Button> <Button Grid.Row="5" Grid.Column="2" Name="buttonPoint" Content="." Click="buttonNum_Click" FontSize="40"></Button> <Button Grid.Row="5" Grid.Column="3" Name="buttonEquals" Content="=" Click="buttonEqual_Click" FontSize="40" Background="#FFF88B26"></Button> </Grid> </Window>
MainWindow.xaml.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; namespace Calculator { /// <summary> /// 计算器交互逻辑 /// </summary> public partial class MainWindow : Window { /// <summary> /// 计算结果值 /// </summary> private double m_dResult = 0.0; /// <summary> /// 运算符号标记 /// </summary> private string m_strOperator = ""; public MainWindow() { InitializeComponent (); } /// <summary> /// 数字按钮鼠标点击事件方法 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void buttonNum_Click(object sender, RoutedEventArgs e) { if (m_strOperator == "=") defaultCalcluator (e); string strCurrentNum = ((Button)sender).Content.ToString (); inputNum (strCurrentNum); } /// <summary> /// 键盘或鼠标输入数字方法 /// </summary> /// <param name="strInputNum"></param> private void inputNum(string strInputNum) { if (m_strOperator != "") { string strCurrentExpression = textBlockExpression.Text; string strSufExperssion = strCurrentExpression.Substring (strCurrentExpression.Length - 1, 1); //计算表达式最后一位不是符号 if (isSufOperatorMark (strSufExperssion)) { textBlockResult.Text = strInputNum; } else { textBlockResult.Text = textBlockResult.Text + strInputNum; } textBlockExpression.Text = textBlockExpression.Text + strInputNum; } else { //输入第一个数字为0情况判断 if (textBlockResult.Text == "0" && strInputNum != ".") { textBlockResult.Text = strInputNum; textBlockExpression.Text = strInputNum; } else { textBlockResult.Text = textBlockResult.Text + strInputNum; textBlockExpression.Text = textBlockExpression.Text + strInputNum; } } } /// <summary> /// 运算符号按钮鼠标点击事件方法 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void buttonMark_Click(object sender, RoutedEventArgs e) { string strCurrentMark = ((Button)sender).Content.ToString (); inputOperationMark (strCurrentMark); } /// <summary> /// 键盘或鼠标输入运算符号方法 /// </summary> /// <param name="strInputMark"></param> private void inputOperationMark(string strInputMark) { string strCurrentExpression = textBlockExpression.Text; if (!string.IsNullOrEmpty (strCurrentExpression)) { string strSufExperssion = strCurrentExpression.Substring (strCurrentExpression.Length - 1, 1); if (isSufOperatorMark (strSufExperssion)) { //防止重复输入运算符号 if (strInputMark != strSufExperssion) { //可以修改不同运算符号 m_strOperator = strInputMark; textBlockExpression.Text = strCurrentExpression.Substring (0, strCurrentExpression.Length - 1) + strInputMark; } } else { textBlockExpression.Text = textBlockExpression.Text + strInputMark; OperationNum (strInputMark); textBlockResult.Text = m_dResult.ToString (); } } } /// <summary> /// 数值计算 /// </summary> /// <param name="strMark"></param> private void OperationNum(string strMark) { switch (m_strOperator) { case "": m_dResult = double.Parse (textBlockResult.Text); m_strOperator = strMark; break; case "+": m_dResult = m_dResult + double.Parse (textBlockResult.Text); m_strOperator = strMark; break; case "-": m_dResult = m_dResult - double.Parse (textBlockResult.Text); m_strOperator = strMark; break; case "×": m_dResult = m_dResult * double.Parse (textBlockResult.Text); m_strOperator = strMark; break; case "÷": if (textBlockResult.Text == "0") { MessageBox.Show ("除数不能为0!"); textBlockExpression.Text = ""; textBlockResult.Text = "0"; m_strOperator = ""; //m_dResult = 0.0; } else { m_dResult = m_dResult / double.Parse (textBlockResult.Text); m_strOperator = strMark; } break; default: break; } } /// <summary> /// 判断输入的计算表达式最后一位是运算符号 /// </summary> /// <param name="strMark"></param> /// <returns></returns> private bool isSufOperatorMark(string strMark) { string[] arrOperatorMark = { "+", "-", "×", "÷" }; string strCurrentExpression = textBlockExpression.Text; if (Array.IndexOf (arrOperatorMark, strMark) == -1) return false; return true; } /// <summary> /// “=”按钮点击事件方法 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void buttonEqual_Click(object sender, RoutedEventArgs e) { //防止打开计算器直接按等于 if (m_strOperator != "") { textBlockExpression.Text = textBlockExpression.Text + "="; OperationNum ("="); textBlockResult.Text = m_dResult.ToString (); } } /// <summary> /// 退格按钮点击事件方法 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void buttonDelete_Click(object sender, RoutedEventArgs e) { string strCurrentResult = textBlockResult.Text; if (!string.IsNullOrEmpty (strCurrentResult)) textBlockResult.Text = strCurrentResult.Substring (0, strCurrentResult.Length - 1); else { textBlockResult.Text = "0"; //textBlockExpression.Text = ""; } } /// <summary> /// 清空按钮点击事件方法 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void buttonClear_Click(object sender, RoutedEventArgs e) { defaultCalcluator (e); } /// <summary> /// 计算器回归默认值 /// </summary> public void defaultCalcluator(RoutedEventArgs e) { textBlockExpression.Text = ""; textBlockResult.Text = "0"; m_strOperator = ""; m_dResult = 0.0; } /// <summary> /// 键盘按键输入事件方法 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void Calcluator_KeyDown(object sender, KeyEventArgs e) { if (e.KeyStates == Keyboard.GetKeyStates (Key.OemPlus) && Keyboard.Modifiers == ModifierKeys.Shift) { inputOperationMark ("+"); } if (e.KeyStates == Keyboard.GetKeyStates (Key.OemMinus)) { inputOperationMark ("-"); } if (e.KeyStates == Keyboard.GetKeyStates (Key.OemQuestion)) { inputOperationMark ("÷"); } if (e.Key == Key.Return) { //防止打开计算器直接按等于 if (m_strOperator != "") { textBlockExpression.Text = textBlockExpression.Text + "="; OperationNum ("="); textBlockResult.Text = m_dResult.ToString (); } } if (e.KeyStates == Keyboard.GetKeyStates (Key.D0)) { inputNum ("0"); } if (e.KeyStates == Keyboard.GetKeyStates (Key.D1)) { inputNum ("1"); } if (e.Key == Key.D2) { inputNum ("2"); } if (e.KeyStates == Keyboard.GetKeyStates (Key.D3)) { inputNum ("3"); } if (e.KeyStates == Keyboard.GetKeyStates (Key.D4)) { inputNum ("4"); } if (e.KeyStates == Keyboard.GetKeyStates (Key.D5)) { inputNum ("5"); } if (e.KeyStates == Keyboard.GetKeyStates (Key.D6)) { inputNum ("6"); } if (e.KeyStates == Keyboard.GetKeyStates (Key.D7)) { inputNum ("7"); } if (e.KeyStates == Keyboard.GetKeyStates (Key.D8)) { inputNum ("8"); } if (e.KeyStates == Keyboard.GetKeyStates (Key.D9)) { inputNum ("9"); } //小数点 if (e.KeyStates == Keyboard.GetKeyStates (Key.OemPeriod)) { inputNum ("."); } //键盘退格符 if (e.KeyStates == Keyboard.GetKeyStates (Key.Back)) { string strCurrentResult = textBlockResult.Text; if (!string.IsNullOrEmpty (strCurrentResult)) textBlockResult.Text = strCurrentResult.Substring (0, strCurrentResult.Length - 1); { textBlockResult.Text = "0"; //textBlockExpression.Text = ""; } } //键盘Del键全部清空 if (e.KeyStates == Keyboard.GetKeyStates (Key.Delete)) { textBlockExpression.Text = ""; textBlockResult.Text = "0"; m_strOperator = ""; m_dResult = 0.0; } } } }
------------恢复内容结束------------