小言_互联网的博客

C#上位机开发(五)——SerialAssistant界面升级(WinForm界面布局进阶)

448人阅读  评论(0)

前言

早在18年,博主第一次开始写博客,内容为 C# 上位机开发,写完后收获了不错的阅读量和好评:

这个系列存在的问题就是没有进行界面布局,所有的控件都是固定位置,所以时隔多年,再次利用空闲时间学习WinForm如何进行界面控件布局。

Github开源仓库:https://github.com/Mculover666/SerialAssistant

一、使用Anchor属性进行布局

1. Anchor属性

Anchor意味锚点,可以将控件设置到某个固定的位置,随着窗口大小的改变,控制在窗口中的相对位置不变

2. 演示示例

控件位于右上角/左上角/右下角/左下角

设置Anchor属性锚点在上侧和右侧,意味着控件相对于父控件,上侧和右侧的位置不变

运行效果如下:

控件水平居中/垂直居中

首先将控件放置于水平居中位置:

点击后控件自动位于水平居中位置,接着设置Anchor属性,取消左右锚点,只设置上侧锚点:

这样控件一直位于水平居中位置:

同理,控件垂直居中只需要设置左侧或者右侧的锚点,取消上侧和下侧的锚点即可。

控件水平垂直都居中只需要取消上下左右所有的锚点即可。

控件水平拉伸/垂直拉伸

设置Anchor属性,设置上侧锚点以及左右锚点:

演示效果如下:

二、使用Dock属性进行布局

1. Dock属性

Dock意味停靠,可以将控件停靠到某一侧或者中央

2. 演示示例

使面板(Panel)停靠在某一侧(上/下/左/右/中)

在窗口中添加一个Panel,此时Panel的父控件是窗口(From),为了方便查看Panel的大小和位置,先给panel设置一个背景颜色,然后设置 Dock 属性为上侧停靠:

运行结果如图:

同样,可以设置其停靠在上/下/左/右中的某一侧。

设置为中间(Fill)时,会将整个父控件填满:

多个panel使用Dock布局

按照panel1至panel5的顺序依次添加panel,并设置Dock属性,如图:

因为panel4的添加在panel2和panel3之后,所以就添加在了剩余空间的底部

如果换一种顺序添加,则又是另一种效果,如图:

所以在使用Dock属性时,一定要注意添加控件的先后顺序。

当界面大小变化时:

  • 停靠在左右侧的控件:长度不变,高度会动态拉伸;
  • 停靠在上下侧的控件:长度会动态拉伸,高度不变;
  • 停靠在中心的控件(Fill):会填充整个空白区域;

窗口大小动态变化效果如图:

三、嵌套布局

在实际软件开发的时候,如果使用布局器,我们应该按照从大往小的思路来布局,注意两点即可:

Anchor属性和Dock属性是相对父控件而言的,所以可以进行嵌套

Anchor属性和Dock属性只能二选一,不能同时使用

接下来我们以串口助手为例,设计一个界面。

1. 区域划分设计


界面设计需求为:

  • 状态栏:窗口变化时固定在底部不动;
  • 左侧串口设置界面、接收设置界面、发送设置界面:窗口变化时,固定在左侧不动;
  • 右侧串口发送区:窗口变化时,可以跟随右侧伸长,但高度不变;
  • 右侧串口接收区:窗口变化时,可以跟随右侧和下侧伸长,填充整个空白区域;

2. 设计思路与实现

2.1. 最顶层的三个大区划分

首先划分为三个大块:

接着分别在panel2中嵌套,组合出设置界面;在panel3中嵌套,组合出发送数据和接收数据界面。

实现如下:

窗口动态变化时,效果如下:

2.2. 左侧设置区设计

左侧设置区分为三个区:串口设置区,接收设置区,发送设置区。

特别说明:串口设置区,接收设置区,发送设置区应该使用GroupBox控件,可以在左上角显示名称,效果要优于使用panel,效果如图:

这三个区在界面动态变化时并不需要变化,所以简单添加三个Panel即可,默认会设置Anchor属性为左上。

窗口动态变化时界面效果如图:

2.2.1. 串口设置区界面

串口设置区中只有Label和ComboBox,在界面动态变化时并不需要变化,所以简单的拖放即可,默认会设置Anchor属性为左上。

在设计对齐的时候可以借助设计器提供的对齐工具来完成:

2.2.2. 接受设置区界面和发送设置区界面

同理,拖放就OK。

2.3. 右侧数据区设计

右侧数据区包括串口接收数据区和串口发送数据区,在之前设计绿色这块窗口时,已经设置了相对于父控件(窗口Form)的Dock属性为Fill,所以在动态变化时,绿色窗口会永远填满窗口

2.3.1. 右侧数据区划分

在一些场景下,我们也需要将串口发送数据区放大一点,这个时候就需要用到splitContainer这个容器,它提供了动态的两个Panel,但是两个panel间分离,可以由用户调整大小。

拖入一个该控件放入绿色框中,填满整个区域,设置属性为垂直分离:

再分别给内部的panel1和panel2设置不同的颜色,运行程序,可以看到效果:

放大之后再看效果,简直完美:

用户改变两个缓冲区的大小:

实验完毕后,取消两个内置panel的颜色,接着下面的设计:

2.3.2. 串口数据接收区

串口数据接收区使用TextBox,并开启多行显示:

接着拖动TextBox的大小,填满整个父控件(内置Panel1),然后设置Anchor属性为上下左右:

2.3.3. 串口数据发送区

串口数据发送区使用TextBox,并开启多行显示,同时还要再设置一个发送按钮,再添加一个comboBox用于记录历史发送。

拖放好发送按钮的位置,设置为只向右侧相对位置不变:

然后再拖放好TextBox的位置,设置Anchor属性为上下左右都不变,这样当窗口变化时,TextBox就会拉伸填充了:

最后拖放好ComBox的位置,设置Anchor属性为左侧、右侧、下侧有锚点,这样当窗口变化时,可以跟随底部变化,并且进行水平拉伸:

至此,串口助手界面搞定,查看一下效果:

最大化窗口,看看效果:

非常完美!

再修改属性,显示滚动条:

另一个发送文本框操作同理。

2.4. 底部状态栏设计

底部状态栏设计的信息主要有:

  • 当前状态
  • 接收字节数
  • 发送字节数
  • 作者信息
  • 版本信息

其中状态信息单独设置一个panel,里面用标签Label即可,设置Dock属性在Left即可;

版本信息也单独设置一个panel,里面添加一个linkLabel,设置Dock属性在Right即可;

接收字节数和发送字节数统一放在一个panel中,panel设置Dock属性为Fill:

至此,串口助手设置完成。


转载:https://blog.csdn.net/Mculover666/article/details/116483736
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场