开源纯C#工控网关+组态软件(六)图元组件

一、   图元概述

图元是构成人机界面的基本单元。如一个个的电机、设备、数据显示、仪表盘,都是图元。构建人机界面的过程就是铺排、挪移、定位图元的过程。

图元设计是绘图和编码的结合。因为图元不仅有显示和动画,还有背后操纵动画的控制逻辑。

一个好的图元设计框架,应该最大限度提高设计的效率和专业程度。

因为你找到一个会做美工的码农,和会写代码的美工,都很困难,但是单独找码农和绘图员却一抓一大把。所以专业性意味着用人的灵活性,和省钱。而你招来一个美工,一个码农,合作完成一个图元组件,必须考虑减少两人的交互,最好埋头各干各的。并行作业,才有最高效率。

可以通过以下手段提高界面开发效率:

  • 前后端分离。

前后端分离的设计模式有很多优点。前后端对设计者的要求是不同的。。

前端设计者需要考虑的是界面更直观、美观、清晰、大气,可以熟练使用绘图工具(例如Blend),可以不会编程。

后端设计者要考虑的是业务逻辑,如何有条不紊、准确执行。可以不会画图,但一般必然熟练编码,使用设计工具(如Visual Studio)。

前后端分离便于设计者术业有专攻,前后端分工协作,互不干扰,并行工作,提高效率。

  • 专业的前端设计工具。

对于绘图员或美工,一个简单易用、同时又有强大功能的趁手设计器是必须的。

绘图板、动画、整合、调色板,美工的全套装备必须齐全;网格定位、缩放、旋转、保存、撤销,常规的设计器功能必须应有尽有。

  • 尽可能少的编码。

很多行业都有庞大的图元库。各种设备、开关、构件,各种非标组件,不断会有新的图元入库。

因此,力求用最少的代码实现尽可能多的功能,最大限度提升开发效率。一个强大的基类和一个方便的继承是必要的。

二、   前后端分离的设计模式式

  • 通过WPF实现前后端分离

看看百度百科对WPF的介绍:WPF(Windows Presentation Foundation)是微软推出的基于Windows 的用户界面框架,属于.NET Framework 3.0的一部分。

它提供了统一的编程模型、语言和框架,真正做到了分离界面设计人员与开发人员的工作;同时它提供了全新的多媒体交互用户图形界面。

WPF通过一种MVVM(Model-View-ViewMode)的设计模式实现界面与编码解耦。界面元素的颜色、动画、形状,可以方便的与代码类的属性绑定(Binding)。

绑定的便利在于,后台类的某属性变化,马上会自动反映到界面的变化,无需编写代码;界面元素的变化,也马上会触发属性值的改变,这种方式天然适合人机界面的前后端分离设计。

同时,WPF提供XAML文件,是一种声明式编程方式,类似于Android的界面文件、HTML,界面设计者与代码编写者只需要通过XAML文件交互,进一步达成前后端分离并行作业的目的。

  •  前后端交互的内容

绘图员的工作:

使用Blend绘图,使用故事板(Storyboard)制作动画,定义动画的视图状态(VisualState),绑定属性如:

Text="{Binding BinName, RelativeSource={RelativeSource TemplatedParent}}"

码农的工作:

定义一个CustomControl。继承HMIControlBase。

定义依赖项属性如Running:

            public static readonly DependencyProperty RunningProperty = DependencyProperty.Register("Running", typeof(bool), typeof(Elevator),            new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.AffectsRender,            new PropertyChangedCallback(OnValueChanged)));

属性变化事件切换视图状态如

VisualStateManager.GoToState(this, _funcRun () ? "Run" : "Stop", true);

就这么简单。

三、   绘图与动画

  • 强大的设计工具:Blend

Blend是VS2010起微软提供的专业设计工具。早期曾经有三贱客(Blend,Design, Encoder ),后两者已经合并入Blend。

