在WPF里,去塑造一个高效率且直观的车间监控界面,重点在于妥善处理好数据,以及布局,还有实时性这三者的结合。
项目背景与核心需求
在MES系统里,车间监控界面是生产管理的视觉关键所在,它得直接展现车间的实时运行状况呈现状态,务必达成一眼就让管理人员把控整体局面的效果,就显示内容而言,一般涵盖车间名字这一信息,还有机台总数这一数目的体现,以及正在作业中的机台数量,等待作业的机台数量,出现故障的机台数量,处于停机状态的机台数量,这些实时数据是用来开展生产调度以及实施问题干预的直接凭借依据。
定义车间数据模型
public class Workshop
{
public string Name { get; set; }
public int WorkingCount { get; set; }
public int WaitingCount { get; set; }
public int FaultCount { get; set; }
public int StoppedCount { get; set; }
public int TotalCount
{
get
{
return WorkingCount + WaitingCount + FaultCount + StoppedCount;
}
}
}
定义清晰可辨的数据结构,乃是构建界面的起始步骤。我们能够制作一个称作Workshop的C#类,这个带有一系列属性之种类(如用来表示车间称谓的Name等如此这般属于相关定义而不重复列出)。其中举例而言的属性有Name(车间名称)、TotalMachines(机台总数),还有RunningCount、WaitingCount、FaultCount、IdleCount等,它们各自皆相对应于各类状态的机台数量。此模型是后续所有数据绑定以及界面展示的根基所在。
当模型完成定义之后,我们所需的是一个用于管理涵盖所有车间的信息的数据集合,一般而言,会运用ObservableCollection。
数据初始化与获取
public class WorkshopDataInitializer
{
public List InitializeWorkshops()
{
return new List
{
new Workshop
{
Name = "贴片车间",
WorkingCount = 10,
WaitingCount = 5,
FaultCount = 2,
StoppedCount = 3
},
new Workshop
{
Name = "装配车间",
WorkingCount = 15,
WaitingCount = 3,
FaultCount = 1,
StoppedCount = 2
},
new Workshop
{
Name = "检测车间",
WorkingCount = 8,
WaitingCount = 4,
FaultCount = 1,
StoppedCount = 3
},
new Workshop
{
Name = "包装车间",
WorkingCount = 12,
WaitingCount = 6,
FaultCount = 0,
StoppedCount = 2
}
};
}
}
数据初始化一般是在程序开启或者界面加载之际予以开展,数据的源头能够是本地数据库、文件,亦或是借助HTTP请求去调用后台的Web API接口,比如说,我们能够于ViewModel的构造函数当中,去调用一个名为LoadWorkshopDataAsync的方法,此方法会从服务器那儿获取最为新颖的车间状态数据列表。
得到数据之后,把它赋予给先前定义的ObservableCollection 。
界面整体布局设计
WPF页面布局具备相当高的灵活性,要达成所有车间信息于一体内水平排列这一目的,UniformGrid控件不失为一个理想之选,和常规定义行列的Grid各有不同,UniformGrid仅需设置将Rows设为"1",它便会自动把所有子控件均匀排列身处同 一行当中,并且能够依据子项数量自行调节宽度 。
把UniformGrid控件的ItemsSource属性,同我们的车间数据集合进行绑定。然而,仅仅直接绑定集合是不可以的,原因在于我们要对每个车间数据的显示样式加以控制。在这个时候,针对每个车间数据项,我们要定义一个可视化的展现模板,以此告知WPF怎样去绘制每一个Workshop对象。
定义数据项显示模板
借由ItemTemplate,我们对每个车间之显示样式展开了定义。于XAML里,运用DataTemplate去设计此模板。该模板内部能够借助一个Border予以包裹,其内部进而运用StackPanel来将各个信息块作垂直排列 。
我们能够在StackPanel之内,放置好多TextBlock控件,这些控件可分别用于展现车间名称以及各状态机台数量。关键的步骤在于,借助Binding语法,把TextBlock的Text属性,绑定至数据模型的相应属性之上啦,像{Binding Name}、{Binding RunningCount}这样。如此一来,每个数据项将会依照这个模板去进行渲染哦。
实现数据绑定与动态列表
首先,要把数据、模板以及布局相互结合统一起来,这就需要运用ItemsControl控件。接着,要把ItemsControl的ItemsSource属性绑定到车间数据集合上。然后,要把它的ItemsPanel属性设定为之前定义好的UniformGrid布局。最后,要把ItemTemplate属性设置成我们精心设计出来的数据模板。
达成这些绑定之后,在程序开始运行时,ItemsControl会依据数据集合当中的车间数量,自行生成对应数量的子项。每一个子项都会运用统一的DataTemplate予以渲染,并且会整齐地排列在UniformGrid的唯一那一行之中。任何集合数据的更新都会即刻在界面上体现出来。
数据实时更新与界面刷新
要达成实时更新,其核心之处在于数据源会进行动态变化。除了按照一定间隔从服务端去拉取新的数据之外,更为高效的一种方式是借助双向绑定以及属性变更通知。要保证Workshop类达成了INotifyPropertyChanged接口,如此一来,当某一个车间的FaultCount属性值发生了改变的时候,绑定了这个属性的界面元素便会自动实现更新。
如前所述,针对整个集合进行刷新时,运用ObservableCollection,确保集合内项的增加或者移除,能够触发界面的重绘。结合后台服务,或者定时器持续更新模型数据情况下,一个可以实时反映车间生产状态的监控界面,就构建完成了。
于您而言,在进行 MES 系统开发之际,除去实时状态监控之外,您觉得紧接着最应当优先达成的车间管理功能究竟是什么呢?欢迎于评论区去分享您的看法,要是本文对您存有帮助,同样请点赞予以支持。