用Visual Studio + C#写上位机,获得一份简单的快乐。
Visual Studio提供了非常易用的开发环境,对于Windows.Form来说,控件直接拖拽完成界面开发,点击对应的控件即自动添加click方法,每个控件都有一个事件列表,控件支持哪些事件一目了然,开发速度自然快了。
C#基于Windows .Net,对库的封装程度比较高,还有很多语法糖,VS还提供了自定添加引用,输入提示,类属性/方法提示等操作方法以简便代码编写。但是,使用C#开发的Windows.Form/WPF程序不是跨平台的,只能运行在Windows平台。
总体来说,比较傻瓜式。
基础操作
操作 | 代码 |
---|---|
控件使能 | bt.Enabled = true; #false |
标签赋值 | label.Text = text; text = label.Text; |
下拉框默认设置 | cmb.SelectedIndex = 0; |
下拉框添加项 | cmb.Items.Add(str); |
清空下拉框 | cmb.Items.Clear(); |
设置窗体顶层显示 | this.TopMost = true; |
打印输出 | Console.WriteLine(“”); |
消息弹窗 | MessageBox.Show(“提示消息”); |
捕捉异常
1 | try |
关闭时关闭所有线程
绑定窗体的FormClosed事件:
1 | private void FormClosed(object sender, FormClosingEventArgs e) |
聚合类型范式
1 | struct Person |
1 | public class Person |
使用Struct和Class的区别:
- struct是值类型,创建一个struct类型的实例被分配在栈上;class是引用类型,创建一个class类型实例被分配在托管堆上。
- struct实例的赋值,赋的是值;class实例的赋值,赋的是引用地址。
- struct有默认无参构造函数;class没有默认无参构造函数。
- struct不支持继承;class支持继承。
- struct类型的实例既可以通过new SomeStruct()来创建,也可以通过SomeStruct myStruct创建;class的实例只能通过new SomeClass()来创建。
总结来说,类偏向于”面向对象”,用于复杂、大型数据,struct偏向于”简单值”,结构简单。
类型转换
ToString
1 | float f = 865.50f; |
Covert
Convert 类的静态方法主要用于支持与 .NET Framework 中的基本数据类型之间的转换。 支持的基类型为 Boolean、Char、SByte、Byte、Int16、Int32、Int64、UInt16、UInt32、UInt64、Single、Double、Decimal、DateTime 和 String。
1 | int iNumber = System.Convert.ToInt32(dNumber); |
BitConverter
BitConverter 类用于整个数组类型的转换。BitConverter 类包括用于在每个基元类型与字节数组之间进行转换的静态方法。
1 | byte[] btAryTranData = { 0xFA, 0x12, 0xFB }; |
Encoding
Encoding 类提供不同编码之间的相互转换,并提供GetBytes、GetString两个方法在byte[]和string之间相互转换。
1 | // string类型转成byte[]: |
Marshal
Marshal 类的方法用于分配非托管内存、复制非托管内存块、将托管类型转换为非托管类型,此外还提供了在与非托管代码交互时使用的其他杂项方法。
常用函数 | 说明 |
---|---|
AllocHGlobal | 从进程的非托管内存中分配内存 |
FreeHGlobal(IntPtr) | 释放以前从进程的非托管内存中分配的内存 |
DestroyStructure(IntPtr, Type) | 释放指定的非托管内存块所指向的所有子结构。 |
Copy | |
PtrToStringAnsi | 将非托管 ANSI 字符串 |
PToStructure | 将数据从非托管内存块封送到托管对象 |
ReadByte | 从非托管内存中读取单个字节 |
ReadInt16 | 从非托管内存中读取单个 16 位带符号整数 |
WriteByte | 将单字节写入非托管内存 |
WriteInt16 | 将一个字符作为16位整数值写入非托管内存 |
SizeOf | 返回对象的非托管大小(以字节为单位) |
Json字符串解析
1 | string json_str = "{\"ip\":\"127.0.0.1\", |
JsonIPSetting 类定义:
1 | class JsonIPSetting |
因为想要对输入做一些检查,所以在组Json生成Json string的时候就没有那么方便了。
1 | JsonIPSetting ip = new JsonIPSetting(); |
新建线程
1 | void test() |
带参数传递的线程:
1 | void test() |
打开FileDialog选择文件
1 | OpenFileDialog openFileDialog = new OpenFileDialog(); |
加载图片文件并显示
1 | // 显示控件:PictureBox, Name: pb_img |
PictureBox 属性设置:SizeMode - StretchImage,拉伸自适应控件大小;BorderStyle - FixedSingle,无图片的时候显示边框会好看一些。
异步加载时的委托函数
1 | // Windows.From |
1 | // WPF |
DataGridView
样式
每列Title直接在属性的Columns集合中添加就好了,每列的属性可以在弹出的编辑框中设置。
添加数据
1 | int index = dataGridView1.Rows.Add(); |
添加右键菜单
在设计界面中添加ContexMenuStrip,在其中的Items集合添加选项。
1 | private void dataGridView1_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e) |
右键删除行
向Items中添加选项,更改Text为”删除“,绑定Click时间函数为”deleteMenuItem_Click“。
1 | private void deleteMenuItem_Click(object sender, EventArgs e) |
操作Excel表格
NPOI是一个开源的C#读写Excel、WORD等微软OLE2组件文档的项目,NPOI可以在没有安装Office的情况下对Word或Excel文档进行读写操作。
环境搭建
在 Visual Studio 中,项目/解决方案右键 > 管理 NuGet 程序包 > 在“浏览”中搜索“NPOI”,选择安装。
导入
1 | IWorkbook book = new XSSFWorkbook("FilePath"); |
导出
1 | IWorkbook workbook = new XSSFWorkbook(); |
串口操作
1 | public partial class Form1 : Form |
WPF
操作 | 代码 |
---|---|
指定启动界面 | App.xaml中修改StartupUri |
布局-基础属性
属性 | 说明 | 参数 |
---|---|---|
Width | 控件宽 | 数字,默认单位px |
Height | 控件高 | 数字,默认单位px |
Loaded | 加载(仅用于Window) | 绑定函数 |
Closed | 关闭(仅用于Window) | 绑定函数 |
x:Name | 命名 | String |
Padding | 填充 | “10”/“10 20”(左右 上下)/“10 20 30 40”(左上右下) |
Margin | 边白 | 同上 |
VerticalAlignment | 垂直对齐 | Top/Bottom/Center/Stretch(默认:填充) |
HorizontalAlignment | 水平对齐 | Left/Center/Right/Stretch(默认:填充) |
Click | 单击事件响应 | 绑定函数 |
FontSize | 字体大小 | 数值 |
FontFamily | 字体样式 | |
Opacity | 透明度 | 0-1.0 |
布局-Grid
1 | <!-- *.xaml --> |
以上,使用Grid建立了一个2行2列的布局,第1行放置了两个控件,第2行放置了一个跨2列的控件。
布局-数据管数字显示
使用DSEG7 Classic Mini字体,来显示数码管效果的数字。
在项目中新建/Resources/Font/目录,将DSEG7字体文件添加到路径下,以4位数字为例:
1 | <TextBlock Text="{Binding Hour, FallbackValue=0000, StringFormat=00}" |
Button样式模板
以Button为例,如果多个控件的效果相同,则可以声明一个Style,对多个Button应用相同的样式。
1 | <!-- *.xaml --> |
显示表格
样式:
1 | <!-- *.xaml --> |
代码:
1 | // 声明 |
状态栏显示操作结果
1 | <!-- *.xaml --> |
1 | private void statusUpdate(string cmd, string cmdRet) |
窗口跳转
1 | private void jump_Click(object sender, RoutedEventArgs e) |