diff --git a/ConvertMoels/BoolToVisidilityConvert.cs b/ConvertMoels/BoolToVisidilityConvert.cs new file mode 100644 index 0000000..f3b5ea0 --- /dev/null +++ b/ConvertMoels/BoolToVisidilityConvert.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Data; + +namespace SunlightCentralizedControlManagement_SCCM_.ConvertMoels +{ + internal class BoolToVisidilityConvert : IValueConverter + { + public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) + { + return (value is bool boolvalue && boolvalue) ? + Visibility.Visible: + Visibility.Collapsed; + } + + public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) + { + throw new NotImplementedException(); + } + + } +} diff --git a/ConvertMoels/StateToColorConvert.cs b/ConvertMoels/StateToColorConvert.cs index affad62..0be5ef3 100644 --- a/ConvertMoels/StateToColorConvert.cs +++ b/ConvertMoels/StateToColorConvert.cs @@ -23,7 +23,7 @@ namespace SunlightCentralizedControlManagement_SCCM_.ConvertMoels if (i == "201") return "#FF00FF00"; else if (i == "202") return "#FFFFFF00"; - else if (i == "309") return "#FFFF0000"; + else if (i == "309") return "#FFFFFFFF"; else if (i == "800") return "#FFFF0000"; else return "#FF000000"; } diff --git a/SunlightCentralizedControlManagement_SCCM_.csproj b/SunlightCentralizedControlManagement_SCCM_.csproj index 8c761e2..02150fb 100644 --- a/SunlightCentralizedControlManagement_SCCM_.csproj +++ b/SunlightCentralizedControlManagement_SCCM_.csproj @@ -102,6 +102,7 @@ + DispenseState.xaml @@ -140,6 +141,7 @@ + diff --git a/View/MonitorView.xaml b/View/MonitorView.xaml index 7096876..2929b2c 100644 --- a/View/MonitorView.xaml +++ b/View/MonitorView.xaml @@ -8,12 +8,13 @@ xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes" xmlns:rdp="clr-namespace:VncSharpWpf;assembly=VncSharpWpf" xmlns:viewmodel="clr-namespace:SunlightCentralizedControlManagement_SCCM_.ViewModel" - xmlns:ConvertMoels="clr-namespace:SunlightCentralizedControlManagement_SCCM_.ConvertMoels" - d:DataContext="{d:DesignInstance Type=viewmodel:MainWindowViewModel}" + xmlns:ConvertMoels="clr-namespace:SunlightCentralizedControlManagement_SCCM_.ConvertMoels" + d:DataContext="{d:DesignInstance Type=local:MonitorView}" mc:Ignorable="d" d:DesignHeight="1000" d:DesignWidth="1900"> + @@ -40,6 +41,9 @@ + + + @@ -91,7 +95,7 @@ - + @@ -103,9 +107,11 @@ HorizontalGridLinesBrush="#FFC9C9C9" VerticalGridLinesBrush="#FFC9C9C9" Background="White" GridLinesVisibility="All" ColumnHeaderHeight="40" HorizontalContentAlignment="Right" BorderBrush="{x:Null}" CanUserReorderColumns="False" CanUserSortColumns="False" CanUserResizeRows="False" CanUserResizeColumns="False" - CanUserDeleteRows="False" SelectionMode="Single" FontSize="15" Focusable="True" > - + CanUserDeleteRows="False" SelectionMode="Single" FontSize="15" Focusable="True" ContextMenuOpening="Gridstep_ContextMenuOpening"> + @@ -135,7 +150,7 @@ - + diff --git a/View/MonitorView.xaml.cs b/View/MonitorView.xaml.cs index 26a43e3..3a96aba 100644 --- a/View/MonitorView.xaml.cs +++ b/View/MonitorView.xaml.cs @@ -33,29 +33,48 @@ using System.Net.NetworkInformation; namespace SunlightCentralizedControlManagement_SCCM_.View { + /// /// MonitorView.xaml 的交互逻辑 /// - public partial class MonitorView : UserControl + public partial class MonitorView : UserControl, INotifyPropertyChanged { + public event PropertyChangedEventHandler PropertyChanged; + protected virtual void OnPropertyChanged(string propertyName) + { + if (PropertyChanged != null) + PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); + } + public void RaisePropertyChanged(string propertyName) + { + if (PropertyChanged != null) + { + if (propertyName != null) + { + PropertyChanged.Invoke(this, new PropertyChangedEventArgs(propertyName)); + } + } + } + public MonitorView() { - //DataContext = new MainWindowViewModel(); + DataContext = this; InitializeComponent(); CountDown(); machine= MainWindowViewModel.machine; workOrder= MainWindowViewModel.workOrder; dyelot= MainWindowViewModel.dyelot; machin_LOG.Text = MainWindowViewModel.machin_LOG; + IsInteractive = false; + DATA_view(); } - + private string machine; private string workOrder; private string dyelot; private int machines_info=0; public static string Sys_log; - private void Griddata_SelectionChanged(object sender, SelectionChangedEventArgs e)//设备列表 { Stop.IsEnabled = true; @@ -69,7 +88,9 @@ namespace SunlightCentralizedControlManagement_SCCM_.View Curve.IsEnabled = true; Screen.IsEnabled = true; Receipt.IsEnabled = true; - MainWindowViewModel.TechnologicalProcess_bool = true; + TechnologicalProcess_bool = true; + IsInteractive = false; + int rownum = Griddata.SelectedIndex;//获取鼠标选中行并定义变量 if (rownum != -1)//判断鼠标定位是否有效 { @@ -87,7 +108,7 @@ namespace SunlightCentralizedControlManagement_SCCM_.View private void Gridstep_SelectionChanged(object sender, SelectionChangedEventArgs e) { - MainWindowViewModel.TechnologicalProcess_bool = false; + TechnologicalProcess_bool = false; int rownum = Gridstep.SelectedIndex;//获取鼠标选中行并定义变量 if (rownum != -1)//判断鼠标定位是否有效 { @@ -191,6 +212,7 @@ namespace SunlightCentralizedControlManagement_SCCM_.View }//曲线 private void ListViewItem_Resume(object sender, MouseButtonEventArgs e) { + IsInteractive = false; if (!string.IsNullOrEmpty(machine)) { Dictionary dat_821 = new Dictionary(); @@ -209,10 +231,11 @@ namespace SunlightCentralizedControlManagement_SCCM_.View Resume.IsEnabled = false; Delete.IsEnabled = false; Jump.IsEnabled = false; - MainWindowViewModel.TechnologicalProcess_bool = true; + TechnologicalProcess_bool = true; }//恢复 private void ListViewItem_Paused(object sender, MouseButtonEventArgs e) { + IsInteractive = true; if (!string.IsNullOrEmpty(machine)) { Dictionary dat_821 = new Dictionary(); @@ -236,6 +259,7 @@ namespace SunlightCentralizedControlManagement_SCCM_.View }//暂停 private void ListViewItem_Stop(object sender, MouseButtonEventArgs e) { + IsInteractive = false; if (!string.IsNullOrEmpty(machine)) { Dictionary dat_821 = new Dictionary(); @@ -282,7 +306,7 @@ namespace SunlightCentralizedControlManagement_SCCM_.View DAT = "SC821" + MainWindowViewModel.Selet_Machines(MainWindowViewModel.Machines, "SYSKEY", "ID='" + index + "'") + dat_821.ToJsonString() }); - MainWindowViewModel.TechnologicalProcess_bool = true; + TechnologicalProcess_bool = true; } private void ListViewItem_Jump(object sender, MouseButtonEventArgs e) @@ -306,7 +330,7 @@ namespace SunlightCentralizedControlManagement_SCCM_.View DAT = "SC821" + MainWindowViewModel.Selet_Machines(MainWindowViewModel.Machines, "SYSKEY", "ID='" + index + "'") + dat_821.ToJsonString() }); - MainWindowViewModel.TechnologicalProcess_bool = true; + TechnologicalProcess_bool = true; }//跳步 private void ListViewItem_Insert(object sender, MouseButtonEventArgs e) { @@ -317,7 +341,7 @@ namespace SunlightCentralizedControlManagement_SCCM_.View }//插入 private void Insert_ButtonClicked(object sender, AddressUpdateEventArgs e)//cr返回结果 { - MainWindowViewModel.TechnologicalProcess_bool = true; + TechnologicalProcess_bool = true; Dictionary dat_821 = new Dictionary(); dat_821.Clear(); dat_821.Add("INSTRUCTION", "INSERT"); @@ -355,7 +379,7 @@ namespace SunlightCentralizedControlManagement_SCCM_.View DAT = "SC821" + MainWindowViewModel.Selet_Machines(MainWindowViewModel.Machines, "SYSKEY", "ID='" + index + "'") + dat_821.ToJsonString() }); - MainWindowViewModel.TechnologicalProcess_bool = true; + TechnologicalProcess_bool = true; } }//删除 string Numder = null; @@ -414,11 +438,11 @@ namespace SunlightCentralizedControlManagement_SCCM_.View DAT = "SC821" + MainWindowViewModel.Selet_Machines(MainWindowViewModel.Machines, "SYSKEY", "ID='" + index + "'") + dat_821.ToJsonString() }); - MainWindowViewModel.TechnologicalProcess_bool = true; + TechnologicalProcess_bool = true; } } } - + public void CountDown() { DispatcherTimer timer1s = new DispatcherTimer//初始化循环,每1秒调用一次Tick @@ -431,6 +455,7 @@ namespace SunlightCentralizedControlManagement_SCCM_.View int Time_D = 0; void Tick_Event_1S(object sender, EventArgs e)//Tick_Event周期执行事件1S { + DATA_view(); if (Paused.IsEnabled) { if (!Resume.IsEnabled) @@ -438,7 +463,7 @@ namespace SunlightCentralizedControlManagement_SCCM_.View Time_D++; if (Time_D > 10) { - MainWindowViewModel.TechnologicalProcess_bool = true; + TechnologicalProcess_bool = true; } } } @@ -496,8 +521,152 @@ namespace SunlightCentralizedControlManagement_SCCM_.View }//返回错误为空 } } - + + public string sys_machine; //显示log + public string Sys_machine //通知UI控件参数改变 + { + get { return sys_machine; } + set { sys_machine = value; OnPropertyChanged("Sys_machine"); } + } + bool _isInteractive; + public bool IsInteractive//步骤表交互选择 + { + get => _isInteractive; + set + { + _isInteractive = value; + OnPropertyChanged("IsInteractive"); + } + } + private void Gridstep_ContextMenuOpening(object sender, ContextMenuEventArgs e) + { + if(!IsInteractive) e.Handled = true;//阻止菜单显示 + } + public static bool TechnologicalProcess_bool = true; + private async void DATA_view()//IO显示 + { + await Task.Run(() => + { + try + { + TechnologicalMachine_View = ToObservableCollection(MainWindowViewModel.Machines); + } + catch (Exception) { } + try + { + if (MainWindowViewModel.dt_TP.Rows.Count >= 0) + { + if (TechnologicalProcess_bool) + { + TechnologicalProcess_View = ToObservableCollection(MainWindowViewModel.dt_TP); + + } + Sys_machine = MainWindowViewModel.MachineLOG; + } + } + catch (Exception) { } + }); + } + ObservableCollection technologicalProcess_View = new ObservableCollection(); + ObservableCollection technologicalMachine_View = new ObservableCollection(); + public ObservableCollection TechnologicalProcess_View + { + get { return technologicalProcess_View; } + set + { + technologicalProcess_View = value; + RaisePropertyChanged("TechnologicalProcess_View"); + } + } + + + public ObservableCollection TechnologicalMachine_View + { + get { return technologicalMachine_View; } + set + { + technologicalMachine_View = value; + RaisePropertyChanged("TechnologicalMachine_View"); + } + } + public class TechnologicalM + { + public string Name { get; set; } + public string WorkOrder { get; set; } + public string Dyelot { get; set; } + public string Temperature { get; set; } + public string WaterLevel { get; set; } + public string Process { get; set; } + public string Step { get; set; } + public string Message { get; set; } + public string State { get; set; } + + } + public class TechnologicalP + { + public int RUN { get; set; } + public string ProgramID { get; set; } + public string Program { get; set; } + public double Step { get; set; } + public string StepID { get; set; } + public string StepName { get; set; } + public string ParameterName { get; set; } + public string Parameter1 { get; set; } + public string Parameter2 { get; set; } + public string Parameter3 { get; set; } + public string Parameter4 { get; set; } + public string Parameter5 { get; set; } + public string DYELOT { get; set; } + } + + public ObservableCollection ToObservableCollection(DataTable dt) where T : class, new() + { + Type t = typeof(T); + PropertyInfo[] propertys = t.GetProperties(); + ObservableCollection lst = new ObservableCollection(); + string typeName = string.Empty; + foreach (DataRow dr in dt.Rows) + { + T entity = new T(); + foreach (PropertyInfo pi in propertys) + { + typeName = pi.Name; + if (dt.Columns.Contains(typeName)) + { + if (!pi.CanWrite) continue; + object value = dr[typeName]; + if (value == DBNull.Value) continue; + if (pi.PropertyType == typeof(string)) + { + pi.SetValue(entity, value.ToString(), null); + } + else if (pi.PropertyType == typeof(int) || pi.PropertyType == typeof(int?)) + { + pi.SetValue(entity, int.Parse(value.ToString()), null); + } + else if (pi.PropertyType == typeof(DateTime?) || pi.PropertyType == typeof(DateTime)) + { + pi.SetValue(entity, DateTime.Parse(value.ToString()), null); + } + else if (pi.PropertyType == typeof(float)) + { + pi.SetValue(entity, float.Parse(value.ToString()), null); + } + else if (pi.PropertyType == typeof(double)) + { + pi.SetValue(entity, double.Parse(value.ToString()), null); + } + else + { + pi.SetValue(entity, value, null); + } + } + } + lst.Add(entity); + } + return lst; + } } } diff --git a/ViewModel/MainWindowViewModel.cs b/ViewModel/MainWindowViewModel.cs index 84f70dd..07eb287 100644 --- a/ViewModel/MainWindowViewModel.cs +++ b/ViewModel/MainWindowViewModel.cs @@ -331,12 +331,12 @@ namespace SunlightCentralizedControlManagement_SCCM_.ViewModel set { sys_Time = value; OnPropertyChanged("Sys_Time"); } } public static string MachineLOG; - public string sys_machine; //显示log + /* public string sys_machine; //显示log public string Sys_machine //通知UI控件参数改变 { get { return sys_machine; } set { sys_machine = value; OnPropertyChanged("Sys_machine"); } - } + }*/ public static object Selet_Machines(DataTable DB, string name, string key)//查询 { @@ -422,11 +422,11 @@ namespace SunlightCentralizedControlManagement_SCCM_.ViewModel } } catch (Exception) { } - try + /* try { TechnologicalMachine_View = ToObservableCollection(Machines); } - catch (Exception) { } + catch (Exception) { }*/ try { if (dt_ParameterSet.Rows.Count >= 0) @@ -443,7 +443,7 @@ namespace SunlightCentralizedControlManagement_SCCM_.ViewModel } } catch (Exception) { } - try + /* try { if (dt_TP.Rows.Count >= 0) { @@ -451,7 +451,7 @@ namespace SunlightCentralizedControlManagement_SCCM_.ViewModel Sys_machine = MachineLOG; } } - catch (Exception) { } + catch (Exception) { }*/ }); } @@ -460,8 +460,8 @@ namespace SunlightCentralizedControlManagement_SCCM_.ViewModel ObservableCollection sysData_M = new ObservableCollection(); ObservableCollection paramete_Set = new ObservableCollection(); ObservableCollection sys_Set = new ObservableCollection(); - ObservableCollection technologicalProcess_View = new ObservableCollection(); - ObservableCollection technologicalMachine_View = new ObservableCollection(); + //ObservableCollection technologicalProcess_View = new ObservableCollection(); + //ObservableCollection technologicalMachine_View = new ObservableCollection(); public ObservableCollection SYSData_A { @@ -491,7 +491,7 @@ namespace SunlightCentralizedControlManagement_SCCM_.ViewModel RaisePropertyChanged("SYSData_M"); } } - public ObservableCollection TechnologicalProcess_View + /* public ObservableCollection TechnologicalProcess_View { get { return technologicalProcess_View; } set @@ -508,7 +508,7 @@ namespace SunlightCentralizedControlManagement_SCCM_.ViewModel technologicalMachine_View = value; RaisePropertyChanged("TechnologicalMachine_View"); } - } + }*/ public ObservableCollection Paramete_Set { get { return paramete_Set; } @@ -551,7 +551,7 @@ namespace SunlightCentralizedControlManagement_SCCM_.ViewModel public string PLC { get; set; } public string type { get; set; } } - public class TechnologicalM + /* public class TechnologicalM { public string Name { get; set; } public string WorkOrder { get; set; } @@ -578,7 +578,7 @@ namespace SunlightCentralizedControlManagement_SCCM_.ViewModel public string Parameter4 { get; set; } public string Parameter5 { get; set; } public string DYELOT { get; set; } - } + }*/ public class ParameterSet { public string Category { get; set; } public string ParameterID { get; set; } diff --git a/ViewModel/MonitorViewModel.cs b/ViewModel/MonitorViewModel.cs new file mode 100644 index 0000000..dfc2cf4 --- /dev/null +++ b/ViewModel/MonitorViewModel.cs @@ -0,0 +1,162 @@ +using SunlightCentralizedControlManagement_SCCM_.EX; +using SunlightCentralizedControlManagement_SCCM_.UserClass; +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.ComponentModel; +using System.Data; +using System.Data.SqlClient; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Threading; +using static SunlightCentralizedControlManagement_SCCM_.ViewModel.MainWindowViewModel; + +namespace SunlightCentralizedControlManagement_SCCM_.ViewModel +{ + + public class MonitorViewModel : ViewModelBase + { + public MonitorViewModel() + { + // DispatcherTimer timer1s = new DispatcherTimer(DispatcherPriority.Normal);//初始化循环,每1秒调用一次Tick + // timer1s.Interval = TimeSpan.FromMilliseconds(950);//秒 + // timer1s.Tick += Tick_Main_1S; + // timer1s.Start(); + } + + void Tick_Main_1S(object sender, EventArgs e)//Tick_Event周期执行事件1S + { + DATA_view(); + } + + + public string sys_machine; //显示log + public string Sys_machine //通知UI控件参数改变 + { + get { return sys_machine; } + set { sys_machine = value; OnPropertyChanged("Sys_machine"); } + } + public static bool TechnologicalProcess_bool = true; + private async void DATA_view()//IO显示 + { + await Task.Run(() => + { + + + try + { + TechnologicalMachine_View = ToObservableCollection(Machines); + } + catch (Exception) { } + + try + { + if (dt_TP.Rows.Count >= 0) + { + if (TechnologicalProcess_bool) TechnologicalProcess_View = ToObservableCollection(dt_TP); + Sys_machine = MachineLOG; + } + } + catch (Exception) { } + }); + } + ObservableCollection technologicalProcess_View = new ObservableCollection(); + ObservableCollection technologicalMachine_View = new ObservableCollection(); + public ObservableCollection TechnologicalProcess_View + { + get { return technologicalProcess_View; } + set + { + technologicalProcess_View = value; + RaisePropertyChanged("TechnologicalProcess_View"); + } + } + public ObservableCollection TechnologicalMachine_View + { + get { return technologicalMachine_View; } + set + { + technologicalMachine_View = value; + RaisePropertyChanged("TechnologicalMachine_View"); + } + } + public class TechnologicalM + { + public string Name { get; set; } + public string WorkOrder { get; set; } + public string Dyelot { get; set; } + public string Temperature { get; set; } + public string WaterLevel { get; set; } + public string Process { get; set; } + public string Step { get; set; } + public string Message { get; set; } + public string State { get; set; } + + } + public class TechnologicalP + { + public string ProgramID { get; set; } + public string Program { get; set; } + public double Step { get; set; } + public string StepID { get; set; } + public string StepName { get; set; } + public string ParameterName { get; set; } + public string Parameter1 { get; set; } + public string Parameter2 { get; set; } + public string Parameter3 { get; set; } + public string Parameter4 { get; set; } + public string Parameter5 { get; set; } + public string DYELOT { get; set; } + } + + public ObservableCollection ToObservableCollection(DataTable dt) where T : class, new() + { + Type t = typeof(T); + PropertyInfo[] propertys = t.GetProperties(); + ObservableCollection lst = new ObservableCollection(); + string typeName = string.Empty; + foreach (DataRow dr in dt.Rows) + { + T entity = new T(); + foreach (PropertyInfo pi in propertys) + { + typeName = pi.Name; + if (dt.Columns.Contains(typeName)) + { + if (!pi.CanWrite) continue; + object value = dr[typeName]; + if (value == DBNull.Value) continue; + if (pi.PropertyType == typeof(string)) + { + pi.SetValue(entity, value.ToString(), null); + } + else if (pi.PropertyType == typeof(int) || pi.PropertyType == typeof(int?)) + { + pi.SetValue(entity, int.Parse(value.ToString()), null); + } + else if (pi.PropertyType == typeof(DateTime?) || pi.PropertyType == typeof(DateTime)) + { + pi.SetValue(entity, DateTime.Parse(value.ToString()), null); + } + else if (pi.PropertyType == typeof(float)) + { + pi.SetValue(entity, float.Parse(value.ToString()), null); + } + else if (pi.PropertyType == typeof(double)) + { + pi.SetValue(entity, double.Parse(value.ToString()), null); + } + else + { + pi.SetValue(entity, value, null); + } + } + } + lst.Add(entity); + } + return lst; + } + } +}