wpf组态图相关技术
1 此组态图主要是用于地铁能耗管理
组态图主要是能够通过图片或者lable等代表实际的控件(如电表等),且操作界面和visio相似,最终画完的图的xml保存在数据库中,其他程序读取xml,在程序当中画图,通过图来显示相关控件的状态以及数据的实时显示。
下图是组态图
2 在程序当中通过xml来画图,自己控制相关的状态变化和数据的显示
3 相关代码
3.1 组态图中涉及到实际的数据库中的表,地铁线站的,其中最主要的就是图片和图片组。下面是图片和图片组的建表代码
CREATE TABLE `WD_ImageGroup` (
`groupid` int(11) NOT NULL AUTO_INCREMENT,
`groupName` varchar(45) DEFAULT NULL,
`instruction` varchar(1000) DEFAULT NULL,
PRIMARY KEY (`groupid`)
)
CREATE TABLE `WD_Images` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`imageName` varchar(45) NOT NULL COMMENT '图片名',
`imageType` varchar(45) NOT NULL COMMENT '图片类型',
`instruction` varchar(1000) DEFAULT NULL COMMENT '图片的相关说明',
`groupid` int(11) NOT NULL COMMENT '图片所在组',
PRIMARY KEY (`id`)
)
3.2 程序当中根据xml画图的主要程序如下,在wpf中是在下面的容器中画图的:
<ScrollViewer Grid.Row="1" Grid.Column="1" BorderBrush="Red" BorderThickness="2" HorizontalScrollBarVisibility="Auto" Name="sv1">
<Viewbox Name="lv" >
<Grid Name="dockPanel_Data" ></Grid>
</Viewbox>
</ScrollViewer>
xml的主要画图程序:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Xml.Linq;
using System.Xml;
using System.Windows;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Data;
using System.Xml.Linq;
using System.Windows.Controls;
namespace WPFUtilControl
{
public class CommDraw
{
//读取xml中的数据,将节点保存在nodeTable中,将连线保存在lineTable中
//画图控件命名标准:如果是数据库中的控件,那么在画图时控件的Name是:数据表+ID 如:东直门进线201表 Name:wd_meter11
//Tag中如果有值的话,保存的是控件所在的表;线的命名规则:相连两个控件的id之间带上下划线:如wd_meter11_wd_meter12
private DataTable nodeTable = new DataTable();
private DataTable lineTable = new DataTable();
private string Height, Width, Background;
private void iniTables()
{
#region 初始化nodeTable
nodeTable.Columns.Add("Name", Type.GetType("System.String"));
//设备类型
nodeTable.Columns.Add("Type", Type.GetType("System.String"));
//控件类型
nodeTable.Columns.Add("Table", Type.GetType("System.String"));
nodeTable.Columns.Add("columnValue", Type.GetType("System.String"));
nodeTable.Columns.Add("ControlType", Type.GetType("System.String"));
nodeTable.Columns.Add("Height", Type.GetType("System.String"));
nodeTable.Columns.Add("Width", Type.GetType("System.String"));
nodeTable.Columns.Add("Left", Type.GetType("System.String"));
nodeTable.Columns.Add("Top", Type.GetType("System.String"));
nodeTable.Columns.Add("Place", Type.GetType("System.String"));
nodeTable.Columns.Add("Color", Type.GetType("System.String"));
nodeTable.Columns.Add("Text", Type.GetType("System.String"));
nodeTable.Columns.Add("FontSize", Type.GetType("System.String"));
nodeTable.Columns.Add("zIndex", Type.GetType("System.String"));
nodeTable.Columns.Add("BorderThickness", Type.GetType("System.String"));
#endregion
#region 初始化lineTable
lineTable.Columns.Add("SourceName", Type.GetType("System.String"));
lineTable.Columns.Add("Linkname", Type.GetType("System.String"));
lineTable.Columns.Add("Startname", Type.GetType("System.String"));
lineTable.Columns.Add("EndName", Type.GetType("System.String"));
lineTable.Columns.Add("Stroke", Type.GetType("System.String"));
lineTable.Columns.Add("StrokeThickness", Type.GetType("System.String"));
lineTable.Columns.Add("zIndex", Type.GetType("System.String"));
#endregion
}
private void loadXML(XElement xelement)
{
XElement root = xelement;
nodeTable.Clear();
lineTable.Clear();
if (root == null)
return;
XElement CommonXML = root.Elements("CommonInfo").First();
Height = CommonXML.Element("Height").Value.ToString();
Width = CommonXML.Element("Width").Value.ToString();
Background = CommonXML.Element("Background").Value.ToString();
IEnumerable<XElement> itemsXML = root.Elements("DesignerItems").Elements("DesignerItem");
foreach (XElement itemXML in itemsXML)
{
DataRow dr = nodeTable.NewRow();
dr["Name"] = itemXML.Element("Name").Value.ToString();
dr["Type"] = itemXML.Element("Type").Value;
dr["Table"] = itemXML.Element("Table").Value.ToString();
dr["columnValue"] = itemXML.Element("columnValue").Value;
dr["ControlType"] = itemXML.Element("ControlType").Value;
dr["Height"] = itemXML.Element("Height").Value;
dr["Width"] = itemXML.Element("Width").Value;
dr["Left"] = itemXML.Element("Left").Value;
dr["Top"] = itemXML.Element("Top").Value;
dr["Color"] = itemXML.Element("Color").Value;
XmlDocument xd = new XmlDocument();
xd.LoadXml(itemXML.Element("Content").Value);
if (dr["Type"].ToString() == "Image")
dr["Place"] = xd.FirstChild.Attributes["Tag"].Value;
dr["Text"] = itemXML.Element("Text").Value;
dr["FontSize"] = itemXML.Element("FontSize").Value;