在 Expression Blend 中,可以在美工板上绘制形状、路径和控件,然后修改其外观和行为,从而直观地设计界面元素。可以导入图像、视频和声音,还可以导入和更改三维对象。

可以创建Storyboard实现帧动画,定义状态(VisualState),并设计触发器(Trigger)触发动画。还可以定义样式(Style)。

Blend对美工人员是简单易上手的。按我的经验,对于习惯AutoCAD工具的绘图工程师,熟练掌握Blend一般在两周内,就可以绘制复杂的动画图形。

所有的图元组件均为CustomControl类型,这样编辑好的图元文件会自动加入到Generic.xaml文件。相应的图元模板可在Blend内重新编辑。

 

  • 用代码实现动画

如果不用Blend,也可以用代码直接实现动画。部分对性能要求高、使用频繁的图元组件如Guage,LinkLine,可以继承Control的OnRender方法并使用StreamGeometry这类的底层API绘图,以达到最佳的性能。

StreamGeometry的优点是调用底层绘图API,不生成多余的对象,而Blend在生成图形过程中有大量冗余元素和对象,复杂的层次结构,在对性能要求较高的场合略显笨重。

四、   强大的图元基类

为了尽可能减少编码,需要在图元基类(HMIControlBase) 中实现尽可能多的功能;但又不能包办一切,牺牲图元自身的“个性”。要实现简洁、强大、可扩展。

因此,我在图元基类实现了所有界面元素共有的几个基本功能:

  • 连线。

为了实现方便的连线,需要能自行设置图元的锚点,作为拖放连线的连接点。

 

继承GetLinkPositions方法,锚点分上下左右四个,每个锚点用一个Point确定相对位置。如果只有一个锚点,就返回单一的LinkPosition如下:

  public override LinkPosition[] GetLinkPositions(){           
 return new LinkPosition[1]{ new LinkPosition(new Point(0.75,0),ConnectOrientation.Top),};}


  • 绑定变量表达式。

只要继承基类,就可以弹出变量组态界面。

 

可以自行定义左边的属性树。即继承GetActions方法。注意这个树状结构支持嵌套,如某设备带两个电机(Motor),则电机的属性列表会作为树的子节点显示。

public override string[] GetActions(){           
 return new string[] { TagActions.VISIBLE, TagActions.CAPTION,
 TagActions.RUN, TagActions.ALARM, TagActions.DEVICENAME };}
  • 动画显示。

继承SetTagReader方法,只要相关Tag变化,就会触发动画脚本。如


public override Action SetTagReader(string key, Delegate tagChanged)
{    switch (key){                case TagActions.RUN:          
         var _funcInRun = tagChanged as Func<bool>;        
                     if (_funcInRun != null){                    
                         return delegate {
                         VisualStateManager.GoToState(this, _funcInRun() ? "Running" : "NotRunning", true); };}                  
                  else return null;}            return base.SetTagReader(key, tagChanged);}


VisualStateManager.GoToState方法根据不同的状态字,触发了在Blend里定义的故事板动画。

五、   如何实现:增加新图元

图元设计流程:

 

六、   下面的计划

写一系列帖子,把架构、原理讲清楚。大致如下:

  • 网关层接口概述

  • 上下位机通讯原理

  • 如何实现一个设备驱动

  • 如何设计图元

  • VS插件模块及原理

  • 归档模块及文件格式

  • 如何进行功能扩展

  • 组态变量表达式实现

github地址:https://github.com/GavinYellow/SharpSCADA。QQ群:102486275

相关文章: 

  • .NET十年回顾

  • 开源纯C#工控网关+组态软件

  • 开源纯C#工控网关+组态软件(三)加入一个新驱动:西门子S7

  • 开源纯C#工控网关+组态软件(四)上下位机通讯原理

  • 开源纯C#工控网关+组态软件(五)从网关到人机界面

原文:http://www.cnblogs.com/evilcat/p/7909578.html


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/322758.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

git合并分支的策略(赞)

