勇哥注:
用户自定义界面用途非常广泛,其原理有点小神秘,本篇勇哥来聊聊这个话题。
什么是用户自定义界面呢?
首先我们看下VS的winform面板编辑器,它可以看做是一个用户自定义界面。
如下图所示:
用户左边拖控件,拖到form上,可以排放位置。选中控件,还可以在右边设置它的属性。
另一个例子是HMI的编辑器。
这个跟vs的form编辑器效果是一样的。
还有组态软件的编辑器,除了上面两者的功能外,它还可以连线。以此来表示运行流程。
在视觉软件中,使用流程图来表示测量逻辑,例如下面是凌云软件的流程编辑器的效果。
这种跟组态软件是类以的,只是它更复杂,有自己的一些特点:例如元件的规整化、整体收缩和展开等。
以上这些都属于自定义用户界面。它最基本的功能(或者说是共性的功能)我们总结一下:
1。 可以在一块画布上摆放控件
2。 控件都可以配置属性
3。 控件摆放设计完成后,可以运行起来,用户可以看到并操作这个界面。
对于前两种功能,恐怕人人都可以写出来。
难点在于第3点。
我们以vs的那个winform编辑器来说,当你摆放好控件后,你得编译修改的内容,它才可以run起来,然后用户可以看到并操作界面。
那怎么样让你的界面run起来呢?
你可能会想到,这是不是用C#调用 Roslyn(.NET Compiler Platform)来动态编译代码来实现?
如果你这样想,那就闯到无人区了,Roslyn动态编译这个,B站少有人提起,短时间恐怕是搞不定的。
其实,不要想复杂了,按勇哥说的原理就可以实现:
1。 拖控件这个,你只用把控件拖进panel中去就可以了,通过一些事件,你可以移动这些控件,包括调整它们的大小
因为panel是个容器,你拖C#的控件,或者自定义控件进去也是可以的。
2。 那我设计的这个页面,怎么更新到主界面上呢?
你可以把你的页面编辑结果序列化到磁盘上,然后在主界面上也弄个panel,再把数据读出来回显到panel里就行了。
或者你也可以把你设计页面的那个form,嵌入到主界面的一个容器里去。
3。 怎么让界面点击有功能效果。
因为你的程序在运行中,那么直接点击你的界面上的控件就有效果。
这些控件与它关联的事件代码中,已经包含了你事先准备好的逻辑了。
下面是勇哥写的一个小演示:
我们正是利用了C#的控件及期事件,才避免了复杂的GDI+代码。
至于像组态编辑器那样的自定义控件,我们都让它继承C#的控件基类就可以了,所以它还是算C#的控件。
至于组态的编辑器,它的连接线,就非得GDI来绘制了。而且还不容易,比如你得考虑画面控件移动的时候,连接线还得跟着移动。
可能还要考虑画布滚屏的功能。
如果控件本身+连接线都是GDI做的,我们就没办法利用上控件自身的功能了,控件的绘制与事件都得自己去弄了。
这个又可以难倒一大片人了。

