虽然一直在玩VS,但是最近才发现,VS可以开发桌面应用,通过WPF,我们可以根据自己的需求定义想要的功能。实在是太方便了,话不多说,我们开始。
VS的版本是2017,之前的版本应该影响也不大
先讲一下基础的思路,首先我们会在界面上布局一个Border(边框),内包含一个TextBlock(文本),作为计算器的显示框。
然后我们再添加一个UniformGrid(均匀分布网格),内包含12个Button(按钮),做为计算机的输入框。最后,我们需要在后台的代码中给每一个按钮添加点击事件,按类型,可以分为,数字点击事件,运算符点击事件,等于键点击事件,清除键点击事件,根据运算结果显示到显示框上。
打开工程,我们可以发现有四个比较明显的脚本:
分别是App.xaml、App.xaml.cs、MainWindow.xaml、MainWindow.xaml.cs
App.xaml是负责应用内部的资源管理,App.xaml.cs是负责App.xaml的交互逻辑,MainWindow.xaml是负责页面布局脚本,MainWindow.xaml.cs是负责页面控件交互逻辑的管理。
我们首先设计一下按钮的形式风格,在风格设计上有参考另外一篇博文,出处会在文末指出,我们先写App.xaml:
xaml的语法风格几乎跟Html一模一样,所以比较容易掌握,在按钮的设计上,我们用到了四种颜色。
#FF2F70BD
#FF5278B8
#FF2D78F4
#FF317EF3
前两种代表按钮本来的颜色,利用渐变色的原理,让颜色从两个相近的蓝色逐渐过渡。然后通过Border里的CornerRadius属性可以设置按钮的圆角的大小。通过判断鼠标悬停状况,可以让按钮颜色改变。
接着,我们来看一下布局代码MainWindow.xaml:
我们按照之前的思路,设计了一个界面630*500,显示框130*440,输入框400*450的计算机UI界面,显示框字号70,输入框35,根据这样的格式,最后的显示界面会是这样:
那么,把界面写好了,我们来写一下界面的交互逻辑MainWindow.xaml.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
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 WpfCalc
{
///
/// MainWindow.xaml 的交互逻辑
///
public partial class MainWindow : Window
{
Dictionary OperationDict;//存储两个运算数和运算符的字典
string num2Str = "";//存储第二个数的临时变量
public MainWindow()
{
InitializeComponent();
Title = "计算器";
btnC.Click += BtnC_Click;
btnE.Click += BtnE_Click;
btnD.Click += new RoutedEventHandler (BtnOperator_Click);
btnX.Click += new RoutedEventHandler(BtnOperator_Click);
btnM.Click += new RoutedEventHandler(BtnOperator_Click);
btnP.Click += new RoutedEventHandler(BtnOperator_Click);
btn9.Click += new RoutedEventHandler(BtnNum_Click);
btn8.Click += new RoutedEventHandler(BtnNum_Click);
btn7.Click += new RoutedEventHandler(BtnNum_Click);
btn6.Click += new RoutedEventHandler(BtnNum_Click);
btn5.Click += new RoutedEventHandler(BtnNum_Click);
btn4.Click += new RoutedEventHandler(BtnNum_Click);
btn3.Click += new RoutedEventHandler(BtnNum_Click);
btn2.Click += new RoutedEventHandler(BtnNum_Click);
btn1.Click += new RoutedEventHandler(BtnNum_Click);
btn0.Click += new RoutedEventHandler(BtnNum_Click);
OperationDict = new Dictionary();
}
private void BtnOperator_Click(object sender, RoutedEventArgs e)//运算符点击事件
{
try {
var opr = sender as Button;
if (ShowNumText.Text == "")
return;
switch (opr.Content.ToString())
{
case "+":
OperationDict.Add("Operator", "+");
break;
case "—":
OperationDict.Add("Operator", "-");
break;
case "X":
OperationDict.Add("Operator", "*");
break;
case "/":
OperationDict.Add("Operator", "/");
break;
}
ShowNumText.Text += opr.Content.ToString();
} catch (Exception e2) {
MessageBox.Show(e2.ToString());
}
}
private void BtnE_Click(object sender, RoutedEventArgs e)//等于键点击事件
{
try
{
ShowNumText.Text += "=";
string str1 = "", str2 = "", opr = "";
if (OperationDict.TryGetValue("Num1", out str1) && OperationDict.TryGetValue("Operator", out opr) && OperationDict.TryGetValue("Num2", out str2))
{//如果字典中两个运算数和运算符都不为空,则执行运算
int num1 = int.Parse(str1);
int num2 = int.Parse(str2);
switch (opr)
{
case "+":
ShowNumText.Text = (num1 + num2).ToString();
break;
case "-":
ShowNumText.Text = (num1 - num2).ToString();
break;
case "*":
ShowNumText.Text = (num1 * num2).ToString();
break;
case "/":
ShowNumText.Text = (num1 / num2).ToString();
break;
}
//MessageBox.Show(OperationDict["Num1"] + ":" + OperationDict["Operator"] + ":" + OperationDict["Num2"]);
OperationDict.Clear();
num2Str = "";
OperationDict.Add("Num1", ShowNumText.Text);
}
else
{
return;
}
}
catch (Exception e1)
{
MessageBox.Show(e1.ToString());
}
}
private void BtnC_Click(object sender, RoutedEventArgs e)//清除键点击事件
{
OperationDict.Clear();
ShowNumText.Text = "";
num2Str = "";
}
private void BtnNum_Click(object sender, RoutedEventArgs e)//数字点击事件
{
var num = sender as Button;
string value = "";
if (!OperationDict.TryGetValue("Operator",out value ) )
{//运算符为空,存储的数字为第一个
if (ShowNumText.Text == "")
{
ShowNumText.Text = num.Content.ToString();
OperationDict.Add("Num1", num.Content.ToString());
}
else
{
ShowNumText.Text += num.Content.ToString();
OperationDict["Num1"] = ShowNumText.Text;
}
}
else {//运算符不为空,存储的数字为第二个
if (num2Str == "")
{
ShowNumText.Text += num.Content.ToString();
num2Str += num.Content.ToString();
OperationDict.Add("Num2", num.Content.ToString());
}
else
{
ShowNumText.Text += num.Content.ToString();
num2Str += num.Content.ToString();
OperationDict["Num2"] = num2Str;
}
}
}
}
}
跟之前的思路一样,我们在入口方法中给所有按钮添加了点击事件,然后用一个字典来存储运算的第一个数,运算符以及第二个数,在点击等于后,会判断字典中是否包含这三个值,如果有,则进行运算。
写完这三个脚本以后,计算器的基本功能就完成了,可以做整数的四则运算,但是缺陷也有很多,之后如果有时间,还会继续完善。
参考博文:写自己的WPF样式 https://www.cnblogs.com/xinwang/p/4354182.html