假设当前有两个分支 master和test&#xff0c;两个分支一模一样&#xff0c;都有这三个文件 现在test添加一个test4.txt&#xff0c;然后提交到本地&#xff08;git add . git commit&#xff09; 切换到master分支上&#xff0c;git checkout master git merge test 这样mase…

改造独立部署(SCD)模式下.NET Core应用程序 dotnet的exe文件启动过程

设置一个小目标 改造前 改造后 独立部署SCD模式&#xff0c;是指在使用dotnet publish 命令时带上-r 参数运行时标识符&#xff08;RID&#xff09;。 目标提出原因&#xff1a;SCD模式下文件太乱了&#xff0c;很多文件在开发时大多又涉及不到&#xff0c;发布后如果能把文件…

mybatis源码阅读(四):mapper(dao)实例化

转载自 mybatis源码阅读(四)&#xff1a;mapper(dao)实例化 在开始分析之前&#xff0c;先来了解一下这个模块中的核心组件之间的关系&#xff0c;如图&#xff1a; 1.MapperRegistry&MapperProxyFactory MapperRegistry是Mapper接口及其对应的代理对象工程的注册中心&…

自定义路由匹配和生成

前言 前两篇文章主要总结了CMS系统两个技术点在ASP.NET Core中的应用&#xff1a; 《ASP.NET Core 中的SEO优化&#xff08;1&#xff09;&#xff1a;中间件实现服务端静态化缓存》 《ASP.NET Core 中的SEO优化&#xff08;2&#xff09;&#xff1a;中间件中渲染Razor视图》…

如何封装并发布一个属于自己的ui组件库

以前就一直有个想法自己能不能封装一个类似于elementui一样的组件库&#xff0c;然后发布到npm上去&#xff0c;毕竟前端说白了&#xff0c;将组件v上去&#xff0c;然后进行数据交互。借助这次端午&#xff0c;终于有机会&#xff0c;尝试自己去封装发布组件库了 我这里了只做…

听云支持.NET Core的应用性能监控

随着微软于2017年8月正式发布.NET Core 2.0&#xff0c; .NET Core 社区开始活跃&#xff0c;众多.NET开发者开始向跨平台转变。 听云于2017年11月推出了.NET Core应用监控工具&#xff0c;和听云其他语言的监控工具一样&#xff0c;.NET Core应用监控工具具有以下特征&#xf…

mybatis源码阅读(五) ---执行器Executor

转载自 mybatis源码阅读(五) ---执行器Executor 1. Executor接口设计与类结构图 public interface Executor {ResultHandler NO_RESULT_HANDLER null;// 执行update&#xff0c;delete&#xff0c;insert三种类型的sql语句int update(MappedStatement ms, Object parameter…

[52ABP实战系列] .NET CORE实战入门第三章更新了

早安 各位道友好&#xff0c;.NET CORE入门视频的第三章也算录制完毕了。欢迎大家上传课网进行学习。 更新速度 大家也知道最近的社会新闻比较多。频繁发生404、关键字打不出来&#xff0c;我个人也在关注这些事件。导致精力分散&#xff0c;没有做到稳定更新&#xff0c;现在呢…

如何安装nuxt

因为vue是单页面应用&#xff0c;所以不被Seo&#xff0c;如百度和Google抓取到&#xff0c;在Vue中如果想要爬虫爬到就必须使用nuxt 那么如何安装使用呢&#xff1f; yarn create nuxt-app <project-name> cd <project-name> yarn build yarn start必须先build&a…

mybatis源码阅读(六) ---StatementHandler了解一下

转载自 mybatis源码阅读(六) ---StatementHandler了解一下 StatementHandler类结构图与接口设计 BaseStatementHandler&#xff1a;一个抽象类&#xff0c;只是实现了一些不涉及具体操作的方法 RoutingStatementHandler&#xff1a;类似路由器&#xff0c;根据配置文件来路由…

基于OIDC(OpenID Connect)的SSO(纯JS客户端)

在上一篇基于OIDC的SSO的中涉及到了4个Web站点&#xff1a; oidc-server.dev&#xff1a;利用oidc实现的统一认证和授权中心&#xff0c;SSO站点。 oidc-client-hybrid.dev&#xff1a;oidc的一个客户端&#xff0c;采用hybrid模式。 oidc-client-implicit.dev&#xff1a;od…

IIS中的 Asp.Net Core 和 dotnet watch

在基于传统的.NET Framework的Asp.Net Mvc的时候&#xff0c;本地开发环境中可以在IIS中建立一个站点&#xff0c;可以直接把站点的目录指向asp.net mvc的项目的根目录。然后build一下就可以在浏览器里面刷新到最新的修改了&#xff0c;也可以附加到w3wp的进程进行调试。但是在…

foreach方法使用

用法 foreach方法主要是针对数组而言的&#xff0c;对数组中的每个元素可以执行一次方法 var array [a, b, c, e]; array.forEach((a)> {console.log(a); });属性 foreach方法主要有三个参数&#xff0c;分别是数组内容、数组索引、整个数组 var array [a, b, c, e]; arra…

.NET Core 控制台程序读 appsettings.json 、注依赖、配日志、设 IOptions

.NET Core 控制台程序没有 ASP.NET Core 的 IWebHostBuilder 与 Startup.cs &#xff0c;那要读 appsettings.json、注依赖、配日志、设 IOptions 该怎么办呢&#xff1f;因为这些操作与 ASP.NET Core 无依赖&#xff0c;所以可以自己动手&#xff0c;轻松搞定。 1、读 appsett…

Object.keys方法拿到对象的key值

项目中的高级搜索选项用到了Object.keys方法&#xff0c; 那么它是用来干嘛的呢&#xff1a;删除某个子对象里的数据 var anObj { aaa: kejin,bbb: shenxian,ccc: yuanshan };let params {...anObj,ddd: luanwu } console.log(params) console.log(Object.keys(anObj)); // …

jsdiff 比较文本内容差异

翻译自 jsdiff JavaScript文本内容差异实现。 基于"An O(ND) Difference Algorithm and its Variations" (Myers, 1986) 中提出的算法 。 安装 npm install diff --save API Diff.diffChars(oldStr, newStr[, options]) -区分两个文本块&#xff0c;逐字符比较。…

Net Core下多种ORM框架特性及性能对比

在.NET Framework下有许多ORM框架&#xff0c;最著名的无外乎是Entity Framework&#xff0c;它拥有悠久的历史以及便捷的语法&#xff0c;在占有率上一路领先。但随着Dapper的出现&#xff0c;它的地位受到了威胁&#xff0c;本文对比了在.NET Core下 两种框架的表现以及与原生…

从ThoughtWorks 2017技术雷达看微软技术

ThoughtWorks在每年都会出品两期技术雷达&#xff0c;这是一份关于技术趋势的报告&#xff0c;它比起一些我们能在市面上见到的其他各种技术行情和预测报告&#xff0c;更加具体&#xff0c;更具可操作性&#xff0c;因为它不仅涉及到新技术大趋势&#xff0c;比如云平台和大数…

Spark入门(一)单主standalone安装

一、集群安装条件前置 实验spark安装在【Hadoop入门&#xff08;二&#xff09;集群安装】机器上&#xff0c; 已完成安装jdk,hadoop和ssh、网络等配置环境等。 spark所依赖的虚拟机和操作系统配置 环境&#xff1a;ubuntu14 spark-2.4.4-bin-hadoop2.6jdk1.8ssh 虚拟机&a…

AutoMapper在asp.netcore中的使用

automapper 是.net 项目中针对模型之间转换映射的一个很好用的工具&#xff0c;不仅提高了开发的效率还使代码更加简洁&#xff0c;当然也是开源的&#xff0c;https://github.com/AutoMapper&#xff0c;这不多做介绍&#xff0c;详细看&#xff0c;官网下面是介绍它在 .net c…