alielie
2026-03-02 12e606635c42ea20f4b7c2bdda5204237a4b4c96
优化
151个文件已修改
56个文件已添加
2 文件已重命名
11个文件已删除
87604 ■■■■■ 已修改文件
ConsoleTest/ConsoleTest.csproj 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HMI.AlermInfoManage/AlarmInfoManage.xaml 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HMI.AlermInfoManage/AlarmInfoManage.xaml.cs 421 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HMI.AlermInfoManage/AlarmSettingList.xaml 206 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HMI.AlermInfoManage/AlarmSettingList.xaml.cs 113 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HMI.AlermInfoManage/Entity/AlarmText.cs 74 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HMI.AlermInfoManage/HMI.AlarmInfoManage.csproj 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HMI.AlermInfoManage/Modal/AlarmSettingModal.xaml 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HMI.AlermInfoManage/Modal/AlarmSettingModal.xaml.cs 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HMI.AlermInfoManage/SimpleAlarm.xaml 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HMI.Base/HMI.Base.csproj 1 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HMI.Base/NotifyControl.cs 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HMI.Base/PluginControl.cs 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HMI.Base/PluginLoader.cs 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HMI.Base/PluginMaskControl.cs 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HMI.Base/SimpleControl.cs 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HMI.Base/SimpleMaskControl.cs 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HMI.Base/Themes/Generic.xaml 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HMI.Core/Api/AlarmShowHelper.cs 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HMI.Core/Api/IAlarmShow.cs 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HMI.Core/Api/IPlugin.cs 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HMI.Core/Api/PluginPackage.cs 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HMI.Core/Entity/AlarmSetting.cs 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HMI.Core/Entity/AlarmText.cs 83 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HMI.Core/Entity/LoadMsg.cs 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HMI.Core/Entity/UserInfo.cs 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HMI.Core/HMI.Core.csproj 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HMI.Core/Manager/ParameterManager.cs 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HMI.Core/Manager/ProductManager.cs 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HMI.Core/Setting/ParamSetting.cs 153 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HMI.Core/Setting/ProductSetting.cs 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HMI.Core/Setting/SystemSetting.cs 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HMI.Core/Util/PathHelper.cs 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HMI.Core/Util/Sqlite3Helper.cs 228 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HMI.DataViewer/DataViewer.xaml 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HMI.DataViewer/DataViewer.xaml.cs 206 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HMI.DataViewer/DbSettingModal.xaml 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HMI.DataViewer/DbSettingModal.xaml.cs 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HMI.DataViewer/Entity/DataBase_Setting.cs 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HMI.LogViewer/LogViewer.xaml 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HMI.LogViewer/LogViewer.xaml.cs 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HMI.MenuManage/MenuManage.xaml 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HMI.MenuManage/Modal/IconSelector.xaml 1 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HMI.MenuManage/Modal/RoleModal.xaml 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HMI.MenuManage/Modal/UserModal.xaml 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HMI.MenuManage/Modal/UserModal.xaml.cs 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HMI.MenuManage/UserManage.xaml 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HMI.MenuManage/Util/UserRoleRelHelper.cs 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HMI.ParameterManage/Model/XmlModel.cs 1 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HMI.ParameterManage/ParameterManage.xaml 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HMI.ParameterManage/ParameterManage.xaml.cs 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HMI.ParameterManage/ParameterSetting.xaml 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HMI.ParameterManage/ParameterSetting.xaml.cs 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HMI.ParameterManage/ProductModal.xaml 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HMI.ParameterManage/TestItem.xaml 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HMI.SettingControl/SettingControl.xaml 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HMI.SettingControl/SettingControl.xaml.cs 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HMI.SettingControl/SystemConfig.xaml 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HMI.SettingControl/SystemConfig.xaml.cs 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HMI.StdControl/StdEnableMes.xaml 1 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HMI.StdControl/StdEnableMes.xaml.cs 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HMI.UI/Controls/KeyboradWindow.xaml 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HMI.UI/Converter/CollectionHasItem.cs 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HMI.UI/DpUtil/GridHelper.cs 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HMI.UI/HMI.UI.csproj 1 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HMI.UI/MDI/InnerWindow.xaml 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HMI.UI/MDI/MinInnerWindow.xaml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HMI.UI/MaskControl.xaml 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HMI.UI/MaskControl.xaml.cs 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HMI.UI/MaskWindow.xaml 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HMI.UI/RequirePasswordWindow.xaml 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HMI.UI/Style/BaseWindow.xaml 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HMI.UI/Style/FormStyle.xaml 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HMI.UI/Style/MsgBoxStyle.xaml 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HMI.UI/Style/PanuonDataGrid.xaml 95 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HMI.UI/Style/PanuonListView.xaml 1 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HMI.UI/Style/PanuonResource.xaml 86 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HMI.UI/Style/WindowResources.xaml 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HMI.UI/Themes/Generic.xaml 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HMI.UnitTest/App.config 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HMI.UnitTest/App.xaml 1 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HMI.UnitTest/HMI.UnitTest.csproj 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HMI.Util/Alarm/AlarmUtil.cs 396 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HMI.Util/HMI.Util.csproj 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Libs/25/NationalInstruments.TestStand.Interop.API.dll 补丁 | 查看 | 原始文档 | blame | 历史
Libs/25/NationalInstruments.TestStand.Interop.API.xml 19856 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Libs/25/NationalInstruments.TestStand.Interop.UI.AxControls.dll 补丁 | 查看 | 原始文档 | blame | 历史
Libs/25/NationalInstruments.TestStand.Interop.UI.Support.dll 补丁 | 查看 | 原始文档 | blame | 历史
Libs/25/NationalInstruments.TestStand.Interop.UI.Support.xml 1841 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Libs/25/NationalInstruments.TestStand.Interop.UI.dll 补丁 | 查看 | 原始文档 | blame | 历史
Libs/25/NationalInstruments.TestStand.Interop.UI.xml 9207 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Libs/25/NationalInstruments.TestStand.Utility.dll 补丁 | 查看 | 原始文档 | blame | 历史
Libs/25/NationalInstruments.TestStand.Utility.xml 2303 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Libs/HslCommunication.dll 补丁 | 查看 | 原始文档 | blame | 历史
Libs/NationalInstruments.TestStand.Interop.API.dll 补丁 | 查看 | 原始文档 | blame | 历史
Libs/NationalInstruments.TestStand.Interop.API.xml 21060 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Libs/NationalInstruments.TestStand.Interop.AdapterAPI.dll 补丁 | 查看 | 原始文档 | blame | 历史
Libs/NationalInstruments.TestStand.Interop.AdapterAPI.xml 6819 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Libs/NationalInstruments.TestStand.Interop.SequenceAnalyzer.dll 补丁 | 查看 | 原始文档 | blame | 历史
Libs/NationalInstruments.TestStand.Interop.SequenceAnalyzer.xml 744 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Libs/NationalInstruments.TestStand.Interop.UI.AxControls.dll 补丁 | 查看 | 原始文档 | blame | 历史
Libs/NationalInstruments.TestStand.Interop.UI.Support.dll 补丁 | 查看 | 原始文档 | blame | 历史
Libs/NationalInstruments.TestStand.Interop.UI.Support.xml 1277 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Libs/NationalInstruments.TestStand.Interop.UI.dll 补丁 | 查看 | 原始文档 | blame | 历史
Libs/NationalInstruments.TestStand.Interop.UI.xml 10517 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Libs/NationalInstruments.TestStand.Utility.dll 补丁 | 查看 | 原始文档 | blame | 历史
Libs/NationalInstruments.TestStand.Utility.xml 2303 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Libs/TSSync.Interop.dll 补丁 | 查看 | 原始文档 | blame | 历史
ModBusTcpController/ModBusTcpController.cs 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ModBusTcpController/Properties/AssemblyInfo.cs 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PLCHelper/Entity/PLCTagData.cs 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PLCHelper/ModbusHelper.cs 153 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PLCHelper/NXI_5010Helper.cs 109 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PLCHelper/PLCHelper.csproj 65 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PLCHelper/Properties/AssemblyInfo.cs 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PLCHelper/RestTcpClient.cs 114 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PLCHelper/S7Context.cs 313 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Plugin.CurrentSensorControl/BurnInCell.xaml 67 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Plugin.CurrentSensorControl/BurnInCell.xaml.cs 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Plugin.CurrentSensorControl/BurnInOven.xaml 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Plugin.CurrentSensorControl/BurnInOven.xaml.cs 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Plugin.CurrentSensorControl/BurnInOvenCollection.xaml.cs 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Plugin.CurrentSensorControl/BurnInSettingModal.xaml 64 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Plugin.CurrentSensorControl/BurnInSettingModal.xaml.cs 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Plugin.CurrentSensorControl/ControlPage - 复制.xaml 353 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Plugin.CurrentSensorControl/ControlPage - 复制.xaml.cs 450 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Plugin.CurrentSensorControl/ControlPage.xaml 246 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Plugin.CurrentSensorControl/ControlPage.xaml.cs 167 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Plugin.CurrentSensorControl/DataModal.xaml 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Plugin.CurrentSensorControl/DataModal.xaml.cs 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Plugin.CurrentSensorControl/Entity/BaseConfig.cs 127 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Plugin.CurrentSensorControl/Entity/S7Context.cs 114 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Plugin.CurrentSensorControl/Plugin.CurrentSensorControl.csproj 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Plugin.CurrentSensorControl/SingleSensor.xaml.cs 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Plugin.DOControl/DOControl.xaml 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Plugin.DODriverControl/SingleControl.xaml.cs 1 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Plugin.DataBoard/DataBoard.xaml.cs 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Plugin.DataBoard/Libs/Static/test.html 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Plugin.DataBoard/Properties/AssemblyInfo.cs 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Plugin.JarUI/JarCell.xaml 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Plugin.JarUI/Plugin.JarUI.csproj 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Plugin.SeqEditor/Plugin.SeqEditor.csproj 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Plugin.SeqEditor/SeqEditor.xaml 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Plugin.TestResult/CSVPrinter.cs 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Plugin.TestResult/Chart.xaml.cs 279 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Plugin.TestResult/Cooler.xaml 77 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Plugin.TestResult/Cooler.xaml.cs 218 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Plugin.TestResult/CoolerStatus.xaml 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Plugin.TestResult/CoolerStatus.xaml.cs 95 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Plugin.TestResult/DataTable.xaml 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Plugin.TestResult/DataTable.xaml.cs 226 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Plugin.TestResult/InfoTable.xaml.cs 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Plugin.TestResult/InfoWindow.xaml 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Plugin.TestResult/InfoWindow.xaml.cs 115 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Plugin.TestResult/LiveChart.xaml 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Plugin.TestResult/LiveChart.xaml.cs 519 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Plugin.TestResult/Model/BaseConfig.cs 76 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Plugin.TestResult/Model/CellInfo.cs 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Plugin.TestResult/Plugin.TestResult.csproj 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Plugin.TestResult/Scanner.xaml 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Plugin.TestResult/Scanner.xaml.cs 148 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Plugin.TestResult/SingleCell.xaml 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Plugin.TestResult/SingleCell.xaml.cs 577 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Plugin.TestResult/TestResultView.xaml.cs 116 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Plugin.TestResult/Util/CommonCodeParser.cs 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Plugin.TestResult/Util/ICodeParser.cs 1 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Plugin.TestResult/Util/JKCodeParser.cs 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Plugin.TestResult/Util/ModelCodeParser.cs 100 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Plugin.TestResult/Util/PNUtil.cs 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Plugin.TestResult/Util/RunTimeVariablePool.cs 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Plugin.TestResult/Util/ScannerParser.cs 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Plugin.TestResult/ViewControl.xaml 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Plugin.TestResult/ViewControl.xaml.cs 147 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Plugin.TestResult/app.config 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Plugin.TestResult/packages.config 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Plugin.TsExecution/Plugin.TsExecution.csproj 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Plugin.TsExecution/SingleControl.xaml 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Plugin.TsExecution/SingleControl.xaml.cs 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Plugin.TsExecution/TsExecution.xaml 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Plugin.TsExecution/TsExecution.xaml.cs 277 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Plugin.TsExecution/WorkOrderWin.xaml 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Plugin.TsExecution/WorkOrderWin.xaml.cs 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Plugin.TsSupport/Plugin.TsSupport.csproj 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Plugin.TsSupport/TestAppManager.cs 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SimpleUtil/HMI.Simple.Util/AlarmUtil.cs 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SimpleUtil/HMI.Simple.Util/HMI.Simple.Util.csproj 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SimpleUtil/HMI.Util.Base/AlarmUtil.cs 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SimpleUtil/HMI.Util.Base/HMI.Util.Base.csproj 1 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WPFProject/App.config 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WPFProject/Controls/MainTabControl.xaml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WPFProject/Controls/MainTabControl.xaml.cs 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WPFProject/Icon/LoginLogo.png 补丁 | 查看 | 原始文档 | blame | 历史
WPFProject/Lang/en-US/AlarmInfoManage.json 1 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WPFProject/Lang/en-US/TestExecution.json 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WPFProject/Lang/en-US/TestResult.json 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WPFProject/Lang/en-US/app.json 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WPFProject/Lang/en-US/setting.json 1 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WPFProject/Lang/zh-CN/AlarmInfoManage.json 1 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WPFProject/Lang/zh-CN/TestExecution.json 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WPFProject/Lang/zh-CN/TestResult.json 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WPFProject/Lang/zh-CN/app.json 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WPFProject/Lang/zh-CN/setting.json 1 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WPFProject/Libs/Static/Static Resource.txt 1 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WPFProject/Libs/echarts.min.js 1782 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WPFProject/LoadingWindow.xaml 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WPFProject/LoadingWindow.xaml.cs 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WPFProject/Login.xaml 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WPFProject/Login.xaml.cs 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WPFProject/MainWindow.xaml 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WPFProject/MainWindow.xaml.cs 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WPFProject/PanuonWindow.xaml 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WPFProject/PanuonWindow.xaml.cs 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WPFProject/TestWindow.xaml 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WPFProject/TestWindow.xaml.cs 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WPFProject/WPFProject.csproj 71 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WPFProject/WPFProject.sln 68 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WPFProject/Window1.xaml 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WPFProject/Window1.xaml.cs 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WPFProject/x86/SQLite.Interop.dll 补丁 | 查看 | 原始文档 | blame | 历史
WPFProject/变更记录/2025-12-24.txt 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ConsoleTest/ConsoleTest.csproj
@@ -71,7 +71,7 @@
    <None Include="Properties\app.manifest" />
  </ItemGroup>
  <ItemGroup>
    <ProjectReference Include="..\..\ModBusTcpController\ModBusTcpController\ModBusTcpController.csproj">
    <ProjectReference Include="..\ModBusTcpController\ModBusTcpController.csproj">
      <Project>{49db0c9b-b239-4608-a91e-f5ed43afaf96}</Project>
      <Name>ModBusTcpController</Name>
    </ProjectReference>
HMI.AlermInfoManage/AlarmInfoManage.xaml
@@ -10,7 +10,7 @@
             xmlns:pw="https://opensource.panuon.com/wpf"
             xmlns:pu="https://opensource.panuon.com/wpf-ui"
             mc:Ignorable="d"
             Background="{StaticResource WorkspaceBackground}"
             Background="{DynamicResource WorkspaceBackground}"
             Loaded="UserControl_Loaded"
             d:DesignHeight="450" d:DesignWidth="800">
    <UserControl.Resources>
@@ -30,16 +30,15 @@
                <StackPanel DockPanel.Dock="Right" Style="{StaticResource ButtonGroup}">
                    <Button Style="{StaticResource SettingBtn}" x:Name="settingBtn" Click="Button_Click"/>
                    <Button Style="{StaticResource RfhBtn}" x:Name="refreshBtn" Click="Button_Click"/>
                    <Button Style="{StaticResource ImportBtn}" x:Name="importBtn" Click="Button_Click"/>
                    <!--<Button Style="{StaticResource ImportBtn}" x:Name="importBtn" Click="Button_Click"/>-->
                </StackPanel>
                <!--<TextBlock DockPanel.Dock="Left" FontSize="{StaticResource TitleFontSize}"
                           VerticalAlignment="Center" HorizontalAlignment="Left" Text="{DynamicResource Alm.Title}"/>-->
                <TextBlock DockPanel.Dock="Left" FontSize="{StaticResource TitleFontSize}" 
                           VerticalAlignment="Center" HorizontalAlignment="Left" Text="{DynamicResource Alm.Title}"/>
           VerticalAlignment="Center" HorizontalAlignment="Left" Text="{DynamicResource Alm.Record}"/>
            </DockPanel>
            <TabControl Grid.Row="1" Style="{StaticResource HeaderTabControl}">
                <TabItem Header="报警记录">
                    <DockPanel>
            <DockPanel Grid.Row="1">
                        <StackPanel DockPanel.Dock="Bottom" Orientation="Horizontal" HorizontalAlignment="Right">
                            <pu:Pagination 
                                Height="36" Margin="10"
@@ -52,7 +51,7 @@
                                CurrentPage="{Binding CurrentPage}" 
                                            MaxPage="{Binding MaxPage}"/>
                        </StackPanel>
                        <ListView x:Name="table" Style="{StaticResource DefaultListTable}"
                <!--<ListView x:Name="table" Style="{StaticResource DefaultListTable}"
                                  VirtualizingPanel.VirtualizationMode="Standard"
                                  ItemsSource="{Binding Datasource}">
                            <ListView.View>
@@ -121,7 +120,41 @@
                                    </GridViewColumn>
                                </GridView>
                            </ListView.View>
                        </ListView>
                </ListView>-->
                <DataGrid x:Name="table" Style="{StaticResource DefaultDataGrid}"
                            dp:DataGridHelper.ShowRowNumber="True"
                                  VirtualizingPanel.VirtualizationMode="Standard"
                                  ItemsSource="{Binding Datasource}">
                    <DataGrid.Columns>
                        <DataGridTextColumn Header="#"
                    Binding="{Binding Header, RelativeSource={RelativeSource AncestorType={x:Type DataGridRow}, Mode=FindAncestor}}"
    Width="40"/>
                        <DataGridTextColumn Width="200" Binding="{Binding Source}">
                            <DataGridTextColumn.Header>
                                <TextBlock Text="{DynamicResource Alm.Source}"/>
                            </DataGridTextColumn.Header>
                        </DataGridTextColumn>
                        <DataGridTextColumn Width="200" Binding="{Binding AlarmCode}">
                            <DataGridTextColumn.Header>
                                <TextBlock Text="{DynamicResource Alm.Code}"/>
                            </DataGridTextColumn.Header>
                        </DataGridTextColumn>
                        <DataGridTextColumn Width="*" Binding="{Binding AlarmInfo}">
                            <DataGridTextColumn.Header>
                                <TextBlock Text="{DynamicResource Alm.Info}"/>
                            </DataGridTextColumn.Header>
                        </DataGridTextColumn>
                        <DataGridTextColumn Width="200" Binding="{Binding Time}">
                            <DataGridTextColumn.Header>
                                <TextBlock Text="{DynamicResource Alm.Time}"/>
                            </DataGridTextColumn.Header>
                        </DataGridTextColumn>
                    </DataGrid.Columns>
                </DataGrid>
                        <!--<DataGrid x:Name="table" Style="{StaticResource DefaultDataGrid}" ItemsSource="{Binding Datasource}">
                            <DataGrid.Columns>
                                <DataGridTemplateColumn Header="" Width="Auto" CanUserResize="False">
@@ -162,6 +195,10 @@
                            </DataGrid.Columns>
                        </DataGrid>-->
                    </DockPanel>
            <!--<TabControl Grid.Row="1" Style="{StaticResource HeaderTabControl}">
                <TabItem Header="">
                </TabItem>
                <TabItem Header="报警信息">
                    <Grid>
@@ -222,7 +259,7 @@
                        </ListView>
                    </Grid>
                </TabItem>
            </TabControl>
            </TabControl>-->
        </Grid>
    </Border>
</hb:PluginControl>
HMI.AlermInfoManage/AlarmInfoManage.xaml.cs
@@ -1,19 +1,15 @@
using HMI.AlarmInfoManage.Entity;
using HMI.Base;
using HMI.Core.Api;
using HMI.Core.Setting;
using HMI.Base;
using HMI.Core.Entity;
using HMI.Core.Util;
using HMI.UI.Util;
using HMI.Util;
using HMI.Util.Alarm;
using Microsoft.Win32;
using S7Driver;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Data;
using System.IO;
using System.Linq;
using System.Timers;
using System.Windows;
using System.Windows.Controls;
@@ -24,120 +20,17 @@
    /// </summary>
    public partial class AlarmInfoManage : PluginControl
    {
        private string blockPath;
        private string markPath;
        private string alarmTextPath;
        private volatile bool isClosing = false;
        private string dbPath;
        private bool isHaveAlarm;
        private bool isNewAlarm;
        private SqliteHelper sqliteHelper;
        private Timer MonitorTimer;
        private Timer PcTimer;
        /// <summary>
        /// pc警告数字信号
        /// </summary>
        private int isPcAlarmnumber = 0;
        /// <summary>
        /// å½“前报警信息
        /// </summary>
        private string currentInfo = null;
        /// <summary>
        /// æŽ¥æ”¶æŠ¥è­¦çš„队列
        /// </summary>
        private MSMQHelper alarmQueue = new MSMQHelper("HMI_Alarm");
        /// <summary>
        /// æ—¥å¿—生成器
        /// </summary>
        private MSMQHelper loggeralarm = new MSMQHelper("LTHMI_Logger");
        /// <summary>
        /// åˆ·æ–°æŠ¥è­¦çš„队列
        /// </summary>
        private MSMQHelper alarmRefershToMain = new MSMQHelper("LTHMI_Alarm_Rrfresh");
        //private string opcIP = "127.0.0.1";
        //private int opcPort = 6543;
        //private int localPort = 18888;
        //private SCADAApi lTSCADAApi = new OPCClient();
        private PLCS7Driver pLCS7Driver;
        /// <summary>
        /// æŠ¥è­¦
        /// </summary>
        private byte[] alarmCodeBytes;
        /// <summary>
        /// æŠ¥è­¦ä¿¡æ¯ç¼“å­˜
        /// </summary>
        private List<AlarmText> currentAlarmCachePlc = new List<AlarmText>();
        /// <summary>
        /// PLC报警信息缓存
        /// </summary>
        private List<AlarmText> preAlarmCachePlc = new List<AlarmText>();
        /// <summary>
        /// æŠ¥è­¦ä¿¡æ¯ç¼“å­˜
        /// </summary>
        private List<AlarmText> currentAlarmCachePc = new List<AlarmText>();
        /// <summary>
        /// ä»£ç ç®¡ç†
        /// </summary>
        private ObservableCollection<AlarmSetting> blockAlarmSettings = new ObservableCollection<AlarmSetting>();
        public ObservableCollection<AlarmSetting> BlockAlarmSettings
        {
            get => blockAlarmSettings;
            set
            {
                blockAlarmSettings = value;
                RefreshBlockCache();
            }
        }
        private Dictionary<string, Dictionary<string, string>> BlockMap = new Dictionary<string, Dictionary<string, string>>();
        private Dictionary<string, string> BlockReadCache = new Dictionary<string, string>();
        private void RefreshBlockCache()
        {
            BlockMap.Clear();
            BlockReadCache.Clear();
            if (BlockAlarmSettings == null || BlockAlarmSettings.Count <= 0)
            {
                return;
            }
            foreach (var setting in BlockAlarmSettings)
            {
                string key = $"{setting.DBAddress}.{setting.StartAddress}";
                if (!BlockMap.ContainsKey(key))
                {
                    BlockMap[key] = new Dictionary<string, string>();
                }
                var codes = BlockMap[key];
                codes[setting.AlarmCode] = setting.Description;
            }
        }
        // <summary>
        /// æ ‡å¿—位报警管理
        /// </summary>
        private ObservableCollection<AlarmSetting> markAlarmSetting = new ObservableCollection<AlarmSetting>();
        /// <summary>
        /// ä¼ è‡³ä¸»çª—体的报警信息
        /// </summary>
        private List<AlarmText> currentAlarmCachePlcToMain = new List<AlarmText>();
        //private AlarmText alarm;
        private SystemSetting systemSetting;
        private ObservableCollection<AlarmText> datasource = new ObservableCollection<AlarmText>();
@@ -156,8 +49,6 @@
            get { return alarmTexts; }
            set { Set(ref alarmTexts, value); }
        }
        public Dictionary<string, AlarmText> textMap = new Dictionary<string, AlarmText>();
        private double size = 30;
@@ -185,8 +76,6 @@
        public AlarmInfoManage()
        {
            DataContext = this;
            systemSetting = SystemSetting.Instance;
            pLCS7Driver = new PLCS7Driver(systemSetting.PlcIp, systemSetting.PlcPort);
            InitializeComponent();
        }
@@ -195,9 +84,6 @@
            base.SetBaseFolder(folder);
            dbPath = Path.Combine(BaseFolder, "alarm.db");
            alarmTextPath = Path.Combine(BaseFolder, "AlarmText.data");
            blockPath = Path.Combine(BaseFolder, "BlockSetting.xml");
            markPath = Path.Combine(BaseFolder, "MarkSetting.xml");
        }
        public override void InitFinish()
@@ -214,14 +100,9 @@
                    alarminfo TEXT,
                    time DATETIME);");
            LoadAlarmSetting();
            LoadAlarmText();
            MonitorTimer = new Timer
            {
                Interval = 1000,
            };
            MonitorTimer.Elapsed += MonitorTimer_Elapsed;
            AlarmUtil.OnAlarm += AlarmUtil_OnAlarm;
            //if (!lTSCADAApi.Connect2(opcIP, opcPort, localPort, out string errMsg))
            //{
            //}
@@ -229,33 +110,26 @@
            //{
            //    this.MonitorTimer.Start();
            //}
        }
            if (pLCS7Driver.Connect(out string errMSg))
        private void AlarmUtil_OnAlarm(object sender, List<AlarmText> e)
            {
                this.MonitorTimer.Start();
            foreach (AlarmText alarm in e)
            {
                var sql = string.Empty;
                if (alarm.IsPLCAlarm)
                {
                    var currentInfo = alarm.AlarmInfo;
                    sql = string.Format("INSERT INTO Alarm (source, alarmcode, alarminfo, time) VALUES('{0}','{1}','{2}','{3}');",
                        alarm.Source, alarm.AlarmCode, currentInfo, alarm.Time);
            }
            else
            {
                log.Error($"PLC Driver Connect Error. {errMSg}");
                    sql = string.Format("INSERT INTO Alarm (source, alarmcode, alarminfo, time) VALUES('{0}','{1}','{2}','{3}');",
                    alarm.Source, alarm.AlarmCode, alarm.AlarmInfo, alarm.Time);
            }
            PcTimer = new Timer
            {
                Interval = 1000,
                AutoReset = false
            };
            PcTimer.Elapsed += PcTimer_Elapsed;
            PcTimer.Enabled = true;
                sqliteHelper.ExecuteSql(sql);
        }
        public override void DoClose(object sender, EventArgs e)
        {
            isClosing = true;
            PcTimer.Enabled = false;
            PcTimer?.Dispose();
            MonitorTimer.Enabled = false;
            MonitorTimer?.Dispose();
        }
        private void Button_Click(object sender, RoutedEventArgs e)
@@ -280,13 +154,11 @@
        private void OpenSettingWindow()
        {
            AlarmSettingList listModal = new AlarmSettingList(blockPath, markPath, BlockAlarmSettings, markAlarmSetting, log)
            AlarmSettingList listModal = new AlarmSettingList(log)
            {
                Owner = Window.GetWindow(this)
            };
            listModal.ShowDialog();
            BlockAlarmSettings = listModal.Datasource;
            markAlarmSetting = listModal.MarkDatasource;
        }
        private void RefreshPage(int? page = null)
@@ -443,12 +315,7 @@
        {
            try
            {
                textMap.Clear();
                AlarmTexts = XmlHelper.DeserializeFromXml<ObservableCollection<AlarmText>>(alarmTextPath);
                foreach (var text in AlarmTexts)
                {
                    textMap[text.AlarmCode] = text;
                }
            }
            catch (Exception ex)
            {
@@ -457,28 +324,7 @@
            }
        }
        private void LoadAlarmSetting()
        {
            try
            {
                BlockAlarmSettings = XmlHelper.DeserializeFromXml<ObservableCollection<AlarmSetting>>(blockPath);
            }
            catch (Exception ex)
            {
                log.Error("LoadAlarmSetting Error.", ex);
                BlockAlarmSettings = new ObservableCollection<AlarmSetting>();
            }
            try
            {
                markAlarmSetting = XmlHelper.DeserializeFromXml<ObservableCollection<AlarmSetting>>(markPath);
            }
            catch (Exception ex)
            {
                log.Error("LoadAlarmText Error.", ex);
                markAlarmSetting = new ObservableCollection<AlarmSetting>();
            }
        }
        private void UserControl_Loaded(object sender, RoutedEventArgs e)
        {
@@ -491,79 +337,6 @@
            //}
            RefreshPage(1);
            Loaded -= UserControl_Loaded;
        }
        private void PcTimer_Elapsed(object sender, ElapsedEventArgs e)
        {
            try
            {
                PcTimer.Enabled = false;
                this.alarmQueue.Receive(100, out string MessageID, out string MsgStr);
                if (MessageID != string.Empty)
                {
                    switch (MessageID)
                    {
                        case "Clear":
                            this.currentAlarmCachePc.Clear();
                            this.RefershAlarm();
                            break;
                        case "AlarmCode":
                            AlarmText aalarm = AlarmTexts.FirstOrDefault(alarm => alarm.AlarmCode == MsgStr);
                            if (aalarm == null) break;
                            var data = new AlarmText
                            {
                                Source = "PC",
                                AlarmCode = aalarm.AlarmCode,
                                AlarmInfo = aalarm.MAlarmText_CN,
                                Time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")
                            };
                            //aalarm.Source = "PC";
                            //aalarm.Time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")
                            if (this.currentAlarmCachePc.Find(alarm => alarm.AlarmCode == aalarm.AlarmCode) == null)
                            {
                                this.currentAlarmCachePc.Add(data);
                                this.RefershAlarm();
                                this.isPcAlarmnumber = this.currentAlarmCachePc.Count;
                            }
                            break;
                        default:
                            string[] arr = MsgStr.Split(',');
                            string source = "PC";
                            string info = string.Empty;
                            if (arr.Length > 1)
                            {
                                source = arr[0];
                                info = arr[1];
                            }
                            else
                            {
                                info = MsgStr;
                            }
                            AlarmText newAlarm = new AlarmText
                            {
                                Source = source,
                                AlarmInfo = info,
                                Time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")
                            };
                            if (this.currentAlarmCachePc
                                .Find(alarm => alarm.Source == newAlarm.Source && alarm.AlarmInfo == newAlarm.AlarmInfo) == null)
                            {
                                this.currentAlarmCachePc.Add(newAlarm);
                                this.RefershAlarm();
                                this.isPcAlarmnumber = this.currentAlarmCachePc.Count;
                            }
                            break;
                    }
                }
            }
            catch (Exception ex)
            {
                log.Error("PcTimer Execute Failed", ex);
            }
            finally
            {
                if (!isClosing) PcTimer.Enabled = true;
            }
        }
        //private void MonitorTimer_Elapsed_bak(object sender, ElapsedEventArgs e)
@@ -637,163 +410,5 @@
        //        this.MonitorTimer.Enabled = true;
        //    }
        //}
        /// <summary>
        /// PLC报警读取
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void MonitorTimer_Elapsed(object sender, ElapsedEventArgs e)
        {
            try
            {
                this.MonitorTimer.Enabled = false;
                /// æ£€æŸ¥è¿žæŽ¥
                //if (!lTSCADAApi.IsConnected(out string errMsg))
                //{
                //    log.Warn($"OPCServer Connection Error. {errMsg}");
                //    if (!lTSCADAApi.Connect2(opcIP, opcPort, localPort, out errMsg))
                //    {
                //        log.Warn($"OPCServer Try ReConnection Error. {errMsg}");
                //        return;
                //    }
                //}
                isHaveAlarm = false;
                List<AlarmText> cache = new List<AlarmText>();
                //foreach (var item in BlockAlarmSettings)
                //{
                //    var name = $"{item.DBAddress}.{item.StartAddress}";
                //    if (lTSCADAApi.DoFctReadSingle(name, out string alarmCode, out errMsg) && alarmCode != "0")
                //    {
                //        isHaveAlarm = true;
                //        if (!textMap.TryGetValue(alarmCode, out alarm)) {
                //            continue;
                //        }
                //        var newAlarm = new AlarmText
                //        {
                //            Source = "PLC",
                //            AlarmCode = alarm.AlarmCode,
                //            ModuleName_CN = alarm.ModuleName_CN,
                //            MAlarmText_CN = alarm.MAlarmText_CN,
                //            Time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
                //            AlarmInfo = $"{alarm.ModuleName_CN} {alarm.MAlarmText_CN}"
                //        };
                //        if (this.currentAlarmCachePlc
                //                .Find(alarm => alarm.AlarmCode == newAlarm.AlarmCode) == null)
                //        {
                //            this.currentAlarmCachePlc.Add(newAlarm);
                //        }
                //    }
                //}
                foreach (var key in BlockMap.Keys)
                {
                    if (pLCS7Driver.ReadShort(key, out short alarmVal, out string errMsg) && BlockMap[key].ContainsKey(alarmVal.ToString()))
                    {
                        //if(BlockReadCache.ContainsKey(key) && alarmCode)
                        var alarmCode = alarmVal.ToString();
                        isHaveAlarm = true;
                        var text = BlockMap[key][alarmCode];
                        var newAlarm = new AlarmText
                        {
                            PLC_DB_BLOCK = key,
                            Source = "PLC",
                            AlarmCode = alarmCode,
                            ModuleName_CN = text,
                            MAlarmText_CN = text,
                            Time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
                            AlarmInfo = $"{alarmCode} {text}"
                        };
                        if (this.currentAlarmCachePlc
                                .Find(alarm => alarm.AlarmCode == newAlarm.AlarmCode && alarm.PLC_DB_BLOCK == newAlarm.PLC_DB_BLOCK) == null)
                        {
                            this.currentAlarmCachePlc.Add(newAlarm);
                        }
                    }
                }
                foreach (var item in markAlarmSetting)
                {
                    var name = $"{item.DBAddress}.{item.StartAddress}";
                    if (pLCS7Driver.ReadShort(name, out short alarmVal, out string errMsg) && alarmVal != 0)
                    {
                        var alarmCode = alarmVal.ToString();
                        isHaveAlarm = true;
                        var newAlarm = new AlarmText
                        {
                            Source = "PLC",
                            AlarmCode = alarmCode,
                            Time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
                            AlarmInfo = item.Description
                        };
                        if (this.currentAlarmCachePlc
                                .Find(d => d.AlarmInfo == newAlarm.AlarmInfo) == null)
                        {
                            this.currentAlarmCachePlc.Add(newAlarm);
                        }
                    }
                }
                this.RefershAlarm();
                this.isPcAlarmnumber = this.currentAlarmCachePc.Count;
                if (!isHaveAlarm) currentAlarmCachePlc.Clear();
            }
            catch (Exception ex)
            {
                log.Error("Read OPCServer Data Error.", ex);
            }
            finally
            {
                if (!isClosing) this.MonitorTimer.Enabled = true;
            }
        }
        /// <summary>
        /// åˆ·æ–°æŠ¥è­¦å—信息
        /// </summary>
        private void RefreshDBSetting()
        {
            List<byte> bytes = new List<byte>();
            foreach (var item in BlockAlarmSettings)
            {
                //byte[] itemalarmCodeBytes = this.plc.Simens_S7_ReadBytes_DB("DB", item.DBAddress, item.StartAddress, item.Length);
                //bytes.AddRange(itemalarmCodeBytes.ToList());
            }
            alarmCodeBytes = bytes.ToArray();
        }
        /// <summary>
        /// åˆ·æ–°æŠ¥è­¦ä¿¡æ¯
        /// </summary>
        private void RefershAlarm()
        {
            this.alarmRefershToMain.Send("AlarmRefersh", string.Empty);
            foreach (AlarmText alarm in this.currentAlarmCachePlc)
            {
                var currentInfo = alarm.AlarmInfo;
                string sqladd = string.Format("INSERT INTO Alarm (source, alarmcode, alarminfo, time) VALUES('{0}','{1}','{2}','{3}');",
                    alarm.Source, alarm.AlarmCode, currentInfo, alarm.Time);
                if (AlarmShowHelper.ShowAlarm(currentInfo))
                {
                    sqliteHelper.ExecuteSql(sqladd);
                }
            }
            //this.currentAlarmCachePlc.Clear();
            foreach (AlarmText alarm in this.currentAlarmCachePc)
            {
                string sqladd2 = string.Format("INSERT INTO Alarm (source, alarmcode, alarminfo, time) VALUES('{0}','{1}','{2}','{3}');", alarm.Source, alarm.AlarmCode, alarm.AlarmInfo, alarm.Time);
                if (AlarmShowHelper.ShowAlarm(alarm.AlarmInfo))
                {
                    sqliteHelper.ExecuteSql(sqladd2);
                }
            }
            this.currentAlarmCachePc.Clear();
        }
    }
}
HMI.AlermInfoManage/AlarmSettingList.xaml
@@ -14,6 +14,7 @@
            pu:WindowXModalDialog.OKButtonContent="{DynamicResource App.Close}"
            Width="1000"
            Height="600"
            InteropOwnersMask="False"
            Loaded="WindowX_Loaded"
            WindowStartupLocation="CenterOwner"
            Style="{StaticResource ModalWindow}">
@@ -57,11 +58,11 @@
            <Button Style="{StaticResource DelBtn}" x:Name="delBatchBtn" Click="Button_Click"/>
        </StackPanel>
        <Border Grid.Row="1" BorderThickness="0" BorderBrush="Gray">
        <Grid Grid.Row="1">
            <TabControl Style="{StaticResource HeaderTabControl}" SelectedIndex="{Binding ItemIndex}" x:Name="tab">
                <TabItem Header="DB块报警">
                    <ListView Style="{StaticResource DefaultListTable}" ItemsSource="{Binding Datasource}">
                    <!--<ListView Style="{StaticResource DefaultListTable}" ItemsSource="{Binding Datasource}">
                        <ListView.View>
                            <GridView AllowsColumnReorder="False">
@@ -141,7 +142,7 @@
                                <GridViewColumn Width="250">
                                    <GridViewColumn.Header>
                                        <TextBlock Text="报警文本"/>
                                        <TextBlock Text="{DynamicResource Alm.Description}"/>
                                    </GridViewColumn.Header>
                                    <GridViewColumn.CellTemplate>
                                        <DataTemplate>
@@ -171,10 +172,140 @@
                                </GridViewColumn>
                            </GridView>
                        </ListView.View>
                    </ListView>
                    </ListView>-->
                    <DataGrid Style="{StaticResource DefaultDataGrid}"
                              dp:DataGridHelper.ShowRowNumber="True"
                              ItemsSource="{Binding BlockDatasource}">
                        <DataGrid.Columns>
                            <DataGridTemplateColumn Width="20" CanUserResize="False">
                                <DataGridTemplateColumn.CellTemplate>
                                    <DataTemplate>
                                        <CheckBox VerticalAlignment="Center"
HorizontalAlignment="Center" IsChecked="{Binding IsSelected,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/>
                                    </DataTemplate>
                                </DataGridTemplateColumn.CellTemplate>
                            </DataGridTemplateColumn>
                            <DataGridTextColumn Header="#"
                Binding="{Binding Header, RelativeSource={RelativeSource AncestorType={x:Type DataGridRow}, Mode=FindAncestor}}"
                                                Width="40"/>
                            <DataGridTextColumn Width="100" Binding="{Binding DBAddress}">
                                <DataGridTextColumn.Header>
                                    <TextBlock Text="{DynamicResource Alm.DbAddress}"/>
                                </DataGridTextColumn.Header>
                            </DataGridTextColumn>
                            <DataGridTextColumn Width="150" Binding="{Binding StartAddress}">
                                <DataGridTextColumn.Header>
                                    <TextBlock Text="{DynamicResource Alm.StartAddress}"/>
                                </DataGridTextColumn.Header>
                            </DataGridTextColumn>
                            <DataGridTextColumn Width="100" Binding="{Binding Length}">
                                <DataGridTextColumn.Header>
                                    <TextBlock Text="{DynamicResource Alm.DbLength}"/>
                                </DataGridTextColumn.Header>
                            </DataGridTextColumn>
                            <DataGridTextColumn Width="150" Binding="{Binding AlarmCode}">
                                <DataGridTextColumn.Header>
                                    <TextBlock Text="报警代码"/>
                                </DataGridTextColumn.Header>
                            </DataGridTextColumn>
                            <DataGridTextColumn Width="*" Binding="{Binding Level}">
                                <DataGridTextColumn.Header>
                                    <TextBlock Text="级别"/>
                                </DataGridTextColumn.Header>
                            </DataGridTextColumn>
                            <DataGridTextColumn Width="*" Binding="{Binding Description}">
                                <DataGridTextColumn.Header>
                                    <TextBlock Text="{DynamicResource Alm.Description}"/>
                                </DataGridTextColumn.Header>
                            </DataGridTextColumn>
                            <DataGridTemplateColumn Width="120">
                                <DataGridTemplateColumn.Header>
                                    <TextBlock Text="{DynamicResource App.Opt}"/>
                                </DataGridTemplateColumn.Header>
                                <DataGridTemplateColumn.CellTemplate>
                                    <DataTemplate>
                                        <StackPanel Orientation="Horizontal" dp:StackPanelHelper.ChildSpace="10">
                                            <Button x:Name="editBtn" Style="{StaticResource EditLink}"
Click="Button_Click" Tag="{Binding }"/>
                                            <Button x:Name="delBtn" Style="{StaticResource DeleteLink}"
Click="Button_Click" Tag="{Binding }"/>
                                        </StackPanel>
                                    </DataTemplate>
                                </DataGridTemplateColumn.CellTemplate>
                            </DataGridTemplateColumn>
                        </DataGrid.Columns>
                    </DataGrid>
                </TabItem>
                <TabItem Header="标志位报警">
                    <ListView Style="{StaticResource DefaultListTable}" ItemsSource="{Binding MarkDatasource}">
                    <DataGrid Style="{StaticResource DefaultDataGrid}"
                              dp:DataGridHelper.ShowRowNumber="True"
                              ItemsSource="{Binding MarkDatasource}">
                        <DataGrid.Columns>
                            <DataGridTemplateColumn Width="Auto" CanUserResize="False">
                                <DataGridTemplateColumn.CellTemplate>
                                    <DataTemplate>
                                        <CheckBox VerticalAlignment="Center"
HorizontalAlignment="Center" IsChecked="{Binding IsSelected,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/>
                                    </DataTemplate>
                                </DataGridTemplateColumn.CellTemplate>
                            </DataGridTemplateColumn>
                            <DataGridTextColumn Header="#"
                Binding="{Binding Header, RelativeSource={RelativeSource AncestorType={x:Type DataGridRow}, Mode=FindAncestor}}" Width="40"/>
                            <DataGridTextColumn Width="100" Binding="{Binding DBAddress}">
                                <DataGridTextColumn.Header>
                                    <TextBlock Text="{DynamicResource Alm.DbAddress}"/>
                                </DataGridTextColumn.Header>
                            </DataGridTextColumn>
                            <DataGridTextColumn Width="150" Binding="{Binding StartAddress}">
                                <DataGridTextColumn.Header>
                                    <TextBlock Text="{DynamicResource Alm.StartAddress}"/>
                                </DataGridTextColumn.Header>
                            </DataGridTextColumn>
                            <DataGridTextColumn Width="100" Binding="{Binding Length}">
                                <DataGridTextColumn.Header>
                                    <TextBlock Text="{DynamicResource Alm.DbLength}"/>
                                </DataGridTextColumn.Header>
                            </DataGridTextColumn>
                            <DataGridTextColumn Width="*" Binding="{Binding Description}">
                                <DataGridTextColumn.Header>
                                    <TextBlock Text="{DynamicResource Alm.Description}"/>
                                </DataGridTextColumn.Header>
                            </DataGridTextColumn>
                            <DataGridTemplateColumn Width="120">
                                <DataGridTemplateColumn.Header>
                                    <TextBlock Text="{DynamicResource App.Opt}"/>
                                </DataGridTemplateColumn.Header>
                                <DataGridTemplateColumn.CellTemplate>
                                    <DataTemplate>
                                        <StackPanel Orientation="Horizontal" dp:StackPanelHelper.ChildSpace="10">
                                            <Button x:Name="editBtn" Style="{StaticResource EditLink}"
Click="Button_Click" Tag="{Binding }"/>
                                            <Button x:Name="delBtn" Style="{StaticResource DeleteLink}"
Click="Button_Click" Tag="{Binding }"/>
                                        </StackPanel>
                                    </DataTemplate>
                                </DataGridTemplateColumn.CellTemplate>
                            </DataGridTemplateColumn>
                        </DataGrid.Columns>
                    </DataGrid>
                    <!--<ListView Style="{StaticResource DefaultListTable}" ItemsSource="{Binding MarkDatasource}">
                        <ListView.View>
                            <GridView AllowsColumnReorder="False">
@@ -268,7 +399,7 @@
                                </GridViewColumn>
                            </GridView>
                        </ListView.View>
                    </ListView>
                    </ListView>-->
                </TabItem>
            </TabControl>
            <!--<Grid>
@@ -293,7 +424,9 @@
                                    <ControlTemplate TargetType="ListBoxItem">
                                        <Border x:Name="border" Background="LightGray" 
Padding="10" Margin="0" BorderThickness="0">
                                            --><!-- å†…容呈现器 --><!--
                                            -->
            <!-- å†…容呈现器 -->
            <!--
                                            <StackPanel>
                                                <ContentPresenter  Content="{TemplateBinding Content}" 
                   ContentStringFormat="{TemplateBinding ContentStringFormat}" 
@@ -321,63 +454,8 @@
                    <Button Style="{StaticResource DelBtn}" x:Name="delBatchBtn" Click="Button_Click"/>
                </StackPanel>
                <DataGrid x:Name="table" Grid.Row="2"
         Style="{StaticResource DefaultDataGrid}" ItemsSource="{Binding Datasource}">
                    <DataGrid.Columns>
                        <DataGridTemplateColumn Header="" Width="Auto" CanUserResize="False">
                            <DataGridTemplateColumn.CellTemplate>
                                <DataTemplate>
                                    <CheckBox VerticalAlignment="Center"
                                              IsChecked="{Binding IsSelected,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/>
                                </DataTemplate>
                            </DataGridTemplateColumn.CellTemplate>
                        </DataGridTemplateColumn>
                        <DataGridTemplateColumn Header="#" CanUserResize="False">
                            <DataGridTemplateColumn.CellTemplate>
                                <DataTemplate>
                                    <TextBlock Text="{Binding Converter={StaticResource rowNumber},
RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type DataGridRow},AncestorLevel=1}}"/>
                                </DataTemplate>
                            </DataGridTemplateColumn.CellTemplate>
                        </DataGridTemplateColumn>
                        <DataGridTextColumn Width="*" Binding="{Binding DBAddress}">
                            <DataGridTextColumn.Header>
                                <TextBlock Text="{DynamicResource Alm.DbAddress}"/>
                            </DataGridTextColumn.Header>
                        </DataGridTextColumn>
                        <DataGridTextColumn Width="*" Binding="{Binding StartAddress}">
                            <DataGridTextColumn.Header>
                                <TextBlock Text="{DynamicResource Alm.StartAddress}"/>
                            </DataGridTextColumn.Header>
                        </DataGridTextColumn>
                        <DataGridTextColumn Width="*" Binding="{Binding Length}">
                            <DataGridTextColumn.Header>
                                <TextBlock Text="{DynamicResource Alm.DbLength}"/>
                            </DataGridTextColumn.Header>
                        </DataGridTextColumn>
                        <DataGridTemplateColumn Width="100" IsReadOnly="True" CanUserResize="False">
                            <DataGridTemplateColumn.Header>
                                <TextBlock Text="{DynamicResource App.Opt}"/>
                            </DataGridTemplateColumn.Header>
                            <DataGridTemplateColumn.CellTemplate>
                                <DataTemplate>
                                    <StackPanel Orientation="Horizontal">
                                        <Button x:Name="editBtn" Tag="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type DataGridRow},AncestorLevel=1}}"
                                                Style="{StaticResource EditLink}"
        Margin="0,0,10,0"
        Click="Button_Click"
        DataContext="{Binding }"/>
                                        <Button x:Name="delBtn" Tag="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type DataGridRow},AncestorLevel=1}}"
                                                Style="{StaticResource DeleteLink}"
        DataContext="{Binding }"
        Click="Button_Click"/>
                                    </StackPanel>
                                </DataTemplate>
                            </DataGridTemplateColumn.CellTemplate>
                        </DataGridTemplateColumn>
                    </DataGrid.Columns>
                </DataGrid>
            </Grid>-->
        </Border>
        </Grid>
    </Grid>
</pu:WindowX>
HMI.AlermInfoManage/AlarmSettingList.xaml.cs
@@ -1,14 +1,13 @@
using HMI.AlarmInfoManage.Entity;
using HMI.Core.Entity;
using HMI.Core.Util;
using HMI.UI.Util;
using HMI.Util;
using HMI.Util.Alarm;
using log4net;
using Microsoft.Win32;
using NPOI.SS.Formula.Functions;
using Panuon.WPF.UI;
using System;
using System.Collections.ObjectModel;
using System.IO;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
@@ -21,28 +20,21 @@
    public partial class AlarmSettingList : WindowX
    {
        private ILog log;
        public AlarmSettingList(string blockFile, string markFile, ObservableCollection<AlarmSetting> datasource,
            ObservableCollection<AlarmSetting> markDatasource,
            ILog log)
        public AlarmSettingList(ILog log)
        {
            this.blockFile = blockFile;
            this.markFile = markFile;
            Datasource = datasource;
            MarkDatasource = markDatasource;
            BlockDatasource = AlarmUtil.BlockSettings;
            MarkDatasource = AlarmUtil.MarkSettings;
            this.log = log;
            DataContext = this;
            InitializeComponent();
        }
        private readonly string blockFile;
        private readonly string markFile;
        private ObservableCollection<AlarmSetting> blockDatasource;
        private ObservableCollection<AlarmSetting> datasource;
        public ObservableCollection<AlarmSetting> Datasource
        public ObservableCollection<AlarmSetting> BlockDatasource
        {
            get => datasource;
            set { Set(ref datasource, value); }
            get => blockDatasource;
            set { Set(ref blockDatasource, value); }
        }
        private ObservableCollection<AlarmSetting> markDatasource;
@@ -89,7 +81,7 @@
                    DeleteBatchData();
                    break;
                case "editBtn":
                    EditData(ItemIndex == 0 ? Datasource.IndexOf(data) : MarkDatasource.IndexOf(data), data);
                    EditData(ItemIndex == 0 ? BlockDatasource.IndexOf(data) : MarkDatasource.IndexOf(data), data);
                    break;
                case "exportBtn":
                    ExportData();
@@ -98,7 +90,7 @@
                    ImportData();
                    break;
                case "delBtn":
                    DeleteData(ItemIndex == 0 ? Datasource.IndexOf(data) : MarkDatasource.IndexOf(data));
                    DeleteData(ItemIndex == 0 ? BlockDatasource.IndexOf(data) : MarkDatasource.IndexOf(data));
                    break;
                default:
                    break;
@@ -107,55 +99,21 @@
        private void LoadData()
        {
            try
            {
                if (File.Exists(blockFile))
                {
                    Datasource =
                        XmlHelper.DeserializeFromXml<ObservableCollection<AlarmSetting>>(blockFile);
                }
                else
                {
                    Datasource = new ObservableCollection<AlarmSetting>();
                }
            }
            catch (Exception ex)
            {
                Datasource = new ObservableCollection<AlarmSetting>();
                ToastHelper.Error(this, $"{this.lang("App.LoadFailed")}: {ex.Message}");
            }
            try
            {
                if (File.Exists(markFile))
                {
                    MarkDatasource =
                        XmlHelper.DeserializeFromXml<ObservableCollection<AlarmSetting>>(markFile);
                }
                else
                {
                    MarkDatasource = new ObservableCollection<AlarmSetting>();
                }
            }
            catch (Exception ex)
            {
                MarkDatasource = new ObservableCollection<AlarmSetting>();
                ToastHelper.Error(this, $"{this.lang("App.LoadFailed")}: {ex.Message}");
            }
            BlockDatasource = AlarmUtil.BlockSettings;
            MarkDatasource = AlarmUtil.MarkSettings;
        }
        private void AddData(AlarmSetting data)
        {
            try
            {
                var file = ItemIndex == 0 ? blockFile : markFile;
                var temp = ItemIndex == 0 ? this.lang("Alm.DbBlockAlarm") : this.lang("Alm.TagAlarm");
                var modal = new AlarmSettingModal(log)
                {
                    Title = $"{this.lang("App.Add")}{temp}",
                    Owner = Window.GetWindow(this),
                };
                if (modal.Open(-1, data, ItemIndex == 0 ? Datasource : MarkDatasource, file, ItemIndex != 0) == true)
                if (modal.Open(-1, data, ItemIndex == 0 ? BlockDatasource : MarkDatasource, ItemIndex == 0) == true)
                {
                    LoadData();
                }
@@ -171,14 +129,13 @@
        {
            try
            {
                var file = ItemIndex == 0 ? blockFile : markFile;
                var temp = ItemIndex == 0 ? this.lang("Alm.DbBlockAlarm") : this.lang("Alm.TagAlarm");
                var modal = new AlarmSettingModal(log)
                {
                    Title = $"{this.lang("App.Edit")}{temp}",
                    Owner = Window.GetWindow(this),
                };
                if (modal.Open(index, data, ItemIndex == 0 ? Datasource : MarkDatasource, file, ItemIndex != 0) == true)
                if (modal.Open(index, data, ItemIndex == 0 ? BlockDatasource : MarkDatasource, ItemIndex == 0) == true)
                {
                    LoadData();
                }
@@ -201,7 +158,7 @@
                };
                if (sfd.ShowDialog() == true)
                {
                    ExcelHelper.ExportExcel(sfd.FileName, ItemIndex == 0 ? Datasource : MarkDatasource);
                    ExcelHelper.ExportExcel(sfd.FileName, ItemIndex == 0 ? BlockDatasource : MarkDatasource);
                }
            }
            catch (Exception ex)
@@ -225,16 +182,14 @@
                        ExcelHelper.ReadFromExcel<AlarmSetting>(ofd.FileName));
                    if (ItemIndex == 0)
                    {
                        Datasource = datasource;
                        AlarmUtil.UpdateBlockSettings(datasource);
                        BlockDatasource = AlarmUtil.BlockSettings;
                    }
                    else
                    {
                        MarkDatasource = datasource;
                        AlarmUtil.UpdateMarkSettings(datasource);
                        MarkDatasource = AlarmUtil.MarkSettings;
                    }
                    var file = ItemIndex == 0 ? blockFile : markFile;
                    var temp = ItemIndex == 0 ? Datasource : MarkDatasource;
                    XmlHelper.SerializeToXml(file, temp);
                    LoadData();
                }
            }
            catch (Exception ex)
@@ -250,11 +205,18 @@
            {
                if (MsgBoxHelper.WarnMessage(Window.GetWindow(this), this.lang("HMI.MakeSureDeleteThis")) == MessageBoxResult.OK)
                {
                    var file = ItemIndex == 0 ? blockFile : markFile;
                    var temp = XmlHelper.DeepClone(ItemIndex == 0 ? Datasource : MarkDatasource);
                    bool isBlock = ItemIndex == 0;
                    var temp = XmlHelper.DeepClone(isBlock ? BlockDatasource : MarkDatasource);
                    temp.RemoveAt(index);
                    XmlHelper.SerializeToXml(file, temp);
                    if (isBlock)
                    {
                        AlarmUtil.UpdateBlockSettings(temp);
                    }
                    else
                    {
                        AlarmUtil.UpdateMarkSettings(temp);
                    }
                    LoadData();
                }
            }
@@ -268,7 +230,7 @@
        {
            try
            {
                var temp = (ItemIndex == 0 ? Datasource : MarkDatasource).Where(e => e.IsSelected).ToList();
                var temp = (ItemIndex == 0 ? BlockDatasource : MarkDatasource).Where(e => e.IsSelected).ToList();
                if (temp == null || temp.Count <= 0)
                {
                    ToastHelper.Warning(Window.GetWindow(this), this.lang("HMI.NoDeleteData"));
@@ -278,9 +240,16 @@
                if (MsgBoxHelper.WarnMessage(Window.GetWindow(this), this.lang("HMI.MakeSureDeletes", temp.Count))
                    == MessageBoxResult.OK)
                {
                    var file = ItemIndex == 0 ? blockFile : markFile;
                    temp = (ItemIndex == 0 ? Datasource : MarkDatasource).Where(e => !e.IsSelected).ToList();
                    XmlHelper.SerializeToXml(file, temp);
                    bool isBlock = ItemIndex == 0;
                    temp = (isBlock ? BlockDatasource : MarkDatasource).Where(e => !e.IsSelected).ToList();
                    if (isBlock)
                    {
                        AlarmUtil.UpdateBlockSettings(temp);
                    }
                    else
                    {
                        AlarmUtil.UpdateMarkSettings(temp);
                    }
                    LoadData();
                }
            }
HMI.AlermInfoManage/Entity/AlarmText.cs
File was deleted
HMI.AlermInfoManage/HMI.AlarmInfoManage.csproj
@@ -128,8 +128,6 @@
      <DependentUpon>AlarmSettingList.xaml</DependentUpon>
    </Compile>
    <Compile Include="Entity\AimSetting.cs" />
    <Compile Include="Entity\AlarmSetting.cs" />
    <Compile Include="Entity\AlarmText.cs" />
    <Compile Include="Modal\AlarmSettingModal.xaml.cs">
      <DependentUpon>AlarmSettingModal.xaml</DependentUpon>
    </Compile>
HMI.AlermInfoManage/Modal/AlarmSettingModal.xaml
@@ -39,6 +39,16 @@
                <pu:NumberInput Style="{StaticResource FormNumberInput}" x:Name="length" Interval="1"/>
            </pu:FormGroup>
            <pu:FormGroup Header="报警代码" dp:FormGroupHelper.IsRequired="True" x:Name="FgCode"
              GroupName="MyFormGroup">
                <TextBox Style="{StaticResource EditorTextBoxStyle}" x:Name="TbCode"/>
            </pu:FormGroup>
            <pu:FormGroup Header="级别" dp:FormGroupHelper.IsRequired="True" x:Name="FgLevel"
   GroupName="MyFormGroup">
                <pu:NumberInput Style="{StaticResource FormNumberInput}" x:Name="NiLevel"/>
            </pu:FormGroup>
            <pu:FormGroup x:Name="FgDesc" Header="{DynamicResource Alm.Description}" dp:FormGroupHelper.IsRequired="True"
              GroupName="MyFormGroup">
                <TextBox Style="{StaticResource EditorTextBoxStyle}" x:Name="TbDesc"/>
HMI.AlermInfoManage/Modal/AlarmSettingModal.xaml.cs
@@ -1,7 +1,8 @@
using HMI.AlarmInfoManage.Entity;
using HMI.Core.Entity;
using HMI.Core.Util;
using HMI.UI.DpUtil;
using HMI.UI.Util;
using HMI.Util.Alarm;
using log4net;
using Panuon.WPF.UI;
using System;
@@ -24,7 +25,7 @@
            InitializeComponent();
        }
        private ILog log;
        public string FilePath { get; private set; }
        private bool isBlock;
        public int DataIndex { get; private set; }
        public AlarmSetting Data { get; private set; }
        public ObservableCollection<AlarmSetting> Datasource { get; private set; }
@@ -73,7 +74,8 @@
        public bool ValidateDBAddress(object value, out string err)
        {
            err = null;
            if (Datasource?.FirstOrDefault(e => e.DBAddress == value) != null)
            var target = Datasource?.FirstOrDefault(e => e.DBAddress == value);
            if (target != null && target != Data)
            {
                err = this.lang("App.MustBeUnique", this.lang("Alm.DbAddress"));
                return false;
@@ -89,23 +91,26 @@
                Data.DBAddress = dbAddress.Text;
                Data.StartAddress = startAddress.Text;
                Data.Length = Convert.ToInt32(length.Value);
                Data.AlarmCode = TbCode.Text;
                Data.Level = NiLevel.Value ?? 0d;
                Data.Description = TbDesc.Text;
            }
            return flag;
        }
        public bool? Open(int index, AlarmSetting data,
            ObservableCollection<AlarmSetting> dataSource,
            string filePath, bool showDescription)
            ObservableCollection<AlarmSetting> dataSource, bool isBlock)
        {
            FgDesc.Visibility = showDescription ? Visibility.Visible : Visibility.Collapsed;
            FilePath = filePath;
            this.isBlock = isBlock;
            FgCode.Visibility = isBlock ? Visibility.Visible : Visibility.Collapsed;
            DataIndex = index;
            Data = data;
            Datasource = dataSource;
            dbAddress.Text = Data.DBAddress;
            startAddress.Text = Data.StartAddress;
            length.Value = Data.Length;
            TbCode.Text = Data.AlarmCode;
            NiLevel.Value = Data.Level;
            TbDesc.Text = Data.Description;
            return this.ShowDialog();
        }
@@ -125,13 +130,27 @@
        public void InsertData(AlarmSetting data)
        {
            Datasource.Add(data);
            XmlHelper.SerializeToXml(FilePath, Datasource);
            if (this.isBlock)
            {
                AlarmUtil.UpdateBlockSettings(Datasource);
            }
            else
            {
                AlarmUtil.UpdateMarkSettings(Datasource);
            }
        }
        public void UpdateData(int index, AlarmSetting data)
        {
            Datasource[index] = data;
            XmlHelper.SerializeToXml(FilePath, Datasource);
            if (this.isBlock)
            {
                AlarmUtil.UpdateBlockSettings(Datasource);
            }
            else
            {
                AlarmUtil.UpdateMarkSettings(Datasource);
            }
        }
    }
}
HMI.AlermInfoManage/SimpleAlarm.xaml
@@ -10,7 +10,7 @@
             xmlns:pw="https://opensource.panuon.com/wpf"
             xmlns:pu="https://opensource.panuon.com/wpf-ui"
             mc:Ignorable="d"
             Background="{StaticResource WorkspaceBackground}"
             Background="{DynamicResource WorkspaceBackground}"
             Loaded="UserControl_Loaded"
             d:DesignHeight="450" d:DesignWidth="800">
HMI.Base/HMI.Base.csproj
@@ -73,6 +73,7 @@
  <ItemGroup>
    <Compile Include="DtConverter.cs" />
    <Compile Include="PluginMaskControl.cs" />
    <Compile Include="NotifyControl.cs" />
    <Compile Include="SimpleControl.cs" />
    <Compile Include="PluginControl.cs" />
    <Compile Include="PluginInfo.cs" />
HMI.Base/NotifyControl.cs
New file
@@ -0,0 +1,28 @@
using System.ComponentModel;
using System.Runtime.CompilerServices;
using System.Windows.Controls;
namespace HMI.Base
{
    public class NotifyControl : UserControl, INotifyPropertyChanged
    {
        #region ...
        public event PropertyChangedEventHandler PropertyChanged;
        protected void Set([CallerMemberName] string name = null)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
        }
        protected void Set<T>(ref T old, T @new, [CallerMemberName] string propertyName = null)
        {
            old = @new;
            if (propertyName != null)
            {
                Set(propertyName);
            }
        }
        #endregion
    }
}
HMI.Base/PluginControl.cs
@@ -75,5 +75,15 @@
        {
        }
        public virtual bool CanActive()
        {
            return true;
        }
        public virtual bool CanDeActive()
        {
            return true;
        }
    }
}
HMI.Base/PluginLoader.cs
@@ -12,19 +12,6 @@
namespace HMI.Base
{
    public enum LoadMsgType
    {
        INIT, LOADING, FINISHED
    }
    public class LoadMsg
    {
        public string Message { get; set; }
        public bool? Result { get; set; }
        public LoadMsgType Type { get; set; }
        public int NumData { get; set; }
    }
    public class PluginLoader
    {
        private static ILog log = LogManager.GetLogger("PluginLoader");
@@ -70,10 +57,7 @@
                Plugins = new List<PluginInfo>();
                Menus = LoadTreeMenu(dispatcher);
                sqliteHelper.Close();
                dispatcher.Invoke(() =>
                {
                    LoadMessageAppend?.Invoke(this, new LoadMsg { Type = LoadMsgType.FINISHED });
                });
            }
            pluginContainer.DoCloseEvent += PluginContainer_DoCloseEvent;
        }
@@ -93,6 +77,8 @@
                {
                    try
                    {
                        var start = DateTime.Now;
                        log.Info(this.lang("App.IsLoadingMenu", menu.Name));
                        LoadMessageAppend?.Invoke(this,
                            new LoadMsg
                            {
@@ -100,6 +86,7 @@
                                Message = this.lang("App.IsLoadingMenu", menu.Name)
                            }
                        );
                        if (!string.IsNullOrEmpty(menu.DllPath))
                        {
                            string dllPath = Path.Combine(PluginFolder, menu.DllPath);
@@ -136,6 +123,7 @@
                                menu.SettingControl = SettingInstance;
                            }
                        }
                        log.Info($"{this.lang("App.MenuLoadSuccess", menu.Name)} Cost: {(DateTime.Now - start).TotalMilliseconds}ms");
                        LoadMessageAppend?.Invoke(this,
                            new LoadMsg
                            {
@@ -197,8 +185,9 @@
                List<PermissionData> allPermissions = UserInfo.User?.AllPermissions;
                if (allPermissions != null)
                {
                    Application.Current.Dispatcher.Invoke(() =>
                    Application.Current.Dispatcher.Invoke(new Action(() =>
                    {
                        log.Info(this.lang("App.MenuCount", allPermissions.Count));
                        LoadMessageAppend?.Invoke(this,
                          new LoadMsg
                          {
@@ -231,7 +220,7 @@
                            }
                            Plugins.Add(menu);
                        }
                    });
                    }));
                    LoadChildrenMenu();
                }
            }
HMI.Base/PluginMaskControl.cs
@@ -1,6 +1,7 @@
using System;
using System.ComponentModel;
using System.Runtime.CompilerServices;
using System.Windows;
using System.Windows.Controls;
using HMI.Core.Api;
using HMI.UI;
@@ -8,7 +9,11 @@
namespace HMI.Base
{
    public class PluginMaskControl : UserControl, IPlugin, INotifyPropertyChanged
    /// <summary>
    /// PluginMaskControl.xaml çš„交互逻辑
    /// </summary>
    public partial class PluginMaskControl : UserControl, IPlugin, INotifyPropertyChanged
    {
        #region ...
        public event PropertyChangedEventHandler PropertyChanged;
@@ -28,6 +33,12 @@
            }
        }
        #endregion
        static PluginMaskControl()
        {
            DefaultStyleKeyProperty.OverrideMetadata(typeof(PluginMaskControl),
                new FrameworkPropertyMetadata(typeof(PluginMaskControl)));
        }
        protected ILog log;
        protected string BaseFolder;
@@ -85,5 +96,15 @@
                mask.ShowMask(this, action, reject, title, content);
            }
        }
        public virtual bool CanActive()
        {
            return true;
        }
        public virtual bool CanDeActive()
        {
            return true;
        }
    }
}
HMI.Base/SimpleControl.cs
@@ -55,5 +55,15 @@
        {
        }
        public virtual bool CanActive()
        {
            return true;
        }
        public virtual bool CanDeActive()
        {
            return true;
        }
    }
}
HMI.Base/SimpleMaskControl.cs
@@ -75,5 +75,15 @@
                mask.ShowMask(this, action, reject, title, content);
            }
        }
        public virtual bool CanActive()
        {
            return true;
        }
        public virtual bool CanDeActive()
        {
            return true;
        }
    }
}
HMI.Base/Themes/Generic.xaml
@@ -21,8 +21,7 @@
            <Setter.Value>
                <ControlTemplate TargetType="local:PluginMaskControl">
                    <Grid>
                        <ContentPresenter Content="{TemplateBinding Content}"/>
                        <ContentPresenter Content="{TemplateBinding Content}" Margin="{TemplateBinding Padding}"/>
                        <ui:MaskControl x:Name="mask"/>
                    </Grid>
                </ControlTemplate>
HMI.Core/Api/AlarmShowHelper.cs
@@ -1,7 +1,13 @@
namespace HMI.Core.Api
using HMI.Core.Entity;
using System;
using System.Collections.Generic;
namespace HMI.Core.Api
{
    public class AlarmShowHelper
    {
        private static List<IAlarmHandler> handlers;
        private static IAlarmShow shower;
        public static void Register(IAlarmShow shower)
@@ -12,11 +18,46 @@
            }
        }
        public static bool ShowAlarm(string message)
        public static void UnRegister(IAlarmShow shower)
        {
            if (AlarmShowHelper.shower == shower)
            {
                AlarmShowHelper.shower = null;
            }
        }
        public static void AddHandler(IAlarmHandler handler)
        {
            if (handlers == null)
            {
                handlers = new List<IAlarmHandler>();
            }
            if (!handlers.Contains(handler))
            {
                handlers.Add(handler);
            }
        }
        public static bool ShowAlarm(AlarmText alarm)
        {
            if (handlers != null)
            {
                foreach (var handler in handlers)
                {
                    try
                    {
                        handler.HandleAlarm(alarm);
                    }
                    catch (Exception ex)
                    {
                    }
                }
            }
            if (shower != null)
            {
                return shower.ShowAlarm(message);
                return shower.ShowAlarm(alarm);
            }
            return false;
        }
HMI.Core/Api/IAlarmShow.cs
@@ -1,4 +1,5 @@
using System;
using HMI.Core.Entity;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
@@ -8,6 +9,11 @@
{
    public interface IAlarmShow
    {
        bool ShowAlarm(string message);
        bool ShowAlarm(AlarmText alarm);
    }
    public interface IAlarmHandler
    {
        void HandleAlarm(AlarmText alarm);
    }
}
HMI.Core/Api/IPlugin.cs
@@ -24,11 +24,19 @@
        void Active();
        /// <summary>
        /// æ’件被激活时的操作
        /// </summary>
        /// <returns></returns>
        bool CanActive();
        /// <summary>
        /// å¤±æ´»æ—¶çš„æ“ä½œ
        /// </summary>
        /// <returns></returns>
        void DeActive();
        bool CanDeActive();
        /// <summary>
        /// åˆ†é…æ—¥å¿—logger(log4net)
        /// </summary>
HMI.Core/Api/PluginPackage.cs
@@ -3,7 +3,6 @@
using System.Collections.Generic;
using System.ComponentModel;
using System.Reflection;
using System.Web.UI.WebControls;
namespace HMI.Core.Api
{
@@ -34,6 +33,8 @@
        private MethodInfo OnTabChangeMethod;
        private MethodInfo SetBaseFolderMethod;
        private MethodInfo SetLoggerMethod;
        private MethodInfo CanDeActiveMethod;
        private MethodInfo CanActiveMethod;
        public PluginPackage(object content)
        {
@@ -47,6 +48,8 @@
            OnTabChangeMethod = content.GetType().GetMethod("OnTabChange", new Type[] { typeof(object), typeof(object) });
            SetBaseFolderMethod = content.GetType().GetMethod("SetBaseFolder", new Type[] { typeof(string) });
            SetLoggerMethod = content.GetType().GetMethod("SetLogger", new Type[] { typeof(ILog) });
            CanDeActiveMethod = content.GetType().GetMethod("CanDeActive");
            CanActiveMethod = content.GetType().GetMethod("CanActive");
        }
        public void Active()
@@ -93,5 +96,15 @@
        {
            SetLoggerMethod?.Invoke(Content, new object[] { logger });
        }
        public bool CanActive()
        {
            return (bool)CanActiveMethod?.Invoke(Content, null);
        }
        public bool CanDeActive()
        {
            return (bool)CanDeActiveMethod?.Invoke(Content, null);
        }
    }
}
HMI.Core/Entity/AlarmSetting.cs
File was renamed from HMI.AlermInfoManage/Entity/AlarmSetting.cs
@@ -1,7 +1,4 @@
using HMI.Core;
using HMI.Core.Entity;
namespace HMI.AlarmInfoManage.Entity
namespace HMI.Core.Entity
{
    public class AlarmSetting : SelectBase
    {
@@ -28,6 +25,9 @@
        [ExcelColumn("报警代码")]
        public string AlarmCode { get; set; }
        [ExcelColumn("级别")]
        public double Level { get; set; }
        [ExcelColumn("报警描述")]
        public string Description { get; set; }
    }
HMI.Core/Entity/AlarmText.cs
New file
@@ -0,0 +1,83 @@
using System.Xml.Serialization;
namespace HMI.Core.Entity
{
    public class AlarmText
    {
        /// <summary>
        /// æŠ¥è­¦ä»£ç 
        /// </summary>
        [ExcelColumn("组合报警代码")]
        public string AlarmCode { get; set; }
        public string VirtualId { get; set; }
        /// <summary>
        /// å·¥ä½ç¼–号
        /// </summary>
        [ExcelColumn("设备号")]
        public string OpNo { get; set; }
        /// <summary>
        /// æ¨¡å—编号
        /// </summary>
        [ExcelColumn("模块号")]
        public string ModuleNo { get; set; }
        ///// <summary>
        ///// æ¨¡å—名称(CN)
        ///// </summary>
        //[ExcelColumn("模块名称-CN")]
        //public string ModuleName_CN { get; set; }
        ///// <summary>
        ///// æ¨¡å—名称(EN)
        ///// </summary>
        //[ExcelColumn("模块名称-US")]
        //public string ModuleName_EN { get; set; }
        ///// <summary>
        ///// æ¨¡å—报警文本(CN)
        ///// </summary>
        //[ExcelColumn("报警信息文本-CN")]
        //public string MAlarmText_CN { get; set; }
        ///// <summary>
        ///// æ¨¡å—报警文本(EN)
        ///// </summary>
        //[ExcelColumn("报警信息文本-US")]
        //public string MAlarmText_EN { get; set; }
        /// <summary>
        /// æ¨¡å—报警代码
        /// </summary>
        [ExcelColumn("报警代码")]
        public string MAlarmCode { get; set; }
        /// <summary>
        /// æŠ¥è­¦æ—¶é—´
        /// </summary>
        public string Time { get; set; }
        [XmlIgnore]
        public string AlarmInfo { get; set; }
        /// <summary>
        /// æŠ¥è­¦æ¥æº
        /// </summary>
        [XmlIgnore]
        public string Source { get; set; }
        [XmlIgnore]
        public string PLC_DB_BLOCK { get; set; }
        [XmlIgnore]
        public double Level { get; set; }
        [XmlIgnore]
        public bool IsPLCAlarm { get; set; }
    }
}
HMI.Core/Entity/LoadMsg.cs
New file
@@ -0,0 +1,15 @@
namespace HMI.Core.Entity
{
    public enum LoadMsgType
    {
        INIT, LOADING, FINISHED
    }
    public class LoadMsg
    {
        public string Message { get; set; }
        public bool? Result { get; set; }
        public LoadMsgType Type { get; set; }
        public int NumData { get; set; }
    }
}
HMI.Core/Entity/UserInfo.cs
@@ -31,5 +31,10 @@
        {
            if (User == null) User = info;
        }
        public static void Logout()
        {
            User = null;
        }
    }
}
HMI.Core/HMI.Core.csproj
@@ -109,7 +109,10 @@
    <Compile Include="Annotation\InitAttribute.cs" />
    <Compile Include="Api\PluginPackage.cs" />
    <Compile Include="DpUtil\PermissionHelper.cs" />
    <Compile Include="Entity\AlarmSetting.cs" />
    <Compile Include="Entity\AlarmText.cs" />
    <Compile Include="Entity\LangInfo.cs" />
    <Compile Include="Entity\LoadMsg.cs" />
    <Compile Include="Entity\NotifyBase.cs" />
    <Compile Include="Entity\ParameterData.cs" />
    <Compile Include="Entity\PermissionData.cs" />
@@ -123,6 +126,8 @@
    <Compile Include="LangConverter.cs" />
    <Compile Include="Manager\TestItemManager.cs" />
    <Compile Include="Properties\AssemblyInfo.cs" />
    <Compile Include="Setting\ProductSetting.cs" />
    <Compile Include="Setting\ParamSetting.cs" />
    <Compile Include="Setting\SystemSetting.cs" />
    <Compile Include="Util\BeanUtil.cs" />
    <Compile Include="Util\BindingProxy.cs" />
@@ -135,6 +140,7 @@
    <Compile Include="Manager\ParameterManager.cs" />
    <Compile Include="Util\PathHelper.cs" />
    <Compile Include="Manager\ProductManager.cs" />
    <Compile Include="Util\Sqlite3Helper.cs" />
    <Compile Include="Util\SqliteHelper.cs" />
    <Compile Include="Util\UtilContainer.cs" />
    <Compile Include="Util\XmlHelper.cs" />
HMI.Core/Manager/ParameterManager.cs
@@ -39,6 +39,26 @@
            return datas.FirstOrDefault(d => d.Name == name);
        }
        public static T GetCommonParameterByName<T>(string name, T defaultValue)
        {
            try
            {
                string path = PathHelper.ParameterDataPath;
                if (!File.Exists(path)) return defaultValue;
                List<ParameterData> datas = XmlHelper.DeserializeFromXml<List<ParameterData>>(path);
                var data = datas.FirstOrDefault(d => d.Name == name);
                if (data == null)
                {
                    return defaultValue;
                }
                return (T)Convert.ChangeType(data.Value, typeof(T));
            }
            catch
            {
                return defaultValue;
            }
        }
        /// <summary>
        /// ä¿å­˜é€šç”¨å‚æ•°
        /// </summary>
HMI.Core/Manager/ProductManager.cs
@@ -2,6 +2,7 @@
using HMI.Core.Util;
using System.Collections.Generic;
using System.IO;
using System.Linq;
namespace HMI.Core.Manager
{
@@ -51,5 +52,11 @@
            List<ParameterData> datas = GetParametersByProductName<List<ParameterData>>(productName);
            return datas ?? new List<ParameterData>();
        }
        public static ParameterData GetParameterByProductAndName(string product, string name)
        {
            List<ParameterData> datas = GetParametersByProductName<List<ParameterData>>(product);
            return datas?.FirstOrDefault(e => e.Name == name);
        }
    }
}
HMI.Core/Setting/ParamSetting.cs
New file
@@ -0,0 +1,153 @@
using HMI.Core.Manager;
using HMI.Core.Util;
using System.IO;
namespace HMI.Core.Setting
{
    public class ParamSetting
    {
        /// <summary>
        /// MesAddress
        /// </summary>
        public static string MesAddress { get; private set; } = "127.0.0.1:8080";
        public static bool ReverseCSV { get; private set; } = false;
        public static string CustomerCode { get; private set; }
        public static string DataLogFolder { get; private set; } = null;
        /// <summary>
        /// æ˜¯å¦å¼€å¯æ°´å†·æœºè®¾ç½®
        /// </summary>
        public static bool ShowCoolerSetting { get; private set; } = false;
        public static bool ShowWaterChart { get; private set; } = false;
        /// <summary>
        /// æŒ‰åž‹å·è®¡ç®—探针
        /// </summary>
        public static bool ProbeByModel { get; private set; } = false;
        public static int ReverseCSVSkipRow { get; private set; } = 3;
        public static bool IsOptRequirePassword { get; private set; } = false;
        /// <summary>
        /// å¯ç”¨æ‰«ç æ¢åž‹
        /// </summary>
        public static bool EnableAutoModel { get; private set; } = false;
        static ParamSetting()
        {
            try
            {
                var value = ParameterManager.GetCommonParameterByName("MesAddress");
                if (value != null)
                {
                    MesAddress = value.Value;
                }
            }
            catch
            {
            }
            try
            {
                var value = ParameterManager.GetCommonParameterByName("ReverseCSV");
                if (value != null)
                {
                    ReverseCSV = bool.Parse(value.Value);
                }
            }
            catch
            {
            }
            try
            {
                var value = ParameterManager.GetCommonParameterByName("TS_DataLogPath");
                DataLogFolder = value?.Value ?? Path.Combine(PathHelper.ConfigFolder, "DataBoard");
            }
            catch
            {
                DataLogFolder = Path.Combine(PathHelper.ConfigFolder, "DataBoard");
            }
            try
            {
                var value = ParameterManager.GetCommonParameterByName("ShowWaterChart");
                if (value != null)
                {
                    ShowWaterChart = bool.Parse(value.Value);
                }
            }
            catch
            {
            }
            try
            {
                var value = ParameterManager.GetCommonParameterByName("ShowCoolerSetting");
                if (value != null)
                {
                    ShowCoolerSetting = bool.Parse(value.Value);
                }
            }
            catch
            {
            }
            try
            {
                var value = ParameterManager.GetCommonParameterByName("CustomerCode");
                if (value != null)
                {
                    CustomerCode = value.Value;
                }
            }
            catch
            {
            }
            try
            {
                var value = ParameterManager.GetCommonParameterByName("ProbeByModel");
                if (value != null)
                {
                    ProbeByModel = bool.Parse(value.Value);
                }
            }
            catch
            {
            }
            try
            {
                var value = ParameterManager.GetCommonParameterByName("ReverseCSVSkipRow");
                if (value != null)
                {
                    ReverseCSVSkipRow = int.Parse(value.Value);
                }
            }
            catch
            {
            }
            try
            {
                IsOptRequirePassword = ParameterManager.GetCommonParameterByName<bool>("IsOptRequirePassword", false);
            }
            catch
            {
            }
            try
            {
                EnableAutoModel = ParameterManager.GetCommonParameterByName<bool>("EnableAutoModel", false);
            }
            catch
            {
            }
        }
    }
}
HMI.Core/Setting/ProductSetting.cs
New file
@@ -0,0 +1,10 @@
using HMI.Core.Manager;
using HMI.Core.Util;
using System.IO;
namespace HMI.Core.Setting
{
    public class ProductSetting
    {
    }
}
HMI.Core/Setting/SystemSetting.cs
@@ -25,7 +25,8 @@
        }
        public string LogoPath { get; private set; } = ".\\JingCeLogo.png";
        public string LogoPath { get; private set; } = ".\\Logo.png";
        public string LoginLogoPath { get; private set; } = ".\\LoginLogo.png";
        public string WindowTitle { get; private set; } = "产品测试平台";
        public string PlcIp { get; private set; } = "127.0.0.1";
        public int PlcPort { get; private set; } = 102;
@@ -81,6 +82,13 @@
            set { Set(ref logoPath, value); }
        }
        private string loginLogoPath;
        public string LoginLogoPath
        {
            get => loginLogoPath;
            set { Set(ref loginLogoPath, value); }
        }
        private string windowTitle;
        public string WindowTitle
        {
HMI.Core/Util/PathHelper.cs
@@ -155,6 +155,18 @@
            return Path;
        }
        public static string BlockAlarmSettingPath()
        {
            string Path = RootPath() + "\\Config\\AlarmInfo\\BlockSetting.xml";
            return Path;
        }
        public static string MarkAlarmSettingPath()
        {
            string Path = RootPath() + "\\Config\\AlarmInfo\\MarkSetting.xml";
            return Path;
        }
        /// <summary>
        /// æ’件存储目录
        /// </summary>
HMI.Core/Util/Sqlite3Helper.cs
New file
@@ -0,0 +1,228 @@
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SQLite;
namespace HMI.Core.Util
{
    public class Sqlite3Helper : IDisposable
    {
        public string DataBaseFile { get; private set; } = string.Empty;
        private string ConnectString = string.Empty;
        private SQLiteConnection conn = null;
        public Sqlite3Helper(string DBFile)
        {
            DataBaseFile = DBFile;
            ConnectString = "DataSource=" + DataBaseFile + ";Version=3;Pooling=False;Max Pool Size=100;";
            conn = new SQLiteConnection(ConnectString);
            Connect();
        }
        public static bool CreateDatabase(string DataBaseFile)
        {
            try
            {
                SQLiteConnection.CreateFile(DataBaseFile);
                return true;
            }
            catch (Exception ex)
            {
                throw new Exception($"Create Database [${DataBaseFile}] Failed.", ex);
            }
        }
        public int Execute(string Sql)
        {
            try
            {
                using (var cmd = new SQLiteCommand(conn))
                {
                    cmd.CommandType = CommandType.Text;
                    cmd.CommandText = Sql;
                    return cmd.ExecuteNonQuery();
                }
            }
            catch (Exception ex)
            {
                string message = "ExecuteSql Error:" + ex.Message;
                throw new Exception(message);
            }
        }
        public int ExecuteBatch(IEnumerable<string> sqls)
        {
            SQLiteTransaction tr = null;
            int res = 0;
            try
            {
                Connect();
                tr = conn.BeginTransaction();
                using (var cmd = new SQLiteCommand(conn))
                {
                    cmd.CommandType = CommandType.Text;
                    foreach (string sql in sqls)
                    {
                        if (string.IsNullOrEmpty(sql) || string.IsNullOrWhiteSpace(sql))
                            continue;
                        cmd.CommandText = sql;
                        res += cmd.ExecuteNonQuery();
                    }
                }
                tr.Commit();
                return res;
            }
            catch (Exception ex)
            {
                tr?.Rollback();
                throw ex;
            }
        }
        public DataTable GetDataTable(string Sql)
        {
            DataTable dataTable = new DataTable();
            try
            {
                Connect();
                using (var cmd = new SQLiteCommand(conn)
                {
                    CommandType = CommandType.Text,
                    CommandText = Sql
                })
                using (SQLiteDataAdapter sQLiteDataAdapter = new SQLiteDataAdapter()
                {
                    SelectCommand = cmd
                })
                {
                    sQLiteDataAdapter.Fill(dataTable);
                }
            }
            catch (Exception ex)
            {
                string message = "ExecuteSql Error:" + ex.Message;
                throw new Exception(message);
            }
            return dataTable;
        }
        public string[,] GetDataTableToArray(string Sql)
        {
            try
            {
                DataTable dataTable = GetDataTable(Sql);
                string[,] array = new string[dataTable.Rows.Count, dataTable.Columns.Count];
                int num = 0;
                int num2 = 0;
                foreach (DataRow row in dataTable.Rows)
                {
                    num2 = 0;
                    object[] itemArray = row.ItemArray;
                    foreach (object obj in itemArray)
                    {
                        array[num, num2] = obj.ToString();
                        num2++;
                    }
                    num++;
                }
                return array;
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }
        public void Close()
        {
            try
            {
                if (conn.State == ConnectionState.Open)
                {
                    conn.Close();
                }
                if (conn != null)
                {
                    conn.Dispose();
                }
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }
        public bool HasData(string sql)
        {
            DataTable dataTable = GetDataTable(sql);
            return dataTable.Rows.Count > 0;
        }
        public string[] GetColumnNameFromTable(string TableName)
        {
            try
            {
                string sql = $"PRAGMA table_info('{TableName}')";
                DataTable dataTable = GetDataTable(sql);
                string[] array = new string[dataTable.Rows.Count];
                int num = 0;
                foreach (DataRow row in dataTable.Rows)
                {
                    array[num] = row.ItemArray[1].ToString();
                    num++;
                }
                return array;
            }
            catch (Exception ex)
            {
                throw new Exception("获取表字段名称失败:" + ex.Message);
            }
        }
        public string[] GetAllTableInFile()
        {
            try
            {
                string sql = "select name from sqlite_master where type = 'table' order by name";
                DataTable dataTable = GetDataTable(sql);
                string[] array = new string[dataTable.Rows.Count];
                int num = 0;
                foreach (DataRow row in dataTable.Rows)
                {
                    array[num] = row.ItemArray[0].ToString();
                    num++;
                }
                return array;
            }
            catch (Exception ex)
            {
                throw new Exception("获取表名失败:" + ex.Message);
            }
        }
        private void Connect()
        {
            if (conn.State == ConnectionState.Closed)
            {
                conn.ConnectionString = ConnectString;
                conn.Open();
            }
        }
        private void DisConnect()
        {
            if (conn.State == ConnectionState.Open)
            {
                conn.Close();
            }
        }
        public void Dispose()
        {
            this.Close();
        }
    }
}
HMI.DataViewer/DataViewer.xaml
@@ -10,7 +10,7 @@
             xmlns:pw="https://opensource.panuon.com/wpf"
             xmlns:pu="https://opensource.panuon.com/wpf-ui"
             xmlns:dp="clr-namespace:HMI.UI.DpUtil;assembly=HMI.UI"
             Background="{StaticResource WorkspaceBackground}"
             Background="{DynamicResource WorkspaceBackground}"
             Loaded="PluginControl_Loaded"
             d:DesignHeight="450" d:DesignWidth="800">
    <UserControl.Resources>
@@ -58,10 +58,12 @@
                
                <TextBlock Style="{StaticResource TitleBox}" FontSize="{StaticResource ContentFontSize2}" 
                           Text="{DynamicResource App.StartTime}"/>
                <pu:DateTimePicker Style="{StaticResource TimePicker}" SelectedDateTime="{x:Null}" x:Name="startTimeInput"/>
                <pu:DateTimePicker Style="{StaticResource TimePicker}"
                                   SelectedDateTime="{x:Null}" x:Name="startTimeInput"/>
                <TextBlock Style="{StaticResource TitleBox}" FontSize="{StaticResource ContentFontSize2}" 
                           Text="{DynamicResource App.EndTime}"/>
                <pu:DateTimePicker Style="{StaticResource TimePicker}" SelectedDateTime="{x:Null}" x:Name="endTimeInput"/>
                <pu:DateTimePicker Style="{StaticResource TimePicker}"
                                   SelectedDateTime="{x:Null}" x:Name="endTimeInput"/>
                
                <Button Style="{StaticResource QueryBtn}"
@@ -86,7 +88,7 @@
                <pu:Drawer DockPanel.Dock="Left" x:Name="DrwMenu" MinWidth="35" MaxWidth="400"
                           Padding="0"
                           ShadowColor="{x:Null}"
                           AnimationDuration="0" BorderThickness="2,0,0,2" BorderBrush="{StaticResource CommonBoarder}">
                           AnimationDuration="0" BorderThickness="2,0,0,2" BorderBrush="{DynamicResource CommonBoarder}">
                    <Grid>
                        <Grid.RowDefinitions>
                            <RowDefinition Height="Auto"/>
@@ -97,14 +99,14 @@
                            <ColumnDefinition Width="Auto"/>
                        </Grid.ColumnDefinitions>
                        <Border Grid.ColumnSpan="2" BorderThickness="2" BorderBrush="{StaticResource CommonBoarder}" Background="{StaticResource VerBar}">
                        <Border Grid.ColumnSpan="2" BorderThickness="2" BorderBrush="{DynamicResource CommonBoarder}" Background="{DynamicResource VerBar}">
                            <DockPanel Height="35">
                                <ToggleButton x:Name="drawerBtn" BorderThickness="0"
                  DockPanel.Dock="Right"
                  Background="Transparent"
                  Width="35" Height="35" HorizontalAlignment="Right"
                  RenderTransformOrigin="0.5,0.5"
                                              Foreground="{StaticResource PrimaryColorContract}"
                                              Foreground="{DynamicResource PrimaryColorContract}"
                  FontFamily="{StaticResource iconfont}"
                  Content="&#xe60e;" IsChecked="{Binding IsOpen, ElementName=DrwMenu, Mode=TwoWay}">
                                    <ToggleButton.Style>
@@ -134,7 +136,7 @@
                                </ToggleButton>
                                <TextBlock Text="{DynamicResource Dv.Advanced}" FontSize="16" 
                                           Foreground="{StaticResource PrimaryColorContract}"
                                           Foreground="{DynamicResource PrimaryColorContract}"
                                           VerticalAlignment="Center" HorizontalAlignment="Center"/>
                            </DockPanel>
                        </Border>
@@ -170,13 +172,13 @@
                                        </DataGridTemplateColumn.CellTemplate>
                                    </DataGridTemplateColumn>
                                    <DataGridTextColumn IsReadOnly="True" Width="*" Binding="{Binding Key}">
                                    <DataGridTextColumn IsReadOnly="True" Width="80" Binding="{Binding Name}">
                                        <DataGridTextColumn.Header>
                                            <TextBlock Text="{DynamicResource Dv.Field}"/>
                                        </DataGridTextColumn.Header>
                                    </DataGridTextColumn>
                                    <DataGridTemplateColumn Width="*">
                                    <DataGridTemplateColumn Width="60">
                                        <DataGridTemplateColumn.Header>
                                            <TextBlock Text="{DynamicResource Dv.Condition}"/>
                                        </DataGridTemplateColumn.Header>
@@ -242,11 +244,11 @@
                    </Grid>
                </pu:Drawer>
                <DataGrid BorderThickness="2" BorderBrush="{StaticResource CommonBoarder}" x:Name="dataTable"
                <!-- SelectionUnit="CellOrRowHeader"
SelectionMode="Extended" -->
                <DataGrid BorderThickness="2" BorderBrush="{DynamicResource CommonBoarder}" x:Name="dataTable"
                          Style="{StaticResource DefaultDataGrid}"
                          SelectionUnit="CellOrRowHeader"
                          SelectionMode="Extended"
                          pu:DataGridHelper.CellSelectedBackground="{StaticResource PrimaryColor}"
                          EnableRowVirtualization="True"
                          PreviewMouseLeftButtonDown="dataTable_PreviewMouseLeftButtonDown">
                    <DataGrid.Columns>
                        <DataGridTemplateColumn Header="#" IsReadOnly="True" CanUserResize="False">
HMI.DataViewer/DataViewer.xaml.cs
@@ -2,22 +2,40 @@
using HMI.Core.Util;
using HMI.DataViewer.Entity;
using HMI.UI.Util;
using NPOI.SS.Formula.Functions;
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Data;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
using System.Windows.Data;
using System.Windows.Forms;
using System.Windows.Media;
namespace HMI.DataViewer
{
    public class DefaultValueConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (value is DateTime date)
            {
                return date.ToString("yyyy-MM-dd HH:mm:ss");
            }
            return value.ToString();
        }
        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            return value;
        }
    }
    /// <summary>
    /// UserControl1.xaml çš„交互逻辑
    /// </summary>
@@ -27,6 +45,7 @@
        {
            DataContext = this;
            InitializeComponent();
            DefaultDate();
        }
        private string SourceFilePath;
@@ -46,6 +65,8 @@
        }
        private Dictionary<string, DataBase_Setting> Map = new Dictionary<string, DataBase_Setting>();
        private IValueConverter defaultConverter = new DefaultValueConverter();
        private void Button_Click(object sender, RoutedEventArgs e)
        {
@@ -141,10 +162,16 @@
            }
        }
        private void DefaultDate()
        {
            var now = DateTime.Now;
            startTimeInput.SelectedDateTime = DateTime.Parse(now.ToString("yyyy-MM-dd"));
            endTimeInput.SelectedDateTime = DateTime.Parse(now.AddDays(1).ToString("yyyy-MM-dd"));
        }
        private void ResetDataTable()
        {
            startTimeInput.SelectedDateTime = null;
            endTimeInput.SelectedDateTime = null;
            DefaultDate();
            dataTable.ItemsSource = null;
            foreach (var data in Datas)
            {
@@ -256,7 +283,10 @@
            DataGridTextColumn textColumn = new DataGridTextColumn
            {
                Header = header,
                Binding = new System.Windows.Data.Binding(bindingPath),
                Binding = new System.Windows.Data.Binding(bindingPath)
                {
                    Converter = defaultConverter
                },
                Width = new DataGridLength(1, DataGridLengthUnitType.Star)
            };
            dataTable.Columns.Add(textColumn);
@@ -265,41 +295,41 @@
        private void dataTable_PreviewMouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
        {
            // èŽ·å–ç‚¹å‡»çš„å…ƒç´ 
            DependencyObject dep = (DependencyObject)e.OriginalSource;
            //// èŽ·å–ç‚¹å‡»çš„å…ƒç´ 
            //DependencyObject dep = (DependencyObject)e.OriginalSource;
            // éåŽ†æ‰¾åˆ° DataGridColumnHeader
            while (dep != null && !(dep is DataGridColumnHeader) && !(dep is DataGridRow))
            {
                dep = VisualTreeHelper.GetParent(dep);
            }
            HMI.UI.DpUtil.DataGridHelper.SetSelectedColumn(dataTable, null);
            //// éåŽ†æ‰¾åˆ° DataGridColumnHeader
            //while (dep != null && !(dep is DataGridColumnHeader) && !(dep is DataGridRow))
            //{
            //    dep = VisualTreeHelper.GetParent(dep);
            //}
            //HMI.UI.DpUtil.DataGridHelper.SetSelectedColumn(dataTable, null);
            if (dep is DataGridColumnHeader columnHeader)
            {
                // èŽ·å–åˆ—ç´¢å¼•
                int columnIndex = columnHeader.Column.DisplayIndex;
            //if (dep is DataGridColumnHeader columnHeader)
            //{
            //    // èŽ·å–åˆ—ç´¢å¼•
            //    int columnIndex = columnHeader.Column.DisplayIndex;
                // æ¸…除已有选择
                dataTable.SelectedCells.Clear();
            //    // æ¸…除已有选择
            //    dataTable.SelectedCells.Clear();
                // éåŽ†æ‰€æœ‰è¡Œï¼Œé€‰ä¸­è¯¥åˆ—çš„æ‰€æœ‰å•å…ƒæ ¼
                foreach (var item in dataTable.Items)
                {
                    DataGridCellInfo cellInfo = new DataGridCellInfo(item, columnHeader.Column);
                    dataTable.SelectedCells.Add(cellInfo);
                }
                HMI.UI.DpUtil.DataGridHelper.SetSelectedColumn(dataTable, columnHeader.Column);
            //    // éåŽ†æ‰€æœ‰è¡Œï¼Œé€‰ä¸­è¯¥åˆ—çš„æ‰€æœ‰å•å…ƒæ ¼
            //    foreach (var item in dataTable.Items)
            //    {
            //        DataGridCellInfo cellInfo = new DataGridCellInfo(item, columnHeader.Column);
            //        dataTable.SelectedCells.Add(cellInfo);
            //    }
            //    HMI.UI.DpUtil.DataGridHelper.SetSelectedColumn(dataTable, columnHeader.Column);
                e.Handled = true; // é˜²æ­¢é»˜è®¤è¡Œä¸º
            }
            else if (dep is DataGridRow row)
            {
                // æ¸…除已有选择
                dataTable.SelectedCells.Clear();
                dataTable.SelectedItem = row.Item;
                e.Handled = true;
            }
            //    e.Handled = true; // é˜²æ­¢é»˜è®¤è¡Œä¸º
            //}
            //else if (dep is DataGridRow row)
            //{
            //    // æ¸…除已有选择
            //    dataTable.SelectedCells.Clear();
            //    dataTable.SelectedItem = row.Item;
            //    e.Handled = true;
            //}
        }
        private DataTable DoSearchData(DataBase_Setting setting, List<QueryData> datas)
@@ -326,15 +356,62 @@
                conditon += $" AND {timeCol} < '{endTimeInput.Text}'";
            }
            SqliteHelper helper = null;
            string sql = string.Empty;
            string sql = $"SELECT {fields} FROM {setting.TableName} {conditon}";
            DataTable dt = new DataTable();
            if (string.IsNullOrEmpty(setting.Pattern))
            {
            try
            {
                helper = new SqliteHelper(setting.DBFilePath);
                sql = $"SELECT {fields} FROM {setting.TableName} {conditon}";
                DataTable dt = helper.GetDataTable(sql);
                HMI.UI.DpUtil.DataGridHelper.SetSelectedColumn(dataTable, null);
                dataTable.ItemsSource = dt.DefaultView;
                    using (var helper = new Sqlite3Helper(setting.DBFilePath))
                    {
                        dt = helper.GetDataTable(sql);
                    }
                }
                catch (Exception ex)
                {
                    log.Error($"Select Data Failed. SQL: {sql}", ex);
                    throw ex;
                }
            }
            else
            {
                // é€šé…ç¬¦
                try
                {
                    string dir = Path.GetDirectoryName(setting.DBFilePath);
                    string startName = $"Data_{startTimeInput.SelectedDateTime?.ToString("yyyyMMdd")}";
                    string endName = $"Data_{endTimeInput.SelectedDateTime?.ToString("yyyyMMdd")}";
                    var oldFiles = Directory.GetFiles(dir, "Data_*.db");
                    oldFiles = oldFiles.Where(file =>
                    {
                        var fileName = Path.GetFileNameWithoutExtension(file);
                        bool flag = true;
                        flag &= (string.Compare(fileName, startName) == 1 || fileName == startName);
                        flag &= (string.Compare(endName, fileName) == 1 || fileName == endName);
                        return flag;
                    }).ToArray();
                    if (oldFiles == null || oldFiles.Length <= 0)
                    {
                        return dt;
                    }
                    foreach (string file in oldFiles)
                    {
                        try
                        {
                            using (var helper = new SqliteHelper(file))
                            {
                                var temp = helper.GetDataTable(sql);
                                dt.Merge(temp);
                            }
                        }
                        catch
                        {
                        }
                    }
                return dt;
            }
            catch (Exception ex)
@@ -342,10 +419,10 @@
                log.Error($"Select Data Failed. SQL: {sql}", ex);
                throw ex;
            }
            finally
            {
                helper?.Close();
            }
            //HMI.UI.DpUtil.DataGridHelper.SetSelectedColumn(dataTable, null);
            //dt.
            return dt;
        }
        private void SearchData()
@@ -370,7 +447,7 @@
            try
            {
                DoSearchData(setting, datas);
                dataTable.ItemsSource = DoSearchData(setting, datas).DefaultView;
            }
            catch (Exception ex)
            {
@@ -380,6 +457,7 @@
        private void ExportData()
        {
            int maxRow = 1048575;
            try
            {
                string program = programInput.Text;
@@ -396,7 +474,8 @@
                }
                var datas = Datas?.Where(d => !string.IsNullOrEmpty(d.Value)).ToList();
                if (datas == null || datas.Count <= 0)
                if ((datas == null || datas.Count <= 0) &&
                    (string.IsNullOrEmpty(startTimeInput.Text) || string.IsNullOrEmpty(endTimeInput.Text)))
                {
                    ToastHelper.Warning(Window.GetWindow(this), this.lang("Dv.QueryCantBeEmpty"));
                    return;
@@ -422,7 +501,7 @@
                SaveFileDialog sfd = new SaveFileDialog();
                sfd.Filter = "";
                sfd.DefaultExt = "xls";
                sfd.DefaultExt = "xlsx";
                sfd.FileName = setting.Program;
                if (sfd.ShowDialog() == DialogResult.OK)
                {
@@ -433,19 +512,30 @@
                1.引入库文件,新建lib文件夹,复制相关文件  
                2.在项目中添加对这几个dll的引用  
                3.在内存中建立 excel表文件  */
                XSSFWorkbook workbook = new XSSFWorkbook();
                workbook.CreateSheet("sheet1");////新建一个工作表
                XSSFSheet SheetOne = (XSSFSheet)workbook.GetSheet("Sheet1"); ////获取名称为Sheet1的工作表,创建标题头
                IRow row1 = SheetOne.CreateRow(0);////获取Sheet1工作表的首行,设置表头,获取列
                //XSSFCell[] SheetCell = new XSSFCell[currentColumns.Count];
                for (int i = 0; i < currentColumns.Count; i++)
                using (FileStream fs = new FileStream(fname, FileMode.Create))
                {
                    row1.CreateCell(i).SetCellValue(currentColumns[i].Header.ToString());
                }
                    XSSFWorkbook workbook = new XSSFWorkbook();
                    int row = 1;
                for (int i = 0; i < dataView.Count; i++)
                {
                    IRow rowTemp = SheetOne.CreateRow(i + 1);
                        int sheetIndex = sheetIndex = i / maxRow;
                        string sheetName = $"sheet{sheetIndex + 1}";
                        var sheet = (XSSFSheet)workbook.GetSheet(sheetName);
                        if (sheet == null)
                        {
                            sheet = (XSSFSheet)workbook.CreateSheet(sheetName);
                            IRow row1 = sheet.CreateRow(0);
                            for (int j = 0; j < currentColumns.Count; j++)
                            {
                                row1.CreateCell(j).SetCellValue(currentColumns[j].Header.ToString());
                            }
                            row = 1;
                        }
                        IRow rowTemp = sheet.CreateRow(row++);
                    for (int j = 0; j < currentColumns.Count; j++)
                    {
                        string name = ((System.Windows.Data.Binding)currentColumns[j].Binding).Path.Path;
@@ -454,8 +544,6 @@
                    }
                }
                using (FileStream fs = new FileStream(fname, FileMode.Create))
                {
                    workbook.Write(fs);
                }
                ToastHelper.Success(Window.GetWindow(this), this.lang("App.ExportSuccess"));
HMI.DataViewer/DbSettingModal.xaml
@@ -22,6 +22,7 @@
        <StackPanel x:Name="formPanel">
            <pu:FormGroup Header="{DynamicResource Dv.Datasource.Name}"
                          dp:FormGroupHelper.IsRequired="True"
                          dp:FormGroupHelper.ValidateMethod="ValidateName"
                          Style="{StaticResource InputFormGroupStyle}"
                          GroupName="MyFormGroup">
                <TextBox Style="{StaticResource EditorTextBoxStyle}" x:Name="programInput"/>
@@ -36,7 +37,7 @@
                        <ColumnDefinition/>
                        <ColumnDefinition Width="Auto"/>
                    </Grid.ColumnDefinitions>
                    <TextBox Style="{StaticResource EditorTextBoxStyle}" IsReadOnly="True" x:Name="dbFilePathInput"/>
                    <TextBox Style="{StaticResource EditorTextBoxStyle}" IsReadOnly="False" x:Name="dbFilePathInput"/>
                    <Button Style="{StaticResource SearchButton}" x:Name="searchBtn" Click="Button_Click" Grid.Column="1"/>
                </Grid>
            </pu:FormGroup>
@@ -49,6 +50,10 @@
                          x:Name="tableNameInput" SelectionChanged="ComboxSelectionChanged"/>
            </pu:FormGroup>
            <pu:FormGroup Header="通配符" Style="{StaticResource InputFormGroupStyle}" GroupName="MyFormGroup">
                <TextBox Style="{StaticResource EditorTextBoxStyle}" x:Name="TbPattern"/>
            </pu:FormGroup>
            <pu:FormGroup Header="{DynamicResource Dv.Datasource.Fields}" Orientation="Vertical" GroupName="MyFormGroup">
                <Grid dp:GridHelper.Space="10">
                    <Grid.ColumnDefinitions>
@@ -59,7 +64,6 @@
                    <DataGrid Style="{StaticResource DefaultDataGrid}"
                              BorderThickness="1"
                              pu:DataGridHelper.ColumnHeaderFontSize="12"
                              SelectionMode="Extended"
                              ItemsSource="{Binding Columns}" x:Name="columnTable">
                        <DataGrid.Columns>
@@ -86,15 +90,13 @@
                        <Button Style="{StaticResource PrimaryButton}" x:Name="addBtn" Click="Button_Click"
                                Content="{DynamicResource App.AddTo}"/>
                        <Button Style="{StaticResource PrimaryButton}" x:Name="delBtn" Click="Button_Click"
                                Content="{DynamicResource App.Delete}"
                                />
                                Content="{DynamicResource App.Delete}" />
                    </StackPanel>
                    <DataGrid Grid.Column="2" Style="{StaticResource DefaultDataGrid}"
                              BorderThickness="1"
                              IsReadOnly="False"
                              SelectionMode="Extended"
                              pu:DataGridHelper.ColumnHeaderFontSize="12"
                              ItemsSource="{Binding Conditions}" x:Name="conditionTable">
                        <DataGrid.Columns>
                            <DataGridTemplateColumn Header="#" CanUserResize="False" IsReadOnly="True">
HMI.DataViewer/DbSettingModal.xaml.cs
@@ -6,7 +6,6 @@
using Microsoft.Win32;
using Panuon.WPF.UI;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.IO;
@@ -102,10 +101,15 @@
            base.OnClosing(e);
        }
        public bool ValidateDBAddress(object value, out string err)
        public bool ValidateName(object value, out string err)
        {
            err = null;
            var target = Datasource.FirstOrDefault(e => e.Program == value.ToString());
            if (target != null && target != Data)
            {
                err = this.lang("App.MustBeUnique", LangUtil.Get("Dv.Datasource.Name")); ;
                return false;
            }
            return true;
        }
@@ -117,6 +121,7 @@
                Data.Program = programInput.Text;
                Data.DBFilePath = dbFilePathInput.Text;
                Data.TableName = tableNameInput.Text;
                Data.Pattern = TbPattern.Text;
                Data.TimeCol = Conditions.FirstOrDefault(c => c.IsTimeCol)?.Key;
                Data.Condition = Conditions;
            }
@@ -135,7 +140,7 @@
            programInput.Text = Data.Program;
            dbFilePathInput.Text = Data.DBFilePath;
            tableNameInput.Text = Data.TableName;
            Conditions = data?.Condition ?? new ObservableCollection<QueryCondition>();
            TbPattern.Text = Data.Pattern;
            if (!string.IsNullOrEmpty(Data.DBFilePath) && File.Exists(Data.DBFilePath))
            {
@@ -144,6 +149,7 @@
                tableNameInput.SelectedItem = Data.TableName;
                UpdateColumnSource(Data.TableName);
            }
            Conditions = data?.Condition ?? new ObservableCollection<QueryCondition>();
            return this.ShowDialog();
        }
@@ -204,7 +210,7 @@
            }
            else if (Helper.DataBaseFile != filePath)
            {
                Helper.Close();
                //Helper.Close();
                Helper = new SqliteHelper(filePath);
            }
        }
@@ -267,7 +273,7 @@
        private void ComboxSelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            UpdateColumnSource(e.AddedItems[0].ToString());
            Conditions = new ObservableCollection<QueryCondition>();
            //Conditions = new ObservableCollection<QueryCondition>();
        }
        private void RadioButton_Click(object sender, System.Windows.RoutedEventArgs e)
HMI.DataViewer/Entity/DataBase_Setting.cs
@@ -60,6 +60,16 @@
            set { Set(ref dBFilePath, value); }
        }
        
        private string pattern;
        public string Pattern
        {
            get => pattern;
            set
            {
                Set(ref pattern, value);
            }
        }
        public string TimeCol
        {
            get => timeCol;
HMI.LogViewer/LogViewer.xaml
@@ -11,7 +11,7 @@
             xmlns:pu="https://opensource.panuon.com/wpf-ui"
             xmlns:dp="clr-namespace:HMI.UI.DpUtil;assembly=HMI.UI"
             Loaded="UserControl_Loaded"
             Background="{StaticResource WorkspaceBackground}"
             Background="{DynamicResource WorkspaceBackground}"
             d:DesignHeight="450" d:DesignWidth="800">
    <UserControl.Resources>
        <ResourceDictionary>
@@ -73,8 +73,8 @@
                            x:Name="queryBtn" Click="Button_Click"/>
                    <Button Style="{StaticResource RfhBtn}"
                            x:Name="resetBtn" Click="Button_Click"/>
                    <Button x:Name="exportBtn"
                            Style="{StaticResource ExportBtn}" Click="Button_Click"/>
                    <!--<Button x:Name="exportBtn"
                            Style="{StaticResource ExportBtn}" Click="Button_Click"/>-->
                </StackPanel>
                <StackPanel Style="{StaticResource ButtonGroup}" HorizontalAlignment="Left">
@@ -110,10 +110,10 @@
                        <Setter Property="Height" Value="{StaticResource nanD}" />
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding level}" Value="Warn">
                                <Setter Property="Foreground" Value="{StaticResource WarningColor}"/>
                                <Setter Property="Foreground" Value="{DynamicResource WarningColor}"/>
                            </DataTrigger>
                            <DataTrigger Binding="{Binding level}" Value="Error">
                                <Setter Property="Foreground" Value="{StaticResource DangerColor}"/>
                                <Setter Property="Foreground" Value="{DynamicResource DangerColor}"/>
                            </DataTrigger>
                            <Trigger Property="IsSelected" Value="True">
                                <Setter Property="Background" Value="Transparent"/>
@@ -201,11 +201,11 @@
                    <Style TargetType="DataGridRow" BasedOn="{StaticResource {x:Static pu:StyleKeys.DataGridRowStyle}}">
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding level}" Value="Warn">
                                <Setter Property="Background" Value="{StaticResource WarningColor}"/>
                                <Setter Property="Background" Value="{DynamicResource WarningColor}"/>
                                <Setter Property="Foreground" Value="Black"/>
                            </DataTrigger>
                            <DataTrigger Binding="{Binding level}" Value="Error">
                                <Setter Property="Background" Value="{StaticResource DangerColor}"/>
                                <Setter Property="Background" Value="{DynamicResource DangerColor}"/>
                                <Setter Property="Foreground" Value="Black"/>
                            </DataTrigger>
                            <Trigger Property="IsSelected" Value="True">
@@ -277,11 +277,11 @@
                    <Style TargetType="ListViewItem" BasedOn="{StaticResource {x:Static pu:StyleKeys.ListViewItemStyle}}">
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding level}" Value="Warn">
                                <Setter Property="Background" Value="{StaticResource WarningColor}"/>
                                <Setter Property="Background" Value="{DynamicResource WarningColor}"/>
                                <Setter Property="Foreground" Value="Black"/>
                            </DataTrigger>
                            <DataTrigger Binding="{Binding level}" Value="Error">
                                <Setter Property="Background" Value="{StaticResource DangerColor}"/>
                                <Setter Property="Background" Value="{DynamicResource DangerColor}"/>
                                <Setter Property="Foreground" Value="Black"/>
                            </DataTrigger>
                            <Trigger Property="IsSelected" Value="True">
HMI.LogViewer/LogViewer.xaml.cs
@@ -116,12 +116,17 @@
                    QueryReset();
                    break;
                case "exportBtn":
                    DoExport();
                    break;
                default:
                    break;
            }
        }
        private void DoExport() {
        }
        private void QueryLog()
        {
            try
HMI.MenuManage/MenuManage.xaml
@@ -13,7 +13,7 @@
             mc:Ignorable="d" 
             Padding="10"
             Loaded="DataGrid_Loaded"
             Background="{StaticResource WorkspaceBackground}"
             Background="{DynamicResource WorkspaceBackground}"
             d:DesignHeight="450" d:DesignWidth="800">
    <UserControl.Resources>
        
HMI.MenuManage/Modal/IconSelector.xaml
@@ -18,7 +18,6 @@
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="/HMI.UI;component/Resources/Font/Font.xaml"/>
                <ResourceDictionary Source="/HMI.UI;component/Style/Colors.xaml"/>
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Window.Resources>
HMI.MenuManage/Modal/RoleModal.xaml
@@ -9,8 +9,8 @@
            xmlns:dp="clr-namespace:HMI.UI.DpUtil;assembly=HMI.UI"
            mc:Ignorable="d"
            Title="Form"
            SizeToContent="Height"
            Width="600"
            Height="800"
            WindowStartupLocation="CenterOwner"
            Style="{StaticResource ModalWindow}">
    <Grid Margin="10">
@@ -32,6 +32,8 @@
            <pu:FormGroup x:Name="FgMenu" Orientation="Vertical" Style="{StaticResource RequiredInputFormGroupStyle}" 
                              Header="{DynamicResource HMI.Role.Permission}" GroupName="MyFormGroup">
                <TreeView x:Name="menuTree" Grid.Column="1" Style="{StaticResource DefaultTreeView}" 
                          MaxHeight="550"
                          ItemsSource="{Binding TreeDataSource}">
                    <TreeView.ItemTemplate>
                        <HierarchicalDataTemplate ItemsSource="{Binding Children}">
HMI.MenuManage/Modal/UserModal.xaml
@@ -39,7 +39,8 @@
            <pu:FormGroup x:Name="FgPassword" Style="{StaticResource InputFormGroupStyle}"
                          Header="{DynamicResource HMI.User.Password}" 
                          dp:FormGroupHelper.IsRequired="True" GroupName="MyFormGroup">
                <TextBox x:Name="TbPassword" Style="{StaticResource EditorTextBoxStyle}" />
                <PasswordBox x:Name="TbPassword" pu:PasswordBoxHelper.PlainButtonVisibility="VisibleOnHover"
                             Style="{StaticResource SignInPasswordBoxStyle}" />
            </pu:FormGroup>
            <pu:FormGroup x:Name="FgRoleCode" Orientation="Vertical"
HMI.MenuManage/Modal/UserModal.xaml.cs
@@ -104,7 +104,7 @@
                Data.Code = TbCode.Text;
                Data.Username = TbUsername.Text;
                Data.Name = TbName.Text;
                Data.Password = TbPassword.Text;
                Data.Password = TbPassword.Password;
            }
            return flag;
@@ -116,7 +116,7 @@
            TbCode.Text = Data.Code;
            TbUsername.Text = Data.Username;
            TbName.Text = Data.Name;
            TbPassword.Text = Data.Password;
            TbPassword.Password = Data.Password;
            Roles = UserRoleRelHelper.SelectUserRoleData(sqliteHelper, Data.Username);
HMI.MenuManage/UserManage.xaml
@@ -9,7 +9,7 @@
xmlns:pw="https://opensource.panuon.com/wpf"
xmlns:pu="https://opensource.panuon.com/wpf-ui"
             mc:Ignorable="d" 
             Background="{StaticResource WorkspaceBackground}"
             Background="{DynamicResource WorkspaceBackground}"
             Padding="10"
             d:DesignHeight="450" d:DesignWidth="800">
    <UserControl.Resources>
HMI.MenuManage/Util/UserRoleRelHelper.cs
@@ -1,15 +1,10 @@
using System;
using HMI.Core.Util;
using HMI.MenuManage.Entity;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Web.Security;
using System.Windows.Markup;
using DatabaseHelper;
using HMI.Core.Util;
using HMI.MenuManage.Entity;
namespace HMI.MenuManage.Util
{
HMI.ParameterManage/Model/XmlModel.cs
@@ -96,7 +96,6 @@
            if (SelectedProduct != null)
            {
                parameters = ProductManager.GetParametersByProductName<ObservableCollection<ParameterData>>(SelectedProduct.Name);
            }
            parameters = parameters ?? new ObservableCollection<ParameterData>();
            Parameters = parameters;
HMI.ParameterManage/ParameterManage.xaml
@@ -13,14 +13,9 @@
             mc:Ignorable="d" 
             Padding="10"
             Loaded="UserControl_Loaded"
             Background="{StaticResource WorkspaceBackground}"
             Background="{DynamicResource WorkspaceBackground}"
             d:DesignHeight="450" d:DesignWidth="800">
    <UserControl.Resources>
        <!--<ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="/HMI.UI;component/Style/PanuonDataGrid.xaml"/>
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>-->
        <CollectionViewSource x:Key="GroupFilter" Source="{Binding Parameters}">
            <CollectionViewSource.GroupDescriptions>
                <PropertyGroupDescription PropertyName="ShowGroup" />
@@ -143,7 +138,7 @@
                    </DataGrid.GroupStyle>
                    <DataGrid.Columns>
                        <DataGridTemplateColumn Header="" Width="Auto" CanUserResize="False">
                        <DataGridTemplateColumn Width="Auto" CanUserResize="False">
                            <DataGridTemplateColumn.CellTemplate>
                                <DataTemplate>
                                    <CheckBox VerticalAlignment="Center" 
@@ -152,7 +147,7 @@
                            </DataGridTemplateColumn.CellTemplate>
                        </DataGridTemplateColumn>
                        <DataGridTextColumn Header="#" Binding="{Binding Converter={StaticResource rowNumber},
                        <DataGridTextColumn Header="#" Width="40" Binding="{Binding Converter={StaticResource rowNumber},
RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type DataGridRow},AncestorLevel=1}}"
        CanUserResize="False"/>
                        <DataGridTextColumn Width="150" Binding="{Binding Name}">
@@ -175,7 +170,7 @@
                                <TextBlock Text="{DynamicResource Pm.Parameter.Unit}"/>
                            </DataGridTextColumn.Header>
                        </DataGridTextColumn>
                        <DataGridTextColumn Width="120" Binding="{Binding Description}">
                        <DataGridTextColumn Width="*" Binding="{Binding Description}">
                            <DataGridTextColumn.Header>
                                <TextBlock Text="{DynamicResource Pm.Parameter.Desc}"/>
                            </DataGridTextColumn.Header>
HMI.ParameterManage/ParameterManage.xaml.cs
@@ -30,6 +30,7 @@
        private void UserControl_Loaded(object sender, RoutedEventArgs e)
        {
            Model.LoadProducts();
            Model.LoadParameters();
            Loaded -= UserControl_Loaded;
        }
@@ -157,6 +158,5 @@
                Model.LoadParameters();
            }
        }
    }
}
HMI.ParameterManage/ParameterSetting.xaml
@@ -12,7 +12,7 @@
             xmlns:cc="clr-namespace:HMI.Core;assembly=HMI.Core"
             mc:Ignorable="d"
             Loaded="UserControl_Loaded"
             Background="{StaticResource WorkspaceBackground}"
             Background="{DynamicResource WorkspaceBackground}"
             d:DesignHeight="450" d:DesignWidth="800">
    <UserControl.Resources>
        <ResourceDictionary>
@@ -90,7 +90,7 @@
                </DataGrid.GroupStyle>
                <DataGrid.Columns>
                    <DataGridTemplateColumn Header="" Width="Auto" CanUserResize="False">
                    <DataGridTemplateColumn Width="20" CanUserResize="False">
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <CheckBox VerticalAlignment="Center" 
@@ -98,7 +98,7 @@
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>
                    <DataGridTemplateColumn Header="#" CanUserResize="False">
                    <DataGridTemplateColumn Header="#" Width="30" CanUserResize="False">
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <TextBlock Text="{Binding Converter={StaticResource rowNumber},
HMI.ParameterManage/ParameterSetting.xaml.cs
@@ -1,6 +1,7 @@
using HMI.Base;
using HMI.Core.Entity;
using HMI.Core.Manager;
using HMI.Core.Setting;
using HMI.Core.Util;
using HMI.UI.Util;
using HMI.Util;
@@ -9,7 +10,6 @@
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text.RegularExpressions;
using System.Windows;
using System.Windows.Controls;
@@ -248,5 +248,21 @@
            Loaded -= UserControl_Loaded;
        }
        public override bool CanActive()
        {
            if (ParamSetting.IsOptRequirePassword)
            {
                var win = new RequirePasswordWindow
                {
                    Owner = Window.GetWindow(this),
                    WindowStartupLocation = WindowStartupLocation.CenterScreen
                };
                return win.ShowDialog() == true;
            }
            else
            {
                return true;
            }
        }
    }
}
HMI.ParameterManage/ProductModal.xaml
@@ -27,7 +27,7 @@
                <TextBox x:Name="TbName" Style="{StaticResource EditorTextBoxStyle}" />
            </pu:FormGroup>
            <pu:FormGroup x:Name="FgIsMaster" Style="{StaticResource InputFormGroupStyle}"
            <pu:FormGroup x:Name="FgIsMaster" Style="{StaticResource InputFormGroupStyle}" Visibility="Collapsed"
                          Header="{DynamicResource Pm.Product.IsSample}" GroupName="MyFormGroup">
                <CheckBox x:Name="TbIsMaster"  />
            </pu:FormGroup>
HMI.ParameterManage/TestItem.xaml
@@ -10,7 +10,7 @@
             xmlns:pw="https://opensource.panuon.com/wpf"
             xmlns:pu="https://opensource.panuon.com/wpf-ui"
             xmlns:dp="clr-namespace:HMI.UI.DpUtil;assembly=HMI.UI"
             Background="{StaticResource WorkspaceBackground}"
             Background="{DynamicResource WorkspaceBackground}"
             Loaded="PluginControl_Loaded"
             d:DesignHeight="450" d:DesignWidth="800">
    <UserControl.Resources>
@@ -68,7 +68,7 @@
                    <ColumnDefinition Width="2*"/>
                    <ColumnDefinition Width="8*"/>
                </Grid.ColumnDefinitions>
                <Border Grid.Column="0" BorderThickness="2,2,0,2" BorderBrush="{StaticResource CommonBoarder}">
                <Border Grid.Column="0" BorderThickness="2,2,0,2" BorderBrush="{DynamicResource CommonBoarder}">
                    <DataGrid Style="{StaticResource DefaultDataGrid}" 
                          ItemsSource="{Binding Products}"
                          SelectedItem="{Binding SelectedProduct}">
@@ -89,7 +89,7 @@
                        </DataGrid.Columns>
                    </DataGrid>
                </Border>
                <Border Grid.Column="1" BorderThickness="2" BorderBrush="{StaticResource CommonBoarder}">
                <Border Grid.Column="1" BorderThickness="2" BorderBrush="{DynamicResource CommonBoarder}">
                    <DataGrid Style="{StaticResource DefaultDataGrid}" ItemsSource="{Binding TestItems}">
                        <DataGrid.Columns>
                            <DataGridTemplateColumn Header="" Width="Auto" CanUserResize="False">
HMI.SettingControl/SettingControl.xaml
@@ -11,7 +11,7 @@
            xmlns:pu="https://opensource.panuon.com/wpf-ui"
            xmlns:dp="clr-namespace:HMI.UI.DpUtil;assembly=HMI.UI"
             Loaded="UserControl_Loaded"
             Background="{StaticResource WorkspaceBackground}"
             Background="{DynamicResource WorkspaceBackground}"
             d:DesignHeight="450" d:DesignWidth="800">
    <UserControl.Resources>
        <ResourceDictionary>
@@ -33,23 +33,23 @@
                    <RowDefinition />
                    <RowDefinition Height="Auto"/>
                </Grid.RowDefinitions>
                <TextBlock VerticalAlignment="Center" Text="系统设置" FontSize="{StaticResource TitleFontSize}" />
                <TextBlock VerticalAlignment="Center" Text="{DynamicResource Setting.SystemSetting}" FontSize="{StaticResource TitleFontSize}" />
                <TabControl Grid.Row="1" x:Name="tabControl"
                            pu:TabControlHelper.ItemsSelectedBackground="{StaticResource HoriBar}"
                            pu:TabControlHelper.ItemsSelectedForeground="{StaticResource PrimaryColorContract}"
                            pu:TabControlHelper.ItemsSelectedBackground="{DynamicResource HoriBar}"
                            pu:TabControlHelper.ItemsSelectedForeground="{DynamicResource PrimaryColorContract}"
                            pu:TabControlHelper.ItemsFontSize="14"
                            pu:TabControlHelper.ItemsRibbonLineVisibility="Visible"
                            pu:TabControlHelper.ItemsRibbonLinePlacement="Right"
                            pu:TabControlHelper.HeaderPanelBorderThickness="0,0,1,0"
                            pu:TabControlHelper.HeaderPanelBorderBrush="{StaticResource CommonBoarder}"
                            pu:TabControlHelper.HeaderPanelBorderBrush="{DynamicResource CommonBoarder}"
                            pu:TabControlHelper.ItemsRibbonLineBrush="Transparent"
                            pu:TabControlHelper.ItemsSelectedRibbonLineBrush="{StaticResource PrimaryColorContract}"
                            pu:TabControlHelper.ItemsSelectedRibbonLineBrush="{DynamicResource PrimaryColorContract}"
                            pu:TabControlHelper.ItemsRibbonLineMargin="0,5,10,5"
                            pu:TabControlHelper.ItemsRibbonLineThickness="3"
                            Cursor="Hand"
                            pu:TabControlHelper.ItemsPadding="60,0"
                            TabStripPlacement="Left"
        BorderBrush="{StaticResource CommonBoarder}"
        BorderBrush="{DynamicResource CommonBoarder}"
        ItemsSource="{Binding TabItems}">
                </TabControl>
                <StackPanel Grid.Row="2" Style="{StaticResource ButtonGroup}">
HMI.SettingControl/SettingControl.xaml.cs
@@ -32,12 +32,14 @@
        private void UserControl_Loaded(object sender, RoutedEventArgs e)
        {
            TabItems = new ObservableCollection<TabItem>() {
                new TabItem
            var item = new TabItem
                {
                    Header = "系统设置",
                    Content = new SystemConfig()
                }
            };
            item.SetValue(TabItem.HeaderProperty, new DynamicResourceExtension("Setting.SystemSetting").ProvideValue(null));
            TabItems = new ObservableCollection<TabItem>() {
               item
            };
            foreach (var d in PluginLoader.Instance.Plugins)
            {
HMI.SettingControl/SystemConfig.xaml
@@ -48,6 +48,22 @@
                    </Grid>
                </pu:FormGroup>
                <pu:FormGroup x:Name="FgLoginLogo" Style="{StaticResource InputFormGroupStyle}"
              HeaderWidth="Auto"
              Header="Login Logo" GroupName="MyFormGroup">
                    <Grid>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition />
                            <ColumnDefinition Width="30" />
                        </Grid.ColumnDefinitions>
                        <TextBox x:Name="TbLoginLogo" IsReadOnly="True"
                 Text="{Binding LoginLogoPath}"
                                 FontFamily="{StaticResource iconfont}" Style="{StaticResource EditorTextBoxStyle}" />
                        <Button Grid.Column="1" BorderThickness="0,1,1,1" Style="{StaticResource SearchButton}"
                x:Name="BtnLoginLogo" Click="Button_Click"/>
                    </Grid>
                </pu:FormGroup>
                <pu:FormGroup Header="{DynamicResource Setting.Title}" HeaderWidth="Auto" GroupName="MyFormGroup">
                    <TextBox Text="{Binding WindowTitle}"/>
                </pu:FormGroup>
HMI.SettingControl/SystemConfig.xaml.cs
@@ -54,6 +54,9 @@
                case "BtnIcon":
                    OpenSelectIcon();
                    break;
                case "BtnLoginLogo":
                    OpenSelectIcon2();
                    break;
                default:
                    break;
            }
@@ -83,6 +86,30 @@
            }
        }
        private void OpenSelectIcon2()
        {
            string BasePath = PathHelper.IconFolder;
            OpenFileDialog openFileDialog = new OpenFileDialog();
            openFileDialog.Filter = "(*.*)|*.*";
            openFileDialog.InitialDirectory = BasePath;
            openFileDialog.Title = this.lang("App.SelectPic");
            openFileDialog.Multiselect = false;
            if (openFileDialog.ShowDialog() == true)
            {
                string FileName = openFileDialog.FileName;
                if (!FileName.StartsWith(BasePath))
                {
                    ToastHelper.Warning(Window.GetWindow(this), this.lang("App.IconMustInFolder"));
                }
                else
                {
                    Model.LoginLogoPath = FileName.Replace(BasePath, ".");
                }
            }
        }
        private void UserControl_Loaded(object sender, RoutedEventArgs e)
        {
            CbLang.ItemsSource = LangUtil.langs;
HMI.StdControl/StdEnableMes.xaml
@@ -8,5 +8,6 @@
             d:DesignHeight="450" d:DesignWidth="800">
    <CheckBox x:Name="CbEnableMes" IsChecked="{Binding EnableMes,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" 
              VerticalContentAlignment="Center"
              IsEnabled="{Binding CbEnabled}"
              Content="{DynamicResource Ts.EnableMes}" />
</UserControl>
HMI.StdControl/StdEnableMes.xaml.cs
@@ -2,6 +2,7 @@
using System;
using System.ComponentModel;
using System.Runtime.CompilerServices;
using System.Windows;
using System.Windows.Controls;
namespace HMI.StdControl
@@ -44,6 +45,21 @@
            }
        }
        public static DependencyProperty CbEnabledProperty = DependencyProperty.Register(
                            "CbEnabled",
                            typeof(bool),
                            typeof(StdEnableMes),
                            new FrameworkPropertyMetadata(true));
        public bool CbEnabled
        {
            get => (bool)GetValue(CbEnabledProperty);
            set
            {
                SetValue(CbEnabledProperty, value);
            }
        }
        private bool enableMes;
        public bool EnableMes
        {
HMI.UI/Controls/KeyboradWindow.xaml
@@ -216,7 +216,7 @@
                        <Style TargetType="Button" BasedOn="{StaticResource PrimaryButton}">
                            <Style.Triggers>
                                <DataTrigger Binding="{Binding IsCapsLockOn}" Value="True">
                                    <Setter Property="Background" Value="{StaticResource GreenVerBar}"/>
                                    <Setter Property="Background" Value="{DynamicResource GreenVerBar}"/>
                                </DataTrigger>
                            </Style.Triggers>
                        </Style>
HMI.UI/Converter/CollectionHasItem.cs
New file
@@ -0,0 +1,47 @@
using System;
using System.Collections;
using System.Globalization;
using System.Windows;
using System.Windows.Data;
namespace HMI.UI.Converter
{
    public class CollectionHasItem : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (value is IList collection)
            {
                return collection != null && collection.Count > 0;
            }
            return false;
        }
        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            return null;
        }
    }
    public class CollectionVisibility : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (value is int count)
            {
                return count > 0 ? Visibility.Visible : Visibility.Collapsed;
            }
            if (value is IList collection)
            {
                var flag = collection != null && collection.Count > 0;
                return flag ? Visibility.Visible : Visibility.Collapsed;
            }
            return Visibility.Collapsed;
        }
        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            return null;
        }
    }
}
HMI.UI/DpUtil/GridHelper.cs
@@ -118,45 +118,46 @@
        }
        #endregion
        public static Brush GetInnerBorderBrush(DependencyObject obj)
        public static Brush GetInnerBorderBrush(Grid obj)
        {
            return (Brush)obj.GetValue(InnerBorderBrushProperty);
        }
        public static void SetInnerBorderBrush(DependencyObject obj, Brush value)
        public static void SetInnerBorderBrush(Grid obj, Brush value)
        {
            obj.SetValue(InnerBorderBrushProperty, value);
        }
        public static readonly DependencyProperty InnerBorderBrushProperty =
            DependencyProperty.RegisterAttached("InnerBorderBrush", typeof(Brush), typeof(Grid),
            DependencyProperty.RegisterAttached("InnerBorderBrush", typeof(Brush), typeof(GridHelper),
                new PropertyMetadata(null, OnInnerBorderChanged));
        public static double GetInnerBorder(DependencyObject obj)
        public static double GetInnerBorder(Grid obj)
        {
            return (double)obj.GetValue(InnerBorderProperty);
            var sb = obj.GetValue(InnerBorderProperty);
            return double.Parse(sb.ToString());
        }
        public static void SetInnerBorder(DependencyObject obj, object value)
        public static void SetInnerBorder(Grid obj, object value)
        {
            double dv = double.Parse(value.ToString());
            obj.SetValue(InnerBorderProperty, dv);
        }
        public static readonly DependencyProperty InnerBorderProperty =
            DependencyProperty.RegisterAttached("InnerBorder", typeof(object), typeof(Grid),
            DependencyProperty.RegisterAttached("InnerBorder", typeof(object), typeof(GridHelper),
                new PropertyMetadata(0, OnInnerBorderChanged));
        public static string GetInnerBorderIgnore(DependencyObject obj)
        public static string GetInnerBorderIgnore(Grid obj)
        {
            return (string)obj.GetValue(InnerBorderIgnoreProperty);
        }
        public static void SetInnerBorderIgnore(DependencyObject obj, string value)
        public static void SetInnerBorderIgnore(Grid obj, string value)
        {
            obj.SetValue(InnerBorderIgnoreProperty, value);
        }
        public static readonly DependencyProperty InnerBorderIgnoreProperty =
            DependencyProperty.RegisterAttached("InnerBorderIgnore", typeof(string),
                typeof(Grid), new PropertyMetadata("None", OnInnerBorderChanged));
                typeof(GridHelper), new PropertyMetadata("None", OnInnerBorderChanged));
        private static void OnInnerBorderChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
HMI.UI/HMI.UI.csproj
@@ -100,6 +100,7 @@
    <Compile Include="Controls\VisualHost.cs" />
    <Compile Include="Converter\ReverseBoolConverter.cs" />
    <Compile Include="Converter\IndentConverter.cs" />
    <Compile Include="Converter\CollectionHasItem.cs" />
    <Compile Include="Converter\VisibilityBoolConverter.cs" />
    <Compile Include="Converter\DataGridRowFlagConverter.cs" />
    <Compile Include="Converter\DataGridRowNumberConverter.cs" />
HMI.UI/MDI/InnerWindow.xaml
@@ -14,7 +14,6 @@
    <UserControl.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="/HMI.UI;component/Style/colors.xaml"/>
                <ResourceDictionary Source="/HMI.UI;component/Style/WindowResources.xaml"/>
            </ResourceDictionary.MergedDictionaries>
@@ -40,7 +39,7 @@
                        <RowDefinition Height="*"/>
                    </Grid.RowDefinitions>
                    <Grid Background="{StaticResource ReVerBar}">
                    <Grid Background="{DynamicResource ReVerBar}">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="*"/>
                            <ColumnDefinition Width="Auto"/>
HMI.UI/MDI/MinInnerWindow.xaml
@@ -10,14 +10,13 @@
    <UserControl.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="/HMI.UI;component/Style/colors.xaml"/>
                <ResourceDictionary Source="/HMI.UI;component/Style/WindowResources.xaml"/>
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </UserControl.Resources>
    <StackPanel Background="{StaticResource VerBar}" Orientation="Horizontal">
        <Label BorderBrush="{StaticResource PrimaryColor}" Foreground="#FFF" BorderThickness="2,0,0,0" VerticalContentAlignment="Center" ToolTip="{Binding Title}" Content="{Binding Title}"/>
    <StackPanel Background="{DynamicResource VerBar}" Orientation="Horizontal">
        <Label BorderBrush="{DynamicResource PrimaryColor}" Foreground="#FFF" BorderThickness="2,0,0,0" VerticalContentAlignment="Center" ToolTip="{Binding Title}" Content="{Binding Title}"/>
        <Button Style="{StaticResource ChildWindowButton}" Background="Transparent" Click="Max_Click" >&#xe602;</Button>
        <!--<Button Style="{StaticResource ChildWindowCloseButton}" Click="CLose_Click">&#xe609;</Button>-->
    </StackPanel>
HMI.UI/MaskControl.xaml
@@ -19,16 +19,16 @@
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition />
                    </Grid.ColumnDefinitions>
                    <Border Padding="10,5,0,5" Background="{StaticResource PrimaryColor}"
                    <Border Padding="10,5,0,5" Background="{DynamicResource PrimaryColor}"
                   CornerRadius="5,5,0,0">
                        <Label Padding="2" Margin="0" Foreground="#FFF" x:Name="titleLabel" Content="请稍后"/>
                        <Label Padding="2" BorderThickness="0" Margin="0" Foreground="#FFF" x:Name="titleLabel" Content="请稍后"/>
                    </Border>
                    <StackPanel Grid.Row="1" Orientation="Horizontal" HorizontalAlignment="Center"
                                VerticalAlignment="Center"
                                Margin="20">
                        <TextBlock FontSize="45" 
           FontFamily="{StaticResource iconfont}" Foreground="{StaticResource PrimaryColor}"
           FontFamily="{StaticResource iconfont}" Foreground="{DynamicResource PrimaryColor}"
           RenderTransformOrigin="0.5,0.5"
           VerticalAlignment="Center" Text="&#xe891;">
                            <TextBlock.RenderTransform>
HMI.UI/MaskControl.xaml.cs
@@ -1,4 +1,5 @@
using System;
using HMI.Core.Util;
using System;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
@@ -36,7 +37,7 @@
        public void ShowMask(UserControl control, Action action, Action<Exception> reject = null, string title = null, string content = null)
        {
            this.titleLabel.Content = title;
            this.titleLabel.Content = title ?? LangUtil.Get("App.PleaseWait");
            this.contentLabel.Text = content;
            pausePanel.Visibility = Visibility.Visible;
            Task.Run(() =>
HMI.UI/MaskWindow.xaml
@@ -24,7 +24,7 @@
        <Style TargetType="Window">
            <Style.Triggers>
                <DataTrigger Binding="{Binding Status}" Value="Info">
                    <Setter Property="Background" Value="{StaticResource VerBar}"/>
                    <Setter Property="Background" Value="{DynamicResource VerBar}"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
@@ -34,14 +34,14 @@
            <RowDefinition Height="Auto"/>
            <RowDefinition />
        </Grid.RowDefinitions>
        <Border Padding="10,5,0,5" Background="{StaticResource PrimaryColor}" CornerRadius="5,5,0,0">
        <Border Padding="10,5,0,5" Background="{DynamicResource PrimaryColor}" CornerRadius="5,5,0,0">
            <Label Padding="5" FontSize="14" Margin="0" Foreground="#FFF" Content="{DynamicResource App.PleaseWait}"/>
        </Border>
        <StackPanel Grid.Row="1" Margin="20" Orientation="Horizontal" VerticalAlignment="Center"
                    HorizontalAlignment="Center">
            <TextBlock FontSize="45" 
                       FontFamily="{StaticResource iconfont}" Foreground="{StaticResource PrimaryColor}"
                       FontFamily="{StaticResource iconfont}" Foreground="{DynamicResource PrimaryColor}"
                       RenderTransformOrigin="0.5,0.5"
                       VerticalAlignment="Center" Text="&#xe891;">
                <TextBlock.RenderTransform>
HMI.UI/RequirePasswordWindow.xaml
@@ -6,12 +6,11 @@
        xmlns:local="clr-namespace:HMI.Base"
        mc:Ignorable="d"
        Style="{StaticResource ModalWindow}"
        WindowStartupLocation="CenterOwner"
        xmlns:pu="https://opensource.panuon.com/wpf-ui"
        xmlns:dp="clr-namespace:HMI.UI.DpUtil"
        Loaded="WindowX_Loaded"
        SizeToContent="Height"
        FontSize="14"
        Height="200"
        pu:WindowXModalDialog.OKButtonContent="确定"
        Title="请输入密码" Width="500">
    <Grid dp:GridHelper.Space="10">
HMI.UI/Style/BaseWindow.xaml
@@ -3,7 +3,6 @@
                    xmlns:ui="clr-namespace:HMI.UI"
                    x:Class="HMI.UI.BaseWindowTemplate">
    <ResourceDictionary.MergedDictionaries>
        <ResourceDictionary Source="/HMI.UI;component/Style/Colors.xaml"/>
        <ResourceDictionary Source="/HMI.UI;component/Resources/Font/Font.xaml"/>
        <ResourceDictionary Source="/HMI.UI;component/Style/WindowResources.xaml"/>
    </ResourceDictionary.MergedDictionaries>
@@ -26,7 +25,7 @@
                                <RowDefinition/>
                            </Grid.RowDefinitions>
                            <Grid Grid.Row="0" Background="{StaticResource PrimaryColor}">
                            <Grid Grid.Row="0" Background="{DynamicResource PrimaryColor}">
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition/>
                                    <ColumnDefinition Width="Auto"/>
HMI.UI/Style/FormStyle.xaml
@@ -4,7 +4,7 @@
            xmlns:pu="https://opensource.panuon.com/wpf-ui">
    <ResourceDictionary.MergedDictionaries>
        <pu:StyleDictionary Includes="TextBox,ComboBox,Button" />
        <pu:StyleDictionary Includes="TextBox,ComboBox,Button,PasswordBox" />
    </ResourceDictionary.MergedDictionaries>
    <Style x:Key="ModalButton" TargetType="Button" BasedOn="{StaticResource {x:Static pu:WindowXModalDialog.ButtonStyleKey}}">
@@ -27,8 +27,8 @@
                </Setter>
            </Trigger>
            <Trigger Property="Tag" Value="OK">
                <Setter Property="Background" Value="{StaticResource VerBar}" />
                <Setter Property="Foreground" Value="{StaticResource PrimaryColorContract}" />
                <Setter Property="Background" Value="{DynamicResource VerBar}" />
                <Setter Property="Foreground" Value="{DynamicResource PrimaryColorContract}" />
                <Setter Property="Padding" Value="20,0" />
                <Setter Property="Height" Value="35" />
            </Trigger>
@@ -51,8 +51,8 @@
    <Style x:Key="SearchButton" TargetType="Button" BasedOn="{StaticResource {x:Type Button}}">
        <Setter Property="pu:ButtonHelper.CornerRadius" Value="0" />
        <Setter Property="Width" Value="30" />
        <Setter Property="Background" Value="{StaticResource VerBar}" />
        <Setter Property="Foreground" Value="{StaticResource PrimaryColorContract}" />
        <Setter Property="Background" Value="{DynamicResource VerBar}" />
        <Setter Property="Foreground" Value="{DynamicResource PrimaryColorContract}" />
        <Setter Property="FontFamily" Value="{StaticResource iconfont}" />
        <Setter Property="Height" Value="35" />
        <Setter Property="Content" Value="&#xe752;"/>
@@ -137,7 +137,7 @@
    <Style x:Key="FormComboxStyle" TargetType="ComboBox" BasedOn="{StaticResource {x:Type ComboBox}}">
        <Setter Property="pu:ComboBoxHelper.CornerRadius" Value="0"/>
        <Setter Property="pu:ComboBoxHelper.ItemsHoverBackground" Value="{StaticResource SecondPrimaryColor}"/>
        <Setter Property="pu:ComboBoxHelper.ItemsHoverBackground" Value="{DynamicResource SecondPrimaryColor}"/>
        <Setter Property="pu:ComboBoxHelper.ItemsHoverForeground" Value="#FFF"/>
        <Setter Property="pu:ComboBoxHelper.ItemsSelectedForeground" Value="Black"/>
        <Setter Property="pu:ComboBoxHelper.HoverBorderBrush" Value="#007ACC" />
@@ -165,10 +165,10 @@
    <Style x:Key="TimePicker" TargetType="pu:DateTimePicker">
        <Setter Property="Height" Value="35"/>
        <Setter Property="ClearButtonVisibility" Value="Visible"/>
        <Setter Property="ItemsCheckedBackground" Value="{StaticResource PrimaryColor}"/>
        <Setter Property="ItemsCheckedForeground" Value="{StaticResource SecondPrimaryColorContract}"/>
        <Setter Property="ItemsHoverBackground" Value="{StaticResource SecondPrimaryColor}"/>
        <Setter Property="ItemsHoverForeground" Value="{StaticResource SecondPrimaryColorContract}"/>
        <Setter Property="ItemsCheckedBackground" Value="{DynamicResource PrimaryColor}"/>
        <Setter Property="ItemsCheckedForeground" Value="{DynamicResource SecondPrimaryColorContract}"/>
        <Setter Property="ItemsHoverBackground" Value="{DynamicResource SecondPrimaryColor}"/>
        <Setter Property="ItemsHoverForeground" Value="{DynamicResource SecondPrimaryColorContract}"/>
        <Setter Property="TextStringFormat" Value="yyyy-MM-dd HH:mm:ss"/>
        <Setter Property="MinWidth" Value="180"/>
        <Setter Property="Mode" Value="DateTime"/>
@@ -181,8 +181,8 @@
        <Setter Property="pu:PasswordBoxHelper.CornerRadius" Value="2" />
        <Setter Property="pu:PasswordBoxHelper.WatermarkForeground" Value="#4A4A4A" />
        <Setter Property="pu:PasswordBoxHelper.FocusedWatermarkForeground" Value="#AAAAAA" />
        <Setter Property="pu:PasswordBoxHelper.ClearButtonVisibility" Value="VisibleOnHoverAndNonnull" />
        <Setter Property="pu:PasswordBoxHelper.PlainButtonVisibility" Value="VisibleOnHover" />
        <Setter Property="VerticalContentAlignment" Value="Center" />
        <Setter Property="Height" Value="35" />
        <Setter Property="Padding" Value="10,0" />
    </Style>
</ResourceDictionary>
HMI.UI/Style/MsgBoxStyle.xaml
@@ -9,8 +9,8 @@
                                 InverseButtonsSequence="False">
        <pu:MessageBoxXSettings.WindowXStyle>
            <Style TargetType="pu:WindowX" BasedOn="{StaticResource {x:Static pu:MessageBoxX.WindowXStyleKey}}">
                <Setter Property="pu:WindowXCaption.Background" Value="{StaticResource WarningColor}" />
                <Setter Property="pu:WindowXCaption.Foreground" Value="{StaticResource WarningColorContract}" />
                <Setter Property="pu:WindowXCaption.Background" Value="{DynamicResource WarningColor}" />
                <Setter Property="pu:WindowXCaption.Foreground" Value="{DynamicResource WarningColorContract}" />
                <Setter Property="Width" Value="350" />
                <Setter Property="Height" Value="200" />
                <Setter Property="SizeToContent" Value="Manual" />
@@ -22,8 +22,8 @@
                <Style.Triggers>
                    <Trigger Property="Tag" Value="OK">
                        <Setter Property="Foreground" Value="{StaticResource WarningColorContract}" />
                        <Setter Property="Background" Value="{StaticResource WarningColor}" />
                        <Setter Property="Foreground" Value="{DynamicResource WarningColorContract}" />
                        <Setter Property="Background" Value="{DynamicResource WarningColor}" />
                    </Trigger>
                    <Trigger Property="Tag" Value="Cancel">
@@ -48,8 +48,8 @@
                             InverseButtonsSequence="False">
        <pu:MessageBoxXSettings.WindowXStyle>
            <Style TargetType="pu:WindowX" BasedOn="{StaticResource {x:Static pu:MessageBoxX.WindowXStyleKey}}">
                <Setter Property="pu:WindowXCaption.Background" Value="{StaticResource DangerColor}" />
                <Setter Property="pu:WindowXCaption.Foreground" Value="{StaticResource DangerColorContrast}" />
                <Setter Property="pu:WindowXCaption.Background" Value="{DynamicResource DangerColor}" />
                <Setter Property="pu:WindowXCaption.Foreground" Value="{DynamicResource DangerColorContrast}" />
                <Setter Property="Width" Value="350" />
                <Setter Property="Height" Value="200" />
                <Setter Property="SizeToContent" Value="Manual" />
@@ -61,8 +61,8 @@
                <Style.Triggers>
                    <Trigger Property="Tag" Value="OK">
                        <Setter Property="Foreground" Value="{StaticResource DangerColorContrast}" />
                        <Setter Property="Background" Value="{StaticResource DangerColor}" />
                        <Setter Property="Foreground" Value="{DynamicResource DangerColorContrast}" />
                        <Setter Property="Background" Value="{DynamicResource DangerColor}" />
                    </Trigger>
                    <Trigger Property="Tag" Value="Cancel">
@@ -87,8 +87,8 @@
                             InverseButtonsSequence="False">
        <pu:MessageBoxXSettings.WindowXStyle>
            <Style TargetType="pu:WindowX" BasedOn="{StaticResource {x:Static pu:MessageBoxX.WindowXStyleKey}}">
                <Setter Property="pu:WindowXCaption.Background" Value="{StaticResource PrimaryColor}" />
                <Setter Property="pu:WindowXCaption.Foreground" Value="{StaticResource PrimaryColorContract}" />
                <Setter Property="pu:WindowXCaption.Background" Value="{DynamicResource PrimaryColor}" />
                <Setter Property="pu:WindowXCaption.Foreground" Value="{DynamicResource PrimaryColorContract}" />
                <Setter Property="Width" Value="350" />
                <Setter Property="Height" Value="200" />
                <Setter Property="SizeToContent" Value="Manual" />
@@ -100,8 +100,8 @@
                <Style.Triggers>
                    <Trigger Property="Tag" Value="OK">
                        <Setter Property="Foreground" Value="{StaticResource PrimaryColorContract}" />
                        <Setter Property="Background" Value="{StaticResource PrimaryColor}" />
                        <Setter Property="Foreground" Value="{DynamicResource PrimaryColorContract}" />
                        <Setter Property="Background" Value="{DynamicResource PrimaryColor}" />
                    </Trigger>
                    <Trigger Property="Tag" Value="Cancel">
@@ -125,8 +125,8 @@
        <pu:ToastSetting.LabelStyle>
            <Style TargetType="Label" BasedOn="{StaticResource {x:Static pu:Toast.LabelStyleKey}}">
                <Setter Property="FontSize" Value="18" />
                <Setter Property="Background" Value="{StaticResource SuccessColor}" />
                <Setter Property="Foreground" Value="{StaticResource SuccessColorContrast}" />
                <Setter Property="Background" Value="{DynamicResource SuccessColor}" />
                <Setter Property="Foreground" Value="{DynamicResource SuccessColorContrast}" />
            </Style>
        </pu:ToastSetting.LabelStyle>
    </pu:ToastSetting>
@@ -135,8 +135,8 @@
        <pu:ToastSetting.LabelStyle>
            <Style TargetType="Label" BasedOn="{StaticResource {x:Static pu:Toast.LabelStyleKey}}">
                <Setter Property="FontSize" Value="18" />
                <Setter Property="Background" Value="{StaticResource WarningColor}" />
                <Setter Property="Foreground" Value="{StaticResource SuccessColorContrast}" />
                <Setter Property="Background" Value="{DynamicResource WarningColor}" />
                <Setter Property="Foreground" Value="{DynamicResource SuccessColorContrast}" />
            </Style>
        </pu:ToastSetting.LabelStyle>
    </pu:ToastSetting>
@@ -145,8 +145,8 @@
        <pu:ToastSetting.LabelStyle>
            <Style TargetType="Label" BasedOn="{StaticResource {x:Static pu:Toast.LabelStyleKey}}">
                <Setter Property="FontSize" Value="18" />
                <Setter Property="Background" Value="{StaticResource DangerColor}" />
                <Setter Property="Foreground" Value="{StaticResource DangerColorContrast}" />
                <Setter Property="Background" Value="{DynamicResource DangerColor}" />
                <Setter Property="Foreground" Value="{DynamicResource DangerColorContrast}" />
            </Style>
        </pu:ToastSetting.LabelStyle>
    </pu:ToastSetting>
HMI.UI/Style/PanuonDataGrid.xaml
@@ -11,53 +11,71 @@
             xmlns:uic="clr-namespace:HMI.UI.Converter;assembly=HMI.UI"
             xmlns:dp="clr-namespace:HMI.UI.DpUtil;assembly=HMI.UI">
    <ResourceDictionary.MergedDictionaries>
        <pu:StyleDictionary Includes="DataGrid" />
        <ResourceDictionary Source="/HMI.UI;component/Style/Colors.xaml"/>
        <ResourceDictionary Source="/HMI.UI;component/Resources/Font/Font.xaml"/>
        <ResourceDictionary Source="/HMI.UI;component/Style/ScrollBarResource.xaml"/>
    </ResourceDictionary.MergedDictionaries>
    <Style x:Key="DefaultDataGridRow" TargetType="DataGridRow" BasedOn="{StaticResource {x:Static pu:StyleKeys.DataGridRowStyle}}">
        <Setter Property="Background" Value="White"/>
        <Setter Property="HeaderStyle">
            <Setter.Value>
                <Style TargetType="DataGridColumnHeader"
       BasedOn="{StaticResource {x:Static pu:StyleKeys.DataGridColumnHeaderStyle}}">
                    <Setter Property="Padding" Value="10"/>
                    <Setter Property="BorderThickness" Value="0"/>
    <Style x:Key="DefaultDataGridColumnHeader" TargetType="DataGridColumnHeader">
        <Setter Property="Background" Value="{DynamicResource PrimaryColor}"/>
        <Setter Property="Foreground" Value="{DynamicResource PrimaryColorContract}"/>
        <Setter Property="BorderBrush" Value="{DynamicResource PrimaryColorContract}"/>
        <Setter Property="BorderThickness" Value="0,0,1,1"/>
                </Style>
    <Style x:Key="DefaultDataGridCell" TargetType="DataGridCell">
        <Setter Property="Background" Value="Transparent"/>
        <Setter Property="Padding" Value="5,0,0,0"/>
        <Setter Property="Margin" Value="0"/>
        <Setter Property="BorderThickness" Value="0"/>
        <Setter Property="VerticalAlignment" Value="Stretch"/>
        <Setter Property="VerticalContentAlignment" Value="Center"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="DataGridCell">
                    <Grid Background="{TemplateBinding Background}">
                        <ContentPresenter VerticalAlignment="Center"/>
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
        <Style.Triggers>
            <Trigger Property="AlternationIndex" Value="1">
                <Setter Property="Background" Value="#eeeeee"/>
            <Trigger Property="IsSelected" Value="True">
                <Setter Property="Background" Value="{DynamicResource PrimaryColor}"/>
                <Setter Property="Foreground" Value="{DynamicResource PrimaryColorContract}"/>
            </Trigger>
        </Style.Triggers>
    </Style>
    <Style x:Key="DefaultDataGrid" TargetType="DataGrid" BasedOn="{StaticResource {x:Static pu:StyleKeys.DataGridStyle}}">
        <Style.Resources>
            <Style TargetType="DataGridCell"
                   BasedOn="{StaticResource {x:Static pu:StyleKeys.DataGridCellStyle}}">
                <Setter Property="Background" Value="Transparent"/>
                <Setter Property="Padding" Value="5"/>
                <Setter Property="Margin" Value="0"/>
                <Setter Property="BorderThickness" Value="0"/>
                <Setter Property="VerticalAlignment" Value="Stretch"/>
    <Style x:Key="DefaultDataGridRow" TargetType="DataGridRow">
        <Setter Property="Background" Value="White"/>
        <Style.Triggers>
            <Trigger Property="AlternationIndex" Value="1">
                <Setter Property="Background" Value="#eeeeee"/>
            </Trigger>
            <Trigger Property="IsMouseOver" Value="True">
                <Setter Property="Background" Value="{DynamicResource SecondPrimaryColor}"/>
                <Setter Property="Foreground" Value="{DynamicResource SecondPrimaryColorContract}"/>
            </Trigger>
        </Style.Triggers>
            </Style>
    <Style x:Key="DefaultDataGrid" TargetType="DataGrid">
        <Style.Resources>
            <Style TargetType="ScrollBar" BasedOn="{StaticResource ScrollStyle_Mobile}"/>
        </Style.Resources>
        <Setter Property="CellStyle" Value="{StaticResource DefaultDataGridCell}"/>
        <Setter Property="RowHeight" Value="30"/>
        <Setter Property="ColumnHeaderHeight" Value="36"/>
        <Setter Property="ColumnHeaderStyle" Value="{StaticResource DefaultDataGridColumnHeader}"/>
        <Setter Property="pu:DataGridHelper.ColumnHeaderPadding" Value="0"/>
        <Setter Property="ForceCursor" Value="True"/>
        <Setter Property="SelectionMode" Value="Single"/>
        <!--<Setter Property="RowStyle" Value="{StaticResource DefaultDataGridRow}"/>-->
        <Setter Property="AlternationCount" Value="2"></Setter>
        <Setter Property="Foreground" Value="#3a3a3a"/>
        <Setter Property="HorizontalGridLinesBrush" Value="{StaticResource TableBoarder}"/>
        <Setter Property="VerticalGridLinesBrush" Value="{StaticResource TableBoarder}"/>
        <Setter Property="BorderBrush" Value="{StaticResource TableBoarder}" />
        <Setter Property="RowStyle" Value="{StaticResource DefaultDataGridRow}"/>
        <Setter Property="AlternationCount" Value="2"/>
        <Setter Property="HorizontalGridLinesBrush" Value="{DynamicResource TableBoarder}"/>
        <Setter Property="VerticalGridLinesBrush" Value="{DynamicResource TableBoarder}"/>
        <Setter Property="BorderBrush" Value="{DynamicResource TableBoarder}" />
        <Setter Property="AutoGenerateColumns" Value="False"/>
        <Setter Property="CanUserAddRows" Value="False"/>
        <Setter Property="CanUserSortColumns" Value="False"/>
@@ -66,24 +84,7 @@
        <Setter Property="IsReadOnly" Value="True"/>
        <Setter Property="GridLinesVisibility" Value="All"/>
        <Setter Property="BorderThickness" Value="0"/>
        <Setter Property="BorderBrush" Value="{StaticResource CommonBoarder}"/>
        <Setter Property="FontSize" Value="{StaticResource ContentFontSize2}"/>
        <Setter Property="pu:DataGridHelper.IsVerticalScrollBarCrossingColumnHeaderPanel" Value="True"/>
        <Setter Property="pu:DataGridHelper.ColumnHeaderForeground" Value="White"/>
        <Setter Property="pu:DataGridHelper.ColumnHeaderBackground" Value="{StaticResource TableHeader}"/>
        <Setter Property="pu:DataGridHelper.ColumnHeaderHoverBackground" Value="{StaticResource TableHeader}"/>
        <Setter Property="pu:DataGridHelper.ColumnHeaderSeparatorBrush" Value="{StaticResource TableBoarder}"/>
        <Setter Property="pu:DataGridHelper.ColumnHeaderSeparatorVisibility" Value="Visible"/>
        <Setter Property="pu:DataGridHelper.ColumnHeaderVerticalContentAlignment" Value="Center"/>
        <Setter Property="pu:DataGridHelper.ColumnHeaderHorizontalContentAlignment" Value="Left"/>
        <Setter Property="pu:DataGridHelper.RowHeaderSeparatorBrush" Value="{StaticResource CommonBoarder}"/>
        <Setter Property="pu:DataGridHelper.RowHoverForeground" Value="{StaticResource SecondPrimaryColorContract}"/>
        <Setter Property="pu:DataGridHelper.RowHoverBackground" Value="{StaticResource SecondPrimaryColor}"/>
        <Setter Property="pu:DataGridHelper.RowSelectedBackground" Value="{StaticResource PrimaryColor}"/>
        <Setter Property="pu:DataGridHelper.RowSelectedForeground" Value="White"/>
        <Setter Property="pu:DataGridHelper.RowHeaderBorderThickness" Value="10,0,0,0"/>
        <Setter Property="pu:DataGridHelper.ColumnHeaderBorderThickness" Value="0"/>
        <Setter Property="pu:DataGridHelper.ColumnHeaderPadding" Value="0"/>
        <Setter Property="BorderBrush" Value="{DynamicResource CommonBoarder}"/>
        <Setter Property="FontSize" Value="{DynamicResource ContentFontSize2}"/>
    </Style>
</ResourceDictionary>
HMI.UI/Style/PanuonListView.xaml
@@ -12,7 +12,6 @@
             xmlns:dp="clr-namespace:HMI.UI.DpUtil;assembly=HMI.UI">
    <ResourceDictionary.MergedDictionaries>
        <pu:StyleDictionary Includes="ListView" />
        <ResourceDictionary Source="/HMI.UI;component/Style/Colors.xaml"/>
        <ResourceDictionary Source="/HMI.UI;component/Resources/Font/Font.xaml"/>
        <ResourceDictionary Source="/HMI.UI;component/Style/ScrollBarResource.xaml"/>
    </ResourceDictionary.MergedDictionaries>
HMI.UI/Style/PanuonResource.xaml
@@ -12,7 +12,6 @@
             xmlns:dp="clr-namespace:HMI.UI.DpUtil;assembly=HMI.UI">
    <ResourceDictionary.MergedDictionaries>
        <pu:StyleDictionary Includes="PasswordBox,TextBox,ComboBox,Button,TreeView,Menu,ListBox,ContextMenu,TabControl" />
        <ResourceDictionary Source="/HMI.UI;component/Style/Colors.xaml"/>
        <ResourceDictionary Source="/HMI.UI;component/Style/PanuonDataGrid.xaml"/>
        <ResourceDictionary Source="/HMI.UI;component/Style/ScrollBarResource.xaml"/>
        <ResourceDictionary Source="/HMI.UI;component/Resources/Font/Font.xaml"/>
@@ -22,7 +21,7 @@
    <sys:Double x:Key="ContentFontSize2">14</sys:Double>
    <Style x:Key="PrimaryButton" TargetType="Button" BasedOn="{StaticResource {x:Static pu:StyleKeys.ButtonStyle}}">
        <Setter Property="Background" Value="{StaticResource VerBar}"/>
        <Setter Property="Background" Value="{DynamicResource VerBar}"/>
        <Setter Property="Foreground" Value="#FFF"/>
        <Setter Property="pu:IconHelper.FontFamily" Value="{StaticResource iconfont}"/>
        <Setter Property="pu:IconHelper.Margin" Value="0,0,10,0"/>
@@ -39,13 +38,13 @@
    </Style>
    <Style x:Key="DangerButton" TargetType="Button" BasedOn="{StaticResource PrimaryButton}">
        <Setter Property="Background" Value="{StaticResource DangerVerBar}"/>
        <Setter Property="Foreground" Value="{StaticResource DangerColorContrast}"/>
        <Setter Property="Background" Value="{DynamicResource DangerVerBar}"/>
        <Setter Property="Foreground" Value="{DynamicResource DangerColorContrast}"/>
    </Style>
    <Style x:Key="SuccessButton" TargetType="Button" BasedOn="{StaticResource PrimaryButton}">
        <Setter Property="Background" Value="{StaticResource GreenVerBar}"/>
        <Setter Property="Foreground" Value="{StaticResource DangerColorContrast}"/>
        <Setter Property="Background" Value="{DynamicResource GreenVerBar}"/>
        <Setter Property="Foreground" Value="{DynamicResource DangerColorContrast}"/>
    </Style>
    <Style x:Key="AddBtn" TargetType="Button" BasedOn="{StaticResource PrimaryButton}">
@@ -101,7 +100,7 @@
        <Setter Property="Background" Value="{x:Null}" />
        <Setter Property="Margin" Value="0" />
        <Setter Property="Padding" Value="0" />
        <Setter Property="Foreground" Value="{StaticResource PrimaryColor}" />
        <Setter Property="Foreground" Value="{DynamicResource PrimaryColor}" />
        <Setter Property="Cursor" Value="Hand" />
        <Setter Property="ContentTemplate">
            <Setter.Value>
@@ -113,7 +112,7 @@
    </Style>
    <Style x:Key="DangerLinkButton" TargetType="Button" BasedOn="{StaticResource LinkButton}">
        <Setter Property="Foreground" Value="{StaticResource DangerColor}"/>
        <Setter Property="Foreground" Value="{DynamicResource DangerColor}"/>
    </Style>
    <Style x:Key="DeleteLink" TargetType="Button" BasedOn="{StaticResource DangerLinkButton}">
@@ -147,7 +146,7 @@
    </Style>
    <Style x:Key="CommonMenu" TargetType="Menu" BasedOn="{StaticResource {x:Static pu:StyleKeys.MenuStyle}}">
        <Setter Property="Background" Value="{StaticResource PrimaryColor}"/>
        <Setter Property="Background" Value="{DynamicResource PrimaryColor}"/>
        <Setter Property="Foreground" Value="#FFF"/>
        <Setter Property="pu:IconHelper.FontFamily" Value="{StaticResource iconfont}"/>
        <Setter Property="pu:IconHelper.Margin" Value="0,0,10,0"/>
@@ -156,7 +155,7 @@
    </Style>
    <Style x:Key="CardBoarder" TargetType="Border">
        <Setter Property="BorderBrush" Value="{StaticResource CommonBoarder}"/>
        <Setter Property="BorderBrush" Value="{DynamicResource CommonBoarder}"/>
        <Setter Property="BorderThickness" Value="2"/>
        <Setter Property="Background" Value="#f3f9ff"/>
        <Setter Property="Margin" Value="5"/>
@@ -171,10 +170,13 @@
    </Style>
    <Style x:Key="DefaultTreeView" TargetType="TreeView" BasedOn="{StaticResource {x:Static pu:StyleKeys.TreeViewStyle}}">
        <Setter Property="pu:TreeViewHelper.ItemsHoverBackground" Value="{StaticResource SecondPrimaryColor}"/>
        <Setter Property="pu:TreeViewHelper.ItemsHoverForeground" Value="{StaticResource SecondPrimaryColorContract}"/>
        <Setter Property="pu:TreeViewHelper.ItemsSelectedBackground" Value="{StaticResource PrimaryColor}"/>
        <Setter Property="pu:TreeViewHelper.ItemsSelectedForeground" Value="{StaticResource PrimaryColorContract}"/>
        <Style.Resources>
            <Style TargetType="ScrollBar" BasedOn="{StaticResource ScrollStyle_Mobile}"/>
        </Style.Resources>
        <Setter Property="pu:TreeViewHelper.ItemsHoverBackground" Value="{DynamicResource SecondPrimaryColor}"/>
        <Setter Property="pu:TreeViewHelper.ItemsHoverForeground" Value="{DynamicResource SecondPrimaryColorContract}"/>
        <Setter Property="pu:TreeViewHelper.ItemsSelectedBackground" Value="{DynamicResource PrimaryColor}"/>
        <Setter Property="pu:TreeViewHelper.ItemsSelectedForeground" Value="{DynamicResource PrimaryColorContract}"/>
        <Setter Property="pu:TreeViewHelper.ItemsMargin" Value="0"/>
        <Setter Property="pu:TreeViewHelper.ItemsPadding" Value="7,5,7,5"/>
        <Setter Property="dp:TreeViewHelper.AutoExpand" Value="True"/>
@@ -185,12 +187,12 @@
    <Style x:Key="DefaultTabControl" TargetType="TabControl">
        <Setter Property="pu:TabControlHelper.ItemsHorizontalHeaderAlignment" Value="Left"/>
        <Setter Property="pu:TabControlHelper.ItemsHoverBackground" Value="{StaticResource SecondPrimaryColor}"/>
        <Setter Property="pu:TabControlHelper.ItemsHoverForeground" Value="{StaticResource SecondPrimaryColorContract}"/>
        <Setter Property="pu:TabControlHelper.ItemsHoverBackground" Value="{DynamicResource SecondPrimaryColor}"/>
        <Setter Property="pu:TabControlHelper.ItemsHoverForeground" Value="{DynamicResource SecondPrimaryColorContract}"/>
        <Setter Property="pu:TabControlHelper.ItemsRibbonLineMargin" Value="0,5,0,5"/>
        <Setter Property="pu:TabControlHelper.ItemsRibbonLineThickness" Value="4"/>
        <Setter Property="pu:TabControlHelper.ItemsRibbonLineVisibility" Value="Visible"/>
        <Setter Property="pu:TabControlHelper.ItemsSelectedRibbonLineBrush" Value="{StaticResource PrimaryColor}"/>
        <Setter Property="pu:TabControlHelper.ItemsSelectedRibbonLineBrush" Value="{DynamicResource PrimaryColor}"/>
        <Setter Property="pu:TabControlHelper.ItemsSelectedRibbonLineThickness" Value="2"/>
    </Style>
@@ -213,7 +215,7 @@
    </Style>
    <Style x:Key="ModalWindow" TargetType="pu:WindowX">
        <Setter Property="pu:WindowXCaption.Background" Value="{StaticResource ReHoriBar}"/>
        <Setter Property="pu:WindowXCaption.Background" Value="{DynamicResource ReHoriBar}"/>
        <Setter Property="pu:WindowXModalDialog.ButtonStyle" Value="{StaticResource ModalButton}"/>
        <Setter Property="pu:WindowXCaption.Foreground" Value="#FFF"/>
        <Setter Property="pu:WindowXCaption.Buttons" Value="Close"/>
@@ -226,10 +228,10 @@
    </Style>
    <Style x:Key="DefaultListBox" TargetType="ListBox" BasedOn="{StaticResource {x:Static pu:StyleKeys.ListBoxStyle}}">
        <Setter Property="pu:ListBoxHelper.ItemsHoverBackground" Value="{StaticResource SecondPrimaryColor}"/>
        <Setter Property="pu:ListBoxHelper.ItemsHoverForeground" Value="{StaticResource SecondPrimaryColorContract}"/>
        <Setter Property="pu:ListBoxHelper.ItemsSelectedBackground" Value="{StaticResource PrimaryColor}"/>
        <Setter Property="pu:ListBoxHelper.ItemsSelectedForeground" Value="{StaticResource PrimaryColorContract}"/>
        <Setter Property="pu:ListBoxHelper.ItemsHoverBackground" Value="{DynamicResource SecondPrimaryColor}"/>
        <Setter Property="pu:ListBoxHelper.ItemsHoverForeground" Value="{DynamicResource SecondPrimaryColorContract}"/>
        <Setter Property="pu:ListBoxHelper.ItemsSelectedBackground" Value="{DynamicResource PrimaryColor}"/>
        <Setter Property="pu:ListBoxHelper.ItemsSelectedForeground" Value="{DynamicResource PrimaryColorContract}"/>
        <Setter Property="pu:ListBoxHelper.ItemsMargin" Value="0"/>
        <Setter Property="pu:ListBoxHelper.ItemsPadding" Value="7,5,7,5"/>
        <Setter Property="FontSize" Value="{StaticResource ContentFontSize}"/>
@@ -277,4 +279,44 @@
            </Setter.Value>
        </Setter>
    </Style>
    <Style x:Key="HorTabControl" TargetType="TabControl">
        <Setter Property="pu:TabControlHelper.HeaderPanelAlignment" Value="Stretch"/>
        <Setter Property="pu:TabControlHelper.ItemsBackground" Value="{DynamicResource VerBar}"/>
        <Setter Property="pu:TabControlHelper.ItemsForeground" Value="#FFFFFF"/>
        <Setter Property="pu:TabControlHelper.ItemsFontSize" Value="14"/>
        <Setter Property="pu:TabControlHelper.ItemsHeight" Value="30"/>
        <Setter Property="pu:TabControlHelper.ItemsHorizontalHeaderAlignment" Value="Left"/>
        <Setter Property="pu:TabControlHelper.ItemsHoverBackground" Value="{DynamicResource SecondPrimaryColor}"/>
        <Setter Property="pu:TabControlHelper.ItemsHoverForeground" Value="{DynamicResource SecondPrimaryColorContract}"/>
        <Setter Property="pu:TabControlHelper.ItemsPadding" Value="20,0,20,0"/>
        <Setter Property="pu:TabControlHelper.ItemsRibbonLineCornerRadius" Value="4"/>
        <Setter Property="pu:TabControlHelper.ItemsRibbonLineMargin" Value="0,5,0,5"/>
        <Setter Property="pu:TabControlHelper.ItemsRibbonLineThickness" Value="4"/>
        <Setter Property="pu:TabControlHelper.ItemsRibbonLineVisibility" Value="Visible"/>
        <Setter Property="pu:TabControlHelper.ItemsSelectedBackground" Value="#FFF"/>
        <Setter Property="pu:TabControlHelper.ItemsSelectedRibbonLineBrush" Value="#FFF"/>
        <Setter Property="pu:TabControlHelper.ItemsSelectedRibbonLineThickness" Value="2"/>
        <Setter Property="pu:TabControlHelper.ItemsSelectedBackground" Value="#FFF"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type TabControl}">
                    <Grid>
                        <Grid.RowDefinitions>
                            <RowDefinition Height="Auto"/>
                            <RowDefinition Height="*"/>
                        </Grid.RowDefinitions>
                        <Border BorderThickness="1,1,1,0" BorderBrush="#acacac" Background="{DynamicResource VerBar}" Padding="2,2,10,0">
                            <TabPanel x:Name="HeaderPanel" Grid.Row="0" Panel.ZIndex="1" IsItemsHost="True"/>
                        </Border>
                        <Border Grid.Row="1" BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="1,0,1,1" Background="{TemplateBinding Background}">
                            <ContentPresenter x:Name="PART_SelectedContentHost" ContentSource="SelectedContent"/>
                        </Border>
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</ResourceDictionary>
HMI.UI/Style/WindowResources.xaml
@@ -4,13 +4,12 @@
                    xmlns:sys="clr-namespace:System;assembly=mscorlib"
                    >
    <ResourceDictionary.MergedDictionaries>
        <ResourceDictionary Source="/HMI.UI;component/Style/Colors.xaml"/>
        <ResourceDictionary Source="/HMI.UI;component/Resources/Font/Font.xaml"/>
    </ResourceDictionary.MergedDictionaries>
    <Style x:Key="WindowButton" TargetType="Button">
        <Setter Property="Background" Value="{StaticResource PrimaryColor}"/>
        <Setter Property="ui:DpPlugin.HoverColor" Value="{StaticResource SecondPrimaryColor}"/>
        <Setter Property="Background" Value="{DynamicResource PrimaryColor}"/>
        <Setter Property="ui:DpPlugin.HoverColor" Value="{DynamicResource SecondPrimaryColor}"/>
        <Setter Property="FontFamily" Value="{StaticResource iconfont}"/>
        <Setter Property="FontWeight" Value="SemiBold"/>
        <Setter Property="Foreground" Value="White"/>
@@ -50,8 +49,8 @@
    <Style x:Key="ChildWindowButton" BasedOn="{StaticResource WindowButton}" TargetType="Button">
        <Setter Property="FontSize" Value="15"/>
        <Setter Property="Width" Value="30"/>
        <Setter Property="Background" Value="{StaticResource SecondPrimaryColor}"/>
        <Setter Property="ui:DpPlugin.HoverColor" Value="{StaticResource PrimaryColor}"/>
        <Setter Property="Background" Value="{DynamicResource SecondPrimaryColor}"/>
        <Setter Property="ui:DpPlugin.HoverColor" Value="{DynamicResource PrimaryColor}"/>
    </Style>
    <Style x:Key="ChildWindowCloseButton" BasedOn="{StaticResource ChildWindowButton}" TargetType="Button">
@@ -59,9 +58,9 @@
    </Style>
    <Style x:Key="LinkButton" TargetType="Button">
        <Setter Property="ui:DpPlugin.HoverColor" Value="{StaticResource SecondPrimaryColor}"/>
        <Setter Property="ui:DpPlugin.HoverColor" Value="{DynamicResource SecondPrimaryColor}"/>
        <Setter Property="FontFamily" Value="{StaticResource iconfont}"/>
        <Setter Property="Foreground" Value="{StaticResource SecondPrimaryColor}"/>
        <Setter Property="Foreground" Value="{DynamicResource SecondPrimaryColor}"/>
        <Setter Property="Template">
            <Setter.Value>
HMI.UI/Themes/Generic.xaml
@@ -88,7 +88,7 @@
                                       TextWrapping="NoWrap" Padding="0" VerticalAlignment="Center"
                               Text="{Binding Path=Value, RelativeSource={RelativeSource TemplatedParent}}"/>
                        </Border>
                        <TextBox x:Name="PART_TextBoxPart" BorderThickness="0" Padding="0"
                        <TextBox x:Name="PART_TextBoxPart" BorderThickness="1" Padding="0" Background="#FFF"
                                       FontSize="{TemplateBinding FontSize}" Visibility="Collapsed"
                               Text="{Binding Path=Value, RelativeSource={RelativeSource TemplatedParent}}"/>
                    </Grid>
HMI.UnitTest/App.config
@@ -9,6 +9,10 @@
        <assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="log4net" publicKeyToken="669e0ddf0bb1aa2a" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-3.0.4.0" newVersion="3.0.4.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>
HMI.UnitTest/App.xaml
@@ -13,7 +13,6 @@
                <ResourceDictionary Source="/HMI.UI;component/Style/BaseWindow.xaml"/>
                <ResourceDictionary Source="/HMI.UI;component/Style/FormStyle.xaml"/>
                <ResourceDictionary Source="/HMI.UI;component/Resources/Font/Font.xaml"/>
                <ResourceDictionary Source="/HMI.UI;component/Style/Colors.xaml"/>
                <ResourceDictionary Source="/HMI.UI;component/Style/PanuonResource.xaml"/>
                <ResourceDictionary Source="/HMI.UI;component/Style/MsgBoxStyle.xaml"/>
            </ResourceDictionary.MergedDictionaries>
HMI.UnitTest/HMI.UnitTest.csproj
@@ -131,11 +131,11 @@
    <None Include="App.config" />
  </ItemGroup>
  <ItemGroup>
    <ProjectReference Include="..\..\ConnectionUtil\ConnectionUtil\ConnectionUtil.csproj">
    <ProjectReference Include="..\ConnectionUtil\ConnectionUtil.csproj">
      <Project>{d0806fa6-3f6d-4304-81b8-ead9da7cb5b2}</Project>
      <Name>ConnectionUtil</Name>
    </ProjectReference>
    <ProjectReference Include="..\..\ModBusTcpController\ModBusTcpController\ModBusTcpController.csproj">
    <ProjectReference Include="..\ModBusTcpController\ModBusTcpController.csproj">
      <Project>{49db0c9b-b239-4608-a91e-f5ed43afaf96}</Project>
      <Name>ModBusTcpController</Name>
    </ProjectReference>
HMI.Util/Alarm/AlarmUtil.cs
New file
@@ -0,0 +1,396 @@
using HMI.Core.Api;
using HMI.Core.Entity;
using HMI.Core.Setting;
using HMI.Core.Util;
using S7Driver;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Timers;
namespace HMI.Util.Alarm
{
    public class AlarmHelper : IDisposable
    {
        public event EventHandler<List<AlarmText>> OnAlarm;
        public event EventHandler<LoadMsg> LoadMessageAppend;
        internal AlarmHelper()
        {
        }
        public ObservableCollection<AlarmSetting> BlockSettings { get; private set; }
        Dictionary<string, Dictionary<string, AlarmSetting>> BlockMap = new Dictionary<string, Dictionary<string, AlarmSetting>>();
        Dictionary<string, string> BlockReadCache = new Dictionary<string, string>();
        public ObservableCollection<AlarmSetting> MarkSettings { get; private set; }
        private string blockFilePath = PathHelper.BlockAlarmSettingPath();
        private string markFilePath = PathHelper.MarkAlarmSettingPath();
        /// <summary>
        /// æŽ¥æ”¶æŠ¥è­¦çš„队列
        /// </summary>
        private MSMQHelper alarmQueue = new MSMQHelper("HMI_Alarm");
        /// <summary>
        /// åˆ·æ–°æŠ¥è­¦çš„队列
        /// </summary>
        private MSMQHelper alarmRefershToMain = new MSMQHelper("LTHMI_Alarm_Rrfresh");
        private PLCS7Driver pLCS7Driver;
        private Timer plcTimer;
        private Timer mqTimer;
        /// <summary>
        /// æŠ¥è­¦ä¿¡æ¯ç¼“å­˜
        /// </summary>
        private List<AlarmText> currentPLCAlarmCache = new List<AlarmText>();
        /// <summary>
        /// æŠ¥è­¦ä¿¡æ¯ç¼“å­˜
        /// </summary>
        private List<AlarmText> currentMQAlarmCache = new List<AlarmText>();
        private bool isHaveAlarm = false;
        private volatile bool isClosing = false;
        public void InitInstance()
        {
            LoadMessageAppend?.Invoke(this, new LoadMsg
            {
                Type = LoadMsgType.INIT,
                Message = "加载报警设置..."
            });
            LoadAlarmSetting();
            var systemSetting = SystemSetting.Instance;
            pLCS7Driver = new PLCS7Driver(systemSetting.PlcIp, systemSetting.PlcPort);
            plcTimer = new Timer
            {
                Interval = 1000,
                AutoReset = false
            };
            plcTimer.Elapsed += PLCTimer_Elapsed;
            if (pLCS7Driver.Connect(out string errMSg))
            {
                plcTimer.Start();
            }
            else
            {
                LoadMessageAppend?.Invoke(this, new LoadMsg
                {
                    Type = LoadMsgType.INIT,
                    Message = "连接PLC失败",
                    Result = false
                });
            }
            mqTimer = new Timer
            {
                Interval = 1000,
                AutoReset = false
            };
            mqTimer.Elapsed += MQTimer_Elapsed;
            mqTimer.Enabled = true;
        }
        public void Dispose()
        {
            isClosing = true;
            mqTimer.Enabled = false;
            mqTimer?.Dispose();
            plcTimer.Enabled = false;
            plcTimer?.Dispose();
            pLCS7Driver?.Dispose();
        }
        /// <summary>
        /// PLC报警读取
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void PLCTimer_Elapsed(object sender, ElapsedEventArgs e)
        {
            try
            {
                plcTimer.Enabled = false;
                isHaveAlarm = false;
                List<AlarmText> cache = new List<AlarmText>();
                foreach (var key in BlockMap.Keys)
                {
                    if (pLCS7Driver.ReadShort(key, out short alarmVal, out string errMsg) && BlockMap[key].ContainsKey(alarmVal.ToString()))
                    {
                        //if(BlockReadCache.ContainsKey(key) && alarmCode)
                        var alarmCode = alarmVal.ToString();
                        isHaveAlarm = true;
                        var text = BlockMap[key][alarmCode]?.Description;
                        var newAlarm = new AlarmText
                        {
                            PLC_DB_BLOCK = key,
                            Source = "PLC",
                            AlarmCode = alarmCode,
                            VirtualId = $"{key}.{alarmCode}",
                            Time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
                            AlarmInfo = $"{text}",
                            Level = BlockMap[key][alarmCode]?.Level ?? 0d
                        };
                        if (currentPLCAlarmCache
                                .Find(alarm => alarm.VirtualId == newAlarm.VirtualId && alarm.PLC_DB_BLOCK == newAlarm.PLC_DB_BLOCK) == null)
                        {
                            currentPLCAlarmCache.Add(newAlarm);
                        }
                    }
                }
                foreach (var item in MarkSettings)
                {
                    var name = $"{item.DBAddress}.{item.StartAddress}";
                    if (pLCS7Driver.ReadShort(name, out short alarmVal, out string errMsg) && alarmVal != 0)
                    {
                        var alarmCode = alarmVal.ToString();
                        isHaveAlarm = true;
                        var newAlarm = new AlarmText
                        {
                            Source = "PLC",
                            VirtualId = alarmCode,
                            Time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
                            AlarmInfo = item.Description
                        };
                        if (currentPLCAlarmCache
                                .Find(d => d.AlarmInfo == newAlarm.AlarmInfo) == null)
                        {
                            currentPLCAlarmCache.Add(newAlarm);
                        }
                    }
                }
                RefershAlarm();
                //if (!isHaveAlarm) currentAlarmCachePlc.Clear();
            }
            catch (Exception ex)
            {
                //log.Error("Read OPCServer Data Error.", ex);
            }
            finally
            {
                if (!isClosing) plcTimer.Enabled = true;
            }
        }
        private void RefershAlarm()
        {
            alarmRefershToMain.Send("AlarmRefersh", string.Empty);
            List<AlarmText> alarms = new List<AlarmText>();
            foreach (AlarmText alarm in currentPLCAlarmCache)
            {
                alarm.IsPLCAlarm = true;
                if (AlarmShowHelper.ShowAlarm(alarm))
                {
                    alarms.Add(alarm);
                }
            }
            currentPLCAlarmCache.Clear();
            foreach (AlarmText alarm in currentMQAlarmCache)
            {
                alarm.IsPLCAlarm = false;
                if (AlarmShowHelper.ShowAlarm(alarm))
                {
                    alarms.Add(alarm);
                }
            }
            currentMQAlarmCache.Clear();
            OnAlarm?.Invoke(this, alarms);
        }
        private void MQTimer_Elapsed(object sender, ElapsedEventArgs e)
        {
            try
            {
                mqTimer.Enabled = false;
                alarmQueue.Receive(100, out string MessageID, out string MsgStr);
                if (MessageID != string.Empty)
                {
                    switch (MessageID)
                    {
                        case "Clear":
                            currentMQAlarmCache.Clear();
                            RefershAlarm();
                            break;
                        case "AlarmCode":
                            //AlarmText aalarm = AlarmTexts.FirstOrDefault(alarm => alarm.AlarmCode == MsgStr);
                            //if (aalarm == null) break;
                            //var data = new AlarmText
                            //{
                            //    Source = "PC",
                            //    AlarmCode = aalarm.AlarmCode,
                            //    AlarmInfo = aalarm.AlarmInfo,
                            //    Time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")
                            //};
                            ////aalarm.Source = "PC";
                            ////aalarm.Time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")
                            //if (currentMQAlarmCache.Find(alarm => alarm.AlarmCode == aalarm.AlarmCode) == null)
                            //{
                            //    currentMQAlarmCache.Add(data);
                            //    RefershAlarm();
                            //}
                            break;
                        default:
                            string[] arr = MsgStr.Split(',');
                            string source = "PC";
                            string info = string.Empty;
                            if (arr.Length > 1)
                            {
                                source = arr[0];
                                info = arr[1];
                            }
                            else
                            {
                                info = MsgStr;
                            }
                            AlarmText newAlarm = new AlarmText
                            {
                                Source = source,
                                VirtualId = $"{source}:{info}",
                                AlarmInfo = info,
                                Level = 3,
                                Time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")
                            };
                            if (currentMQAlarmCache
                                .Find(alarm => alarm.Source == newAlarm.Source && alarm.AlarmInfo == newAlarm.AlarmInfo) == null)
                            {
                                currentMQAlarmCache.Add(newAlarm);
                                RefershAlarm();
                            }
                            break;
                    }
                }
            }
            catch (Exception ex)
            {
                //log.Error("PcTimer Execute Failed", ex);
            }
            finally
            {
                if (!isClosing) mqTimer.Enabled = true;
            }
        }
        public void RefreshBlockSettings()
        {
            BlockMap.Clear();
            BlockReadCache.Clear();
            try
            {
                BlockSettings = XmlHelper.DeserializeFromXml<ObservableCollection<AlarmSetting>>(blockFilePath);
            }
            catch (Exception ex)
            {
                //log.Error("LoadAlarmSetting Error.", ex);
                BlockSettings = new ObservableCollection<AlarmSetting>();
            }
            foreach (var setting in BlockSettings)
            {
                string key = $"{setting.DBAddress}.{setting.StartAddress}";
                if (!BlockMap.ContainsKey(key))
                {
                    BlockMap[key] = new Dictionary<string, AlarmSetting>();
                }
                var codes = BlockMap[key];
                codes[setting.AlarmCode] = setting;
            }
        }
        public void RefreshMarkSettings()
        {
            try
            {
                MarkSettings = XmlHelper.DeserializeFromXml<ObservableCollection<AlarmSetting>>(markFilePath);
            }
            catch (Exception ex)
            {
                //log.Error("LoadAlarmSetting Error.", ex);
                MarkSettings = new ObservableCollection<AlarmSetting>();
            }
        }
        public void LoadAlarmSetting()
        {
            RefreshBlockSettings();
            RefreshMarkSettings();
        }
        public void UpdateBlockSettings(IEnumerable<AlarmSetting> settings)
        {
            XmlHelper.SerializeToXml(blockFilePath, settings);
            RefreshBlockSettings();
        }
        public void UpdateMarkSettings(IEnumerable<AlarmSetting> settings)
        {
            XmlHelper.SerializeToXml(markFilePath, settings);
            RefreshMarkSettings();
        }
    }
    public class AlarmUtil
    {
        static AlarmHelper Instance { get; set; }
        public static event EventHandler<List<AlarmText>> OnAlarm;
        public static event EventHandler<LoadMsg> LoadMessageAppend;
        public static ObservableCollection<AlarmSetting> BlockSettings { get => Instance?.BlockSettings; }
        public static ObservableCollection<AlarmSetting> MarkSettings { get => Instance?.MarkSettings; }
        public static void Init()
        {
            Instance = new AlarmHelper();
            Instance.LoadMessageAppend += Instance_LoadMessageAppend; ;
            Instance.InitInstance();
            Instance.OnAlarm += Instance_OnAlarm;
        }
        private static void Instance_LoadMessageAppend(object sender, LoadMsg e)
        {
            LoadMessageAppend?.Invoke(sender, e);
        }
        private static void Instance_OnAlarm(object sender, List<AlarmText> e)
        {
            OnAlarm?.Invoke(sender, e);
        }
        public static void Release()
        {
            if (Instance != null)
            {
                Instance.OnAlarm -= Instance_OnAlarm;
            }
            Instance?.Dispose();
            Instance = null;
        }
        public static void UpdateBlockSettings(IEnumerable<AlarmSetting> settings)
        {
            Instance?.UpdateBlockSettings(settings);
        }
        public static void UpdateMarkSettings(IEnumerable<AlarmSetting> settings)
        {
            Instance?.UpdateBlockSettings(settings);
        }
    }
}
HMI.Util/HMI.Util.csproj
@@ -74,6 +74,7 @@
    <Reference Include="System.Xml" />
  </ItemGroup>
  <ItemGroup>
    <Compile Include="Alarm\AlarmUtil.cs" />
    <Compile Include="DateUtil.cs" />
    <Compile Include="DbFileHelper.cs" />
    <Compile Include="ExcelHelper.cs" />
@@ -89,6 +90,10 @@
      <Project>{3e3bf44a-0b69-45c5-9512-528cb48a7106}</Project>
      <Name>HMI.Core</Name>
    </ProjectReference>
    <ProjectReference Include="..\S7Driver\S7Driver.csproj">
      <Project>{628ef12b-9ed2-4b20-950f-dc3ecc3fd15f}</Project>
      <Name>S7Driver</Name>
    </ProjectReference>
  </ItemGroup>
  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>
Libs/25/NationalInstruments.TestStand.Interop.API.dll
Binary files differ
Libs/25/NationalInstruments.TestStand.Interop.API.xml
New file
Diff too large
Libs/25/NationalInstruments.TestStand.Interop.UI.AxControls.dll
Binary files differ
Libs/25/NationalInstruments.TestStand.Interop.UI.Support.dll
Binary files differ
Libs/25/NationalInstruments.TestStand.Interop.UI.Support.xml
New file
@@ -0,0 +1,1841 @@
<?xml version="1.0" encoding="utf-8"?><doc><members>
    <member name="T:NationalInstruments.TestStand.Interop.UI.Support.AdapterListConnection">
      <summary>Represents a connection from an Application Manager control to a control that displays the list of adapters. Use the connected control to select an adapter to which to set the Engine.DefaultAdapter property.&#13; <para>Note:  This class currently contains no properties or methods. Properties or methods might be added to this class in future versions of TestStand.&#13; </para></summary>
      <seealso cref="AdapterListConnections" />
    </member>
    <member name="T:NationalInstruments.TestStand.Interop.UI.Support.AdapterListConnections">
      <summary>A collection of AdapterListConnection objects.</summary>
      <seealso cref="AdapterListConnection" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.AdapterListConnections.Count">
      <summary>Returns the number of items in the collection.</summary>
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.AdapterListConnections.Item(System.Int32)">
      <summary>Returns a reference to an item at the specified index in the collection.</summary>
      <param name="itemIndex">[In] Specifies the zero-based index of the item to retrieve.</param>
      <seealso cref="AdapterListConnection" />
      <seealso cref="AdapterListConnections.Count" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.AdapterListConnections.Add(System.Object)">
      <summary>Creates and adds a new AdapterListConnection to the collection.</summary>
      <returns>The AdapterListConnection this method creates.</returns>
      <param name="uiObj">[In] Specifies the user interface object to connect.</param>
      <seealso cref="AdapterListConnection" />
      <seealso cref="AdapterListConnections.Remove" />
      <seealso cref="ApplicationMgr.ConnectAdapterList" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.AdapterListConnections.Clear">
      <summary>Removes all items from the collection.</summary>
      <seealso cref="AdapterListConnections.Remove" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.AdapterListConnections.FromControl(System.Object)">
      <summary>Returns the AdapterListConnection connected to the uiObj parameter. When no AdapterListConnection is connected to the user interface object the parameter specifies, this method returns <c>NULL</c> .</summary>
      <param name="uiObj">[In] Specifies a connected user interface object.</param>
      <seealso cref="AdapterListConnection" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.AdapterListConnections.Remove(System.Object)">
      <summary>Removes the specified item from this collection, if it exists.</summary>
      <returns>Returns <c>True</c> when the AdapterListConnection is removed. Returns <c>False</c> when the AdapterListConnection is not found.</returns>
      <param name="uiObj">[In] Specifies the user interface object to disconnect.</param>
      <seealso cref="AdapterListConnection" />
      <seealso cref="AdapterListConnections.Add" />
    </member>
    <member name="T:NationalInstruments.TestStand.Interop.UI.Support.ApplicationMgrConnections">
      <summary>Contains the connections for an Application Manager control. Use the ApplicationMgr.Connections property to obtain a collection of ApplicationMgrConnections objects.</summary>
      <seealso cref="ApplicationMgr.Connections" />
      <seealso cref="ExecutionViewMgrConnections" />
      <seealso cref="SequenceFileViewMgrConnections" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.ApplicationMgrConnections.AdapterList">
      <summary>Collection of AdapterListConnection objects.</summary>
      <seealso cref="AdapterListConnection" />
      <seealso cref="AdapterListConnections" />
      <seealso cref="ApplicationMgr.ConnectAdapterList" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.ApplicationMgrConnections.Caption">
      <summary>Collection of CaptionConnection objects.</summary>
      <seealso cref="ApplicationMgr.ConnectCaption" />
      <seealso cref="CaptionConnection" />
      <seealso cref="CaptionConnections" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.ApplicationMgrConnections.Command">
      <summary>Collection of CommandConnection objects.</summary>
      <seealso cref="ApplicationMgr.ConnectCommand" />
      <seealso cref="CommandConnection" />
      <seealso cref="CommandConnections" />
    </member>
    <member name="T:NationalInstruments.TestStand.Interop.UI.Support.CallStackConnection">
      <summary>Represents a connection from the ExecutionView Manager control to a control that displays the callstack. You can use the connected control to change the selected sequence context when the execution is paused.&#13; <para>Note:  This class currently contains no properties or methods. Properties or methods might be added to this class in future versions of TestStand.&#13; </para></summary>
      <seealso cref="CallStackConnections" />
    </member>
    <member name="T:NationalInstruments.TestStand.Interop.UI.Support.CallStackConnections">
      <summary>A collection of CallStackConnection objects.</summary>
      <seealso cref="CallStackConnection" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.CallStackConnections.Count">
      <summary>Returns the number of items in the collection.</summary>
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.CallStackConnections.Item(System.Int32)">
      <summary>Returns a reference to an item at the specified index in the collection.</summary>
      <returns>Item located at the specified index.</returns>
      <param name="itemIndex">[In] Specifies the index of the item to retrieve.</param>
      <seealso cref="CallStackConnection" />
      <seealso cref="CallStackConnections.Count" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.CallStackConnections.Add(System.Object)">
      <summary>Creates and adds a new CallStackConnection to the collection.</summary>
      <returns>New CallStackConnection.</returns>
      <param name="uiObj">[In] Specifies the user interface object to connect.</param>
      <seealso cref="CallStackConnections.Remove" />
      <seealso cref="ExecutionViewMgr.ConnectCallStack" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.CallStackConnections.Clear">
      <summary>Removes all items from the collection.</summary>
      <seealso cref="CallStackConnections.Remove" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.CallStackConnections.FromControl(System.Object)">
      <summary>Returns the CallStackConnection connected to the UI object.</summary>
      <returns>CallStackConnection connected to this user interface object. When no CallStackConnection exists for this control, this method returns <c>NULL</c> .</returns>
      <param name="uiObj">[In] Specifies the connected user interface object.</param>
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.CallStackConnections.Remove(System.Object)">
      <summary>Removes the specified item from this collection, if it exists.</summary>
      <returns>Returns <c>True</c> when the CallStackConnection is removed. Returns <c>False</c> when the CallStackConnection is not found.</returns>
      <param name="uiObj">[In] Specifies the user interface object to disconnect.</param>
      <seealso cref="CallStackConnection" />
      <seealso cref="CallStackConnections.Add" />
    </member>
    <member name="T:NationalInstruments.TestStand.Interop.UI.Support.CaptionConnection">
      <summary>Represents a connection to a caption source.</summary>
      <seealso cref="CaptionConnections" />
      <seealso cref="CaptionSources" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.CaptionConnection.FormatExpression">
      <summary>Specifies a format expression to evaluate when generating the caption text.</summary>
      <remarks>For CaptionSource_MacroExpression , specify a format expression that evaluates to a string value that contains macros that specify other caption sources. For all other caption sources, specify a format expression that evaluates to a string value that contains the characters <c>&#37;1</c> . This method replaces the <c>&#37;1</c> characters with the text from the caption source. Pass an empty string to use the default format for the caption source.</remarks>
      <seealso cref="CaptionSource_MacroExpression" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.CaptionConnection.LongName">
      <summary>For certain caption sources, this property specifies whether to return a long or short version of the caption text. Refer to the CaptionSources enumeration for more information about determining when this option affects the text and for more information about the long and short versions of the text.</summary>
      <seealso cref="CaptionSources" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.CaptionConnection.Source">
      <summary>Specifies the type of caption source to obtain the text from.</summary>
      <seealso cref="CaptionSources" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.CaptionConnection.Refresh">
      <summary>Refreshes the user interface control connected to this CaptionConnection with the most recent text from the CaptionSource.</summary>
    </member>
    <member name="T:NationalInstruments.TestStand.Interop.UI.Support.CaptionConnections">
      <summary>A collection of CaptionConnection objects.</summary>
      <seealso cref="CaptionConnection" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.CaptionConnections.Count">
      <summary>Returns the number of items in the collection.</summary>
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.CaptionConnections.Item(System.Int32)">
      <summary>Returns a reference to an item at the specified index in the collection.</summary>
      <returns>Item located at the specified index.</returns>
      <param name="itemIndex">[In] Specifies the index of the item to retrieve.</param>
      <seealso cref="CaptionConnection" />
      <seealso cref="CaptionConnections.Count" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.CaptionConnections.Add(System.Object)">
      <summary>Creates and adds a new CaptionConnection to the collection.</summary>
      <returns>New CaptionConnection.</returns>
      <param name="uiObj">[In] Specifies the user interface object to connect.</param>
      <seealso cref="ApplicationMgr.ConnectCaption" />
      <seealso cref="CaptionConnections.Remove" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.CaptionConnections.Clear">
      <summary>Removes all items from the collection.</summary>
      <seealso cref="CaptionConnections.Remove" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.CaptionConnections.FromControl(System.Object)">
      <summary>Returns the CaptionConnection connected to the uiObj parameter.</summary>
      <returns>CaptionConnection connected to the uiObj parameter. When no CaptionConnection exists for this control, this method returns <c>NULL</c> .</returns>
      <param name="uiObj">[In] Specifies the connected user interface object.</param>
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.CaptionConnections.Remove(System.Object)">
      <summary>Removes the specified item from this collection, if it exists.</summary>
      <returns>Returns <c>True</c> when the CaptionConnection is removed. Returns <c>False</c> when the CaptionConnection is not found.</returns>
      <param name="uiObj">[In] Specifies the user interface object to disconnect.</param>
      <seealso cref="CaptionConnections.Add" />
    </member>
    <member name="T:NationalInstruments.TestStand.Interop.UI.Support.CommandConnection">
      <summary>Represents a connection to a CommandKind .</summary>
      <seealso cref="CommandConnectionOptions" />
      <seealso cref="CommandConnections" />
      <seealso cref="CommandKinds" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.CommandConnection.Index">
      <summary>Specifies which command in the set of commands to use.</summary>
      <remarks>Use this on sets of commands. Refer to the CommandKinds enumeration for more information about supported command sets.</remarks>
      <seealso cref="CommandKinds" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.CommandConnection.Kind">
      <summary>Specifies the type of Command to which this CommandConnection connects.</summary>
      <seealso cref="CommandKinds" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.CommandConnection.Options">
      <summary>Specifies the behavior of the CommandConnection.</summary>
      <remarks>The value of this property is a bitwise-OR combination of the CommandConnectionOptions constants.</remarks>
      <seealso cref="CommandConnectionOptions" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.CommandConnection.FreezeRefresh(System.Boolean)">
      <summary>Specifies to freeze the CommandConnection when setting the properties to avoid flicker on the connected control.</summary>
      <remarks><c>FreezeRefresh</c> calls must be balanced. For example, each time you call this method with a value of <c>True</c> , you must also call it with a value of <c>False</c> .</remarks>
      <param name="frz">[In] When this parameter is <c>True</c> , the CommandConnection does not refresh the control. When this parameter is <c>False</c> , the CommandConnection refreshes the control.</param>
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.CommandConnection.Refresh">
      <summary>Refreshes the state of the user interface control connected to the CommandConnection.</summary>
    </member>
    <member name="T:NationalInstruments.TestStand.Interop.UI.Support.CommandConnections">
      <summary>A collection of CommandConnection objects.</summary>
      <seealso cref="CommandConnection" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.CommandConnections.Count">
      <summary>Returns the number of items in the collection.</summary>
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.CommandConnections.Item(System.Int32)">
      <summary>Returns a reference to an item at the specified index in the collection.</summary>
      <returns>Item located at the specified index.</returns>
      <param name="itemIndex">[In] Specifies the index of the item to retrieve.</param>
      <seealso cref="CommandConnection" />
      <seealso cref="CommandConnections.Count" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.CommandConnections.Add(System.Object)">
      <summary>Creates and adds a new CommandConnection to the collection.</summary>
      <returns>New CommandConnection.</returns>
      <param name="uiObj">[In] Specifies the user interface object to connect.</param>
      <seealso cref="ApplicationMgr.ConnectCommand" />
      <seealso cref="CommandConnections.Remove" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.CommandConnections.Clear">
      <summary>Removes all items from the collection.</summary>
      <seealso cref="CommandConnections.Remove" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.CommandConnections.FromControl(System.Object)">
      <summary>Returns the CommandConnection connected to the uiObj parameter.</summary>
      <returns>CommandConnection connected to the uiObj parameter. When no CommandConnection exists for this control, this method returns <c>NULL</c> .</returns>
      <param name="uiObj">[In] Specifies the connected user interface object.</param>
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.CommandConnections.Remove(System.Object)">
      <summary>Removes the specified item from this collection, if it exists.</summary>
      <returns>Returns <c>True</c> when the CommandConnection is removed. Returns <c>False</c> when the CommandConnection is not found.</returns>
      <param name="uiObj">[In] Specifies the user interface object to disconnect.</param>
      <seealso cref="CommandConnections.Add" />
    </member>
    <member name="T:NationalInstruments.TestStand.Interop.UI.Support.ExecutionListConnection">
      <summary>Represents a connection from the ExecutionView Manager control to a control that displays the list of currently running executions. You can use the connected control to select an execution from the list of executions.</summary>
      <seealso cref="ExecutionListConnections" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.ExecutionListConnection.DisplayExpression">
      <summary>Specifies how to display executions in the execution list using a format expression. By default, the value of this property is <c>&#34;&#37;CurrentExecution&#37;&#34;</c> . Refer to the CaptionSource_MacroExpression enumeration value for more information about types of caption sources.</summary>
      <seealso cref="CaptionSource_MacroExpression" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.ExecutionListConnection.ShowHiddenExecutions">
      <summary>When this property is <c>True</c> , the execution list shows executions created with the <c>ExecTypeMask_InitiallyHidden</c> flag.</summary>
    </member>
    <member name="T:NationalInstruments.TestStand.Interop.UI.Support.ExecutionListConnections">
      <summary>A collection of ExecutionListConnection objects.</summary>
      <seealso cref="ExecutionListConnection" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.ExecutionListConnections.Count">
      <summary>Returns the number of items in the collection.</summary>
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.ExecutionListConnections.Item(System.Int32)">
      <summary>Returns a reference to an item at the specified index in the collection.</summary>
      <returns>Item located at the specified index.</returns>
      <param name="itemIndex">[In] Specifies the index of the item to retrieve.</param>
      <seealso cref="ExecutionListConnection" />
      <seealso cref="ExecutionListConnections.Count" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.ExecutionListConnections.Add(System.Object)">
      <summary>Creates and adds a new ExecutionListConnection to the collection.</summary>
      <returns>New ExecutionListConnection.</returns>
      <param name="uiObj">[In] Specifies the user interface object to connect.</param>
      <seealso cref="ExecutionListConnections.Remove" />
      <seealso cref="ExecutionViewMgr.ConnectExecutionList" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.ExecutionListConnections.Clear">
      <summary>Removes all items from the collection.</summary>
      <seealso cref="ExecutionListConnections.Remove" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.ExecutionListConnections.FromControl(System.Object)">
      <summary>Returns the ExecutionListConnection connected to the uiObj parameter.</summary>
      <returns>ExecutionListConnection connected to the uiObj parameter. When no ExecutionListConnection exists for this control, this method returns <c>NULL</c> .</returns>
      <param name="uiObj">[In] Specifies the connected user interface object.</param>
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.ExecutionListConnections.Remove(System.Object)">
      <summary>Removes the specified item from this collection, if it exists.</summary>
      <returns>Returns <c>True</c> when the ExecutionListConnection is removed. Returns <c>False</c> when the <c>ExecutionListConnection</c> is not found.</returns>
      <param name="uiObj">[In] Specifies the user interface object to disconnect.</param>
      <seealso cref="ExecutionListConnection" />
      <seealso cref="ExecutionListConnections.Add" />
    </member>
    <member name="T:NationalInstruments.TestStand.Interop.UI.Support.ExecutionViewConnection">
      <summary>Represents a connection from an ExecutionView Manager control to an ExecutionViewMgrConnections.ExecutionView property. When tracing is enabled, the connected control shows the steps of the execution as they are executing. Use the ExecutionViewMgr.Connections property to obtain a collection of ExecutionViewConnection objects.</summary>
      <seealso cref="ExecutionViewMgrConnections.ExecutionView" />
      <seealso cref="ExecutionViewConnections" />
      <seealso cref="ExecutionViewMgr.Connections" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.ExecutionViewConnection.ColorPaused">
      <summary>Specifies the background color of the control when the execution in the ExecutionView Manager control is paused. This setting is ignored when the value of the ExecutionViewConnection.Options property is <c>ExecutionViewConnection_IgnoreColors</c> .</summary>
      <seealso cref="ExecutionViewConnection.Options" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.ExecutionViewConnection.ColorRunning">
      <summary>Specifies the background color of the control when the execution in the ExecutionView Manager control is running. This setting is ignored when the value of the ExecutionViewConnection.Options property is <c>ExecutionViewConnection_IgnoreColors</c> .</summary>
      <seealso cref="ExecutionViewConnection.Options" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.ExecutionViewConnection.ColorStopped">
      <summary>Specifies the background color of the control when the execution in the ExecutionView Manager control is stopped. This setting is ignored when the value of the ExecutionViewConnection.Options property is <c>ExecutionViewConnection_IgnoreColors</c> .</summary>
      <seealso cref="ExecutionViewConnection.Options" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.ExecutionViewConnection.Options">
      <summary>Specifies the behavior of the ExecutionViewConnection. The value of this property is a bitwise-OR combination of the ExecutionViewOptions constants.</summary>
      <seealso cref="ExecutionViewOptions" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.ExecutionViewConnection.UIControl">
      <summary>Returns the user interface control the connection connects to an ExecutionView Manager control.</summary>
    </member>
    <member name="T:NationalInstruments.TestStand.Interop.UI.Support.ExecutionViewConnections">
      <summary>A collection of ExecutionViewConnection objects you obtain by calling the ExecutionViewMgr.Connections property.</summary>
      <seealso cref="ExecutionViewConnection" />
      <seealso cref="ExecutionViewMgr.Connections" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.ExecutionViewConnections.Count">
      <summary>Returns the number of items in the collection.</summary>
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.ExecutionViewConnections.Item(System.Int32)">
      <summary>Returns a reference to an item at the specified index in the collection.</summary>
      <returns>Item located at the specified index.</returns>
      <param name="itemIndex">[In] Specifies the index of the item to retrieve.</param>
      <seealso cref="ExecutionViewConnection" />
      <seealso cref="ExecutionViewConnections.Count" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.ExecutionViewConnections.Add(System.Object)">
      <summary>Creates and adds a new ExecutionViewConnection to the collection.</summary>
      <returns>New ExecutionViewConnection.</returns>
      <param name="uiObj">[In] Specifies the user interface object to connect.</param>
      <seealso cref="ExecutionViewConnections.Remove" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.ExecutionViewConnections.Clear">
      <summary>Removes all items from the collection.</summary>
      <seealso cref="ExecutionViewConnections.Remove" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.ExecutionViewConnections.FromControl(System.Object)">
      <summary>Returns the ExecutionViewConnection that is connected to the uiObj parameter.</summary>
      <returns>ExecutionViewConnection connected to the uiObj parameter. When no ExecutionViewConnection exists for this control, this method returns <c>NULL</c> .</returns>
      <param name="uiObj">[In] Specifies the connected user interface object.</param>
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.ExecutionViewConnections.Remove(System.Object)">
      <summary>Removes the specified item from this collection, if it exists.</summary>
      <returns>Returns <c>True</c> when the ExecutionViewConnection is removed. Returns <c>False</c> when the ExecutionViewConnection is not found.</returns>
      <param name="uiObj">[In] Specifies the user interface object to disconnect.</param>
      <seealso cref="ExecutionViewConnections.Add" />
    </member>
    <member name="T:NationalInstruments.TestStand.Interop.UI.Support.ExecutionViewMgrConnections">
      <summary>Contains the connections for an ExecutionView Manager control.</summary>
      <seealso cref="ApplicationMgrConnections" />
      <seealso cref="SequenceFileViewMgrConnections" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.ExecutionViewMgrConnections.CallStack">
      <summary>Collection of CallStackConnection objects.</summary>
      <seealso cref="CallStackConnection" />
      <seealso cref="CallStackConnections" />
      <seealso cref="ExecutionViewMgr.ConnectCallStack" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.ExecutionViewMgrConnections.Caption">
      <summary>Collection of CaptionConnection objects.</summary>
      <seealso cref="CaptionConnection" />
      <seealso cref="CaptionConnections" />
      <seealso cref="ExecutionViewMgr.ConnectCaption" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.ExecutionViewMgrConnections.Command">
      <summary>Collection of CommandConnection objects.</summary>
      <seealso cref="CommandConnection" />
      <seealso cref="CommandConnections" />
      <seealso cref="ExecutionViewMgr.ConnectCommand" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.ExecutionViewMgrConnections.ExecutionList">
      <summary>Collection of ExecutionListConnection objects.</summary>
      <seealso cref="ExecutionListConnection" />
      <seealso cref="ExecutionListConnections" />
      <seealso cref="ExecutionViewMgr.ConnectExecutionList" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.ExecutionViewMgrConnections.ExecutionView">
      <summary>Collection of ExecutionViewConnection objects.</summary>
      <seealso cref="ExecutionViewConnection" />
      <seealso cref="ExecutionViewConnections" />
      <seealso cref="ExecutionViewMgr.ConnectExecutionView" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.ExecutionViewMgrConnections.Image">
      <summary>Collection of ImageConnection objects.</summary>
      <seealso cref="ExecutionViewMgr.ConnectImage" />
      <seealso cref="ImageConnection" />
      <seealso cref="ImageConnections" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.ExecutionViewMgrConnections.Numeric">
      <summary>Collection of NumericConnection objects.</summary>
      <seealso cref="ExecutionViewMgr.ConnectNumeric" />
      <seealso cref="NumericConnection" />
      <seealso cref="NumericConnections" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.ExecutionViewMgrConnections.ReportView">
      <summary>Collection of ReportViewConnection objects.</summary>
      <seealso cref="ExecutionViewMgr.ConnectReportView" />
      <seealso cref="ReportViewConnection" />
      <seealso cref="ReportViewConnections" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.ExecutionViewMgrConnections.ThreadList">
      <summary>Collection of ThreadListConnection objects.</summary>
      <seealso cref="ExecutionViewMgr.ConnectThreadList" />
      <seealso cref="ThreadListConnection" />
      <seealso cref="ThreadListConnections" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.ExecutionViewMgrConnections.Variables">
      <summary>Collection of VariablesConnection objects.</summary>
      <seealso cref="ExecutionViewMgr.ConnectVariables" />
      <seealso cref="VariablesConnection" />
      <seealso cref="VariablesConnections" />
    </member>
    <member name="T:NationalInstruments.TestStand.Interop.UI.Support.ImageConnection">
      <summary>Represents a connection to an image source.</summary>
      <seealso cref="ImageConnections" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.ImageConnection.Source">
      <summary>Specifies the type of ImageConnection to obtain an image from.</summary>
      <returns>Use the following constants with this data type: ImageSource_BatchState &#8211;(Value: 6) Displays an image that indicates the execution state of the batch that contains the current execution. This image source applies only to the ExecutionView Manager control.&#13; ImageSource_BatchStatus &#8211;(Value: 5) Displays an image that indicates the batch result status for the batch that contains the current execution. This image source applies only to the ExecutionView Manager control.&#13; ImageSource_CurrentCallStackEntry &#8211;(Value: 23) Displays a call stack icon for the selected stack frame in the current execution thread. When no current thread exists, the image source displays an empty image. This image source applies only to the ExecutionView Manager control.&#13; ImageSource_CurrentExecution &#8211;(Value: 21) Displays an execution icon when a current execution exists. Otherwise, the image source displays an empty image. This image source applies only to the ExecutionView Manager control.&#13; ImageSource_CurrentProcessModelFile &#8211;(Value: 24) Displays a sequence file icon when a process model exists for the currently executing or currently selected file. Otherwise, the image source displays an empty image. This image source applies to the ExecutionView Manager and SequenceFileView Manager controls.&#13; ImageSource_CurrentSequence &#8211;(Value: 12) Displays a sequence icon when a currently executing or currently selected sequence exists. Otherwise, the image source displays an empty image. This image source applies to the ExecutionView Manager and SequenceFileView Manager controls.&#13; ImageSource_CurrentSequenceFile &#8211;(Value: 11) Displays a sequence file icon when a currently executing or currently selected file exists. Otherwise, the image source displays an empty image. This image source applies to the ExecutionView Manager and SequenceFileView Manager controls.&#13; ImageSource_CurrentStep &#8211;(Value: 14) Displays the icon for the current step in the current execution. This image source applies only to the ExecutionView Manager control.&#13; ImageSource_CurrentStepGroup &#8211;(Value: 13) Displays an image that indicates the currently executing or currently selected step group. This image source applies to the ExecutionView Manager and SequenceFileView Manager controls.&#13; ImageSource_CurrentThread &#8211;(Value: 22) Displays a thread icon when a current thread for the current execution exists. When no current thread exists, the image source displays an empty image. This image source applies only to the ExecutionView Manager control.&#13; ImageSource_ModelState &#8211;(Value: 7) Displays an image that indicates the state of the current execution. This image source applies only to the ExecutionView Manager control.&#13; ImageSource_NotASource &#8211;(Value: 0) Guaranteed to never be a valid image source specifier.&#13; ImageSource_UUTStatus &#8211;(Value: 3) Displays an image that indicates the result status of the unit under test for the current execution. This image source applies only to the ExecutionView Manager control.</returns>
      <seealso cref="ExecutionViewMgr" />
      <seealso cref="SequenceFileViewMgr" />
    </member>
    <member name="T:NationalInstruments.TestStand.Interop.UI.Support.ImageConnections">
      <summary>A collection of ImageConnection objects.</summary>
      <seealso cref="ExecutionViewMgr.ConnectImage" />
      <seealso cref="ImageConnection" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.ImageConnections.Count">
      <summary>Returns the number of items in the collection.</summary>
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.ImageConnections.Item(System.Int32)">
      <summary>Returns a reference to an item at the specified index in the collection.</summary>
      <returns>Item located at the specified index.</returns>
      <param name="itemIndex">[In] Specifies the index of the item to retrieve.</param>
      <seealso cref="ImageConnection" />
      <seealso cref="ImageConnections.Count" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.ImageConnections.Add(System.Object)">
      <summary>Creates and adds a new ImageConnection to the collection.</summary>
      <returns>New ImageConnection.</returns>
      <param name="uiObj">[In] Specifies the user interface object to connect.</param>
      <seealso cref="ExecutionViewMgr.ConnectImage" />
      <seealso cref="ImageConnections.Remove" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.ImageConnections.Clear">
      <summary>Removes all items from the collection.</summary>
      <seealso cref="ImageConnections.Remove" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.ImageConnections.FromControl(System.Object)">
      <summary>Returns the ImageConnection connected to the uiObj parameter.</summary>
      <returns>ImageConnection connected to the uiObj parameter. When no ImageConnection exists for this control, this method returns <c>NULL</c> .</returns>
      <param name="uiObj">[In] Specifies the connected user interface object.</param>
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.ImageConnections.Remove(System.Object)">
      <summary>Removes the specified item from this collection, if it exists.</summary>
      <returns>Returns <c>True</c> when the ImageConnection is removed. Returns <c>False</c> when the ImageConnection is not found.</returns>
      <param name="uiObj">[In] Specifies the user interface object to disconnect.</param>
      <seealso cref="ImageConnections.Add" />
    </member>
    <member name="T:NationalInstruments.TestStand.Interop.UI.Support.InsertionPaletteConnection">
      <summary>Represents a connection from a SequenceFileView Manager control to an InsertionPalette control. The InsertionPalette control displays a list of step types and a list of user defined template steps, sequences, and variables. Use the connected control to insert a step, sequence, or variable into a sequence file.</summary>
      <seealso cref="InsertionPalette" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.InsertionPaletteConnection.StepTypesPage">
      <summary>Specifies the index of the Step Types page in the InsertionPalettePages collection.</summary>
      <seealso cref="InsertionPaletteConnection.TemplatesPage" />
      <seealso cref="InsertionPalettePage" />
      <seealso cref="InsertionPalettePages" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.InsertionPaletteConnection.TemplatesPage">
      <summary>Specifies the index of the Templates page in the InsertionPalettePages collection.</summary>
      <seealso cref="InsertionPaletteConnection.StepTypesPage" />
      <seealso cref="InsertionPalettePage" />
      <seealso cref="InsertionPalettePages" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.InsertionPaletteConnection.UIControl">
      <summary>Returns the user interface control the connection connects to a SequenceFileView Manager control.</summary>
      <seealso cref="SequenceFileViewMgr" />
    </member>
    <member name="T:NationalInstruments.TestStand.Interop.UI.Support.InsertionPaletteConnections">
      <summary>A collection of InsertionPaletteConnection objects.</summary>
      <seealso cref="InsertionPaletteConnection" />
      <seealso cref="SequenceFileViewMgr.ConnectInsertionPalette" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.InsertionPaletteConnections.Count">
      <summary>Returns the number of items in the collection.</summary>
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.InsertionPaletteConnections.Item(System.Int32)">
      <summary>Returns a reference to an item at the specified index in the collection.</summary>
      <returns>Item located at the specified index.</returns>
      <param name="itemIndex">[In] Specifies the zero-based index of the item to retrieve.</param>
      <seealso cref="InsertionPaletteConnection" />
      <seealso cref="InsertionPaletteConnections.Count" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.InsertionPaletteConnections.Add(System.Object)">
      <summary>Creates and adds a new InsertionPaletteConnection to the collection.</summary>
      <returns>New InsertionPaletteConnection object.</returns>
      <param name="uiObj">[In] Specifies the user interface object to connect.</param>
      <seealso cref="ExecutionViewMgr.ConnectVariables" />
      <seealso cref="InsertionPaletteConnections.Remove" />
      <seealso cref="SequenceFileViewMgr.ConnectVariables" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.InsertionPaletteConnections.Clear">
      <summary>Removes all items from the collection.</summary>
      <seealso cref="InsertionPaletteConnections.Remove" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.InsertionPaletteConnections.FromControl(System.Object)">
      <summary>Returns the InsertionPaletteConnection connected to the uiObj parameter.</summary>
      <returns>InsertionPaletteConnection connected to this user interface object. When no InsertionPaletteConnection exists for this control, this method returns <c>NULL</c> .</returns>
      <param name="uiObj">[In] Specifies the connected user interface object.</param>
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.InsertionPaletteConnections.Remove(System.Object)">
      <summary>Removes the specified item from this collection, if it exists.</summary>
      <returns>Returns <c>True</c> when the InsertionPaletteConnection is removed. Returns <c>False</c> when the InsertionPaletteConnection is not found.</returns>
      <param name="uiObj">[In] Specifies the user interface object to disconnect.</param>
      <seealso cref="InsertionPaletteConnections.Add" />
    </member>
    <member name="T:NationalInstruments.TestStand.Interop.UI.Support.MRUFiles">
      <summary>A collection of the most recently used (MRU) files. Each item in the collection is a filename.</summary>
      <seealso cref="ApplicationMgr.MRUFiles" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.MRUFiles.Count">
      <summary>Returns the number of items in the collection.</summary>
      <seealso cref="MRUFiles.Max" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.MRUFiles.Item(System.Int32)">
      <summary>Returns a reference to an item at the specified index in the collection.</summary>
      <returns>Filename of the most recently used file at the specified index.</returns>
      <param name="itemIndex">[In] Specifies the index of the item to retrieve.</param>
      <seealso cref="MRUFiles.Count" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.MRUFiles.Max">
      <summary>Specifies the maximum size of the collection.</summary>
      <remarks>The MRUFiles collection cannot become larger than the size this property specifies. When the collection reaches the maximum size, new items you add to the beginning of the collection replace the oldest items at the end of the collection. The Application Manager control persists the value this property specifies.</remarks>
      <seealso cref="MRUFiles.Add" />
      <seealso cref="MRUFiles.Count" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.MRUFiles.Add(System.String)">
      <summary>Adds a filename to the beginning of the collection.</summary>
      <param name="fileNameVal">[In] Specifies the filename to add to the collection.</param>
      <seealso cref="MRUFiles.Max" />
      <seealso cref="MRUFiles.Remove" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.MRUFiles.Clear">
      <summary>Removes all items from the collection.</summary>
      <seealso cref="MRUFiles.Remove" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.MRUFiles.GetDisplayName(System.Int32,System.Int32)">
      <summary>Returns a string that you can display in a menu used for opening the most recently used files.</summary>
      <returns>The display name of the filename at the index.</returns>
      <param name="itemIndex">[In] Specifies the index of an item.</param>
      <param name="maxWidth">[In] Specifies the maximum width, in pixels, of the display name string. The width of the string is measured using the system menu font.&#13; This parameter has a default value of <c>200</c> .</param>
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.MRUFiles.Remove(System.String)">
      <summary>Removes the specified item from this collection, if it exists.</summary>
      <returns>Returns <c>True</c> when the item is removed from the collection. Returns <c>False</c> when the item is not found.</returns>
      <param name="fileNameVal">[In] Specifies the filename to remove from the collection.</param>
      <seealso cref="MRUFiles.Add" />
    </member>
    <member name="T:NationalInstruments.TestStand.Interop.UI.Support.NumericConnection">
      <summary>Represents a connection to a numeric source.</summary>
      <seealso cref="NumericConnections" />
      <seealso cref="NumericSources" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.NumericConnection.Source">
      <summary>NumericSource of the connection.</summary>
      <returns>Use the following constants with this data type: NumericSources_NotASource &#8211;(Value: 0) Guaranteed to never be a valid numeric source specifier.&#13; NumericSources_ProgressPercent &#8211;(Value: 10) A value from <c>0.0</c> to <c>100.0</c> that indicates the percentage of progress the current execution reports. This value indicates the progress of operations for which the execution chooses to report the amount of progress. The value does not necessarily reflect the progress of the execution as a whole. This numeric source applies only to the ExecutionView Manager control.</returns>
      <seealso cref="ExecutionViewMgr" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.NumericConnection.Refresh">
      <summary>Refreshes the connected control with the current value of the NumericSource.</summary>
    </member>
    <member name="T:NationalInstruments.TestStand.Interop.UI.Support.NumericConnections">
      <summary>A collection of NumericConnection objects.</summary>
      <seealso cref="ExecutionViewMgr.ConnectNumeric" />
      <seealso cref="NumericConnection" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.NumericConnections.Count">
      <summary>Returns the number of items in the collection.</summary>
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.NumericConnections.Item(System.Int32)">
      <summary>Returns a reference to an item at the specified index in the collection.</summary>
      <returns>Item located at the specified index.</returns>
      <param name="itemIndex">[In] Specifies the index of the item to retrieve.</param>
      <seealso cref="NumericConnection" />
      <seealso cref="NumericConnections.Count" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.NumericConnections.Add(System.Object)">
      <summary>Creates and adds a new NumericConnection to the collection.</summary>
      <returns>New NumericConnection.</returns>
      <param name="uiObj">[In] Specifies the user interface object to connect.</param>
      <seealso cref="ExecutionViewMgr.ConnectNumeric" />
      <seealso cref="NumericConnections.Remove" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.NumericConnections.Clear">
      <summary>Removes all items from the collection.</summary>
      <seealso cref="NumericConnections.Remove" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.NumericConnections.FromControl(System.Object)">
      <summary>Returns the NumericConnection connected to the uiObj parameter.</summary>
      <returns>NumericConnection connected to the uiObj parameter. When no NumericConnection exists for this control, this method returns <c>NULL</c> .</returns>
      <param name="uiObj">[In] Specifies the connected user interface object.</param>
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.NumericConnections.Remove(System.Object)">
      <summary>Removes the specified item from this collection, if it exists.</summary>
      <returns>Returns <c>True</c> when the NumericConnection is removed. Returns <c>False</c> when the NumericConnection is not found.</returns>
      <param name="uiObj">[In] Specifies the user interface object to disconnect.</param>
      <seealso cref="NumericConnections.Add" />
    </member>
    <member name="T:NationalInstruments.TestStand.Interop.UI.Support.ReportViewConnection">
      <summary>Represents a connection from the ExecutionView Manager control to a control that displays a report associated with an execution.&#13; <para>Note:  This class currently contains no properties or methods. Properties or methods might be added to this class in future versions of TestStand.&#13; </para></summary>
      <seealso cref="ReportViewConnections" />
    </member>
    <member name="T:NationalInstruments.TestStand.Interop.UI.Support.ReportViewConnections">
      <summary>A collection of ReportViewConnection objects.</summary>
      <seealso cref="ReportViewConnection" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.ReportViewConnections.Count">
      <summary>Returns the number of items in the collection.</summary>
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.ReportViewConnections.Item(System.Int32)">
      <summary>Returns a reference to an item at the specified index in the collection.</summary>
      <returns>Item located at the specified index.</returns>
      <param name="itemIndex">[In] Specifies the index of the item to retrieve.</param>
      <seealso cref="ReportViewConnection" />
      <seealso cref="ReportViewConnections.Count" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.ReportViewConnections.Add(System.Object)">
      <summary>Creates and adds a new ReportViewConnection to the collection.</summary>
      <returns>New ReportViewConnection.</returns>
      <param name="uiObj">[In] Specifies the user interface object to connect.</param>
      <seealso cref="ExecutionViewMgr.ConnectReportView" />
      <seealso cref="ReportViewConnections.Remove" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.ReportViewConnections.Clear">
      <summary>Removes all items from the collection.</summary>
      <seealso cref="ReportViewConnections.Remove" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.ReportViewConnections.FromControl(System.Object)">
      <summary>Returns the ReportViewConnection connected to the uiObj parameter.</summary>
      <returns>ReportViewConnection connected to the uiObj parameter. When no ReportViewConnection exists for this control, this method returns <c>NULL</c> .</returns>
      <param name="uiObj">[In] Specifies the connected user interface object.</param>
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.ReportViewConnections.Remove(System.Object)">
      <summary>Removes the specified item from this collection, if it exists.</summary>
      <returns>Returns <c>True</c> when the ReportViewConnection is removed. Returns <c>False</c> when the ReportViewConnection is not found.</returns>
      <param name="uiObj">[In] Specifies the user interface object to disconnect.</param>
      <seealso cref="ReportViewConnections.Add" />
    </member>
    <member name="T:NationalInstruments.TestStand.Interop.UI.Support.SelectedPropertyObjects">
      <summary>A collection of selected property objects. Controls connected to the SequenceFileView Manager and ExecutionView Manager controls, such as the VariablesView , automatically update the collection while active. You can obtain a reference to the collection from the SequenceFileViewMgr.SelectedPropertyObjects and ExecutionViewMgr.SelectedPropertyObjects properties.</summary>
      <seealso cref="ExecutionViewMgr" />
      <seealso cref="ExecutionViewMgr.SelectedPropertyObjects" />
      <seealso cref="SequenceFileViewMgr" />
      <seealso cref="SequenceFileViewMgr.SelectedPropertyObjects" />
      <seealso cref="VariablesView" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.SelectedPropertyObjects.Count">
      <summary>Returns the number of items in the collection.</summary>
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.SelectedPropertyObjects.Item(System.Int32)">
      <summary>Returns a reference to an item at the specified index in the collection.</summary>
      <param name="itemIndex">[In] Specifies a zero-based index of the item to retrieve.</param>
      <seealso cref="SelectedPropertyObjects.Count" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.SelectedPropertyObjects.AddPropertyObject(NationalInstruments.TestStand.Interop.API.PropertyObject)">
      <summary>Adds a property object to the collection.</summary>
      <param name="val">[In] Specifies the property object to add.</param>
      <seealso cref="SelectedPropertyObjects.Clear" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.SelectedPropertyObjects.AddPropertyObjects(System.Object[])">
      <summary>Adds an array of property objects to the collection.</summary>
      <param name="val">[In] Specifies the property objects to add.</param>
      <seealso cref="SelectedPropertyObjects.Clear" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.SelectedPropertyObjects.BeginUpdate">
      <summary>Call this method before you make multiple changes to the SelectedPropertyObjects collection. When you finish changing the collection, call the SelectedPropertyObjects.EndUpdate method to update the TestStand User Interface (UI) Controls according to the changes.</summary>
      <remarks>Use this method to minimize redrawing in the TestStand UI Controls when you programmatically change the selection.</remarks>
      <seealso cref="SelectedPropertyObjects.EndUpdate" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.SelectedPropertyObjects.Clear">
      <summary>Removes all items from the collection.</summary>
      <seealso cref="SelectedPropertyObjects.AddPropertyObject" />
      <seealso cref="SelectedPropertyObjects.AddPropertyObjects" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.SelectedPropertyObjects.EndUpdate">
      <summary>Updates the TestStand User Interface Controls according to the SelectedPropertyObjects collection changes you make after you call the SelectedPropertyObjects.BeginUpdate method.</summary>
      <seealso cref="SelectedPropertyObjects.BeginUpdate" />
    </member>
    <member name="T:NationalInstruments.TestStand.Interop.UI.Support.SelectedSequences">
      <summary>A collection of selected sequences. You can obtain a reference to the collection from the SequenceFileViewMgr.SelectedSequences property.</summary>
      <seealso cref="SequenceFileViewMgr.SelectedSequences" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.SelectedSequences.Count">
      <summary>Returns the number of items in the collection.</summary>
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.SelectedSequences.Item(System.Int32)">
      <summary>Returns a reference to an item at the specified index in the collection.</summary>
      <returns>The sequence at the specified index in the collection.</returns>
      <param name="itemIndex">[In] Specifies the index of the item to retrieve.</param>
      <seealso cref="SelectedSequences.Count" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.SelectedSequences.AddSequence(NationalInstruments.TestStand.Interop.API.Sequence)">
      <summary>Adds a sequence to the SelectedSequences collection.</summary>
      <param name="val">[In] Specifies the sequence to add.</param>
      <seealso cref="SelectedSequences.AddSequences" />
      <seealso cref="SelectedSequences.Clear" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.SelectedSequences.AddSequences(System.Object[])">
      <summary>Adds an array of sequences to the SelectedSequences collection.</summary>
      <param name="val">[In] Specifies the array of sequences to add.</param>
      <seealso cref="SelectedSequences.AddSequence" />
      <seealso cref="SelectedSequences.Clear" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.SelectedSequences.BeginUpdate">
      <summary>Call this method before making multiple changes to the SelectedSequences collection. When you finish changing the collection, call the SelectedSequences.EndUpdate method to update the TestStand User Interface (UI) Controls according to the changes.</summary>
      <remarks>Use this method to minimize redrawing in the TestStand UI Controls when you programmatically change the selection.</remarks>
      <seealso cref="SelectedSequences.EndUpdate" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.SelectedSequences.Clear">
      <summary>Removes all items from the collection.</summary>
      <seealso cref="SelectedSequences.AddSequence" />
      <seealso cref="SelectedSequences.AddSequences" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.SelectedSequences.EndUpdate">
      <summary>Updates the user interface according to all changes to the SelectedSequences collection you make after a previous call to the SelectedSequences.BeginUpdate method.</summary>
      <seealso cref="SelectedSequences.BeginUpdate" />
    </member>
    <member name="T:NationalInstruments.TestStand.Interop.UI.Support.SelectedSteps">
      <summary>A collection of selected steps. You can obtain a reference to the collection from the SequenceFileViewMgr.SelectedSteps and ExecutionViewMgr.SelectedSteps properties.</summary>
      <seealso cref="ExecutionViewMgr.SelectedSteps" />
      <seealso cref="SequenceFileViewMgr.SelectedSteps" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.SelectedSteps.Count">
      <summary>Returns the number of items in the collection.</summary>
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.SelectedSteps.EndSelected">
      <summary>Specifies whether the End step is selected.</summary>
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.SelectedSteps.Item(System.Int32)">
      <summary>Returns a reference to an item at the specified index in the collection.</summary>
      <returns>The step at the specified index in the collection.</returns>
      <param name="itemIndex">[In] Specifies the index of the item to retrieve.</param>
      <seealso cref="SelectedSteps.Count" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.SelectedSteps.SelectionFlags">
      <summary>When the SequenceFileViewMgr.StepGroupMode property is <c>StepGroupMode_AllGroups</c> , this property indicates whether the selection includes the step group start and end markers. The property also indicates whether each step group is expanded or collapsed. The value of this property is a bitwise-OR combination of the SelectionFlags constants.</summary>
      <seealso cref="SelectionFlags" />
      <seealso cref="SequenceFileViewMgr.StepGroupMode" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.SelectedSteps.AddStep(NationalInstruments.TestStand.Interop.API.Step)">
      <summary>Adds a step to the collection.</summary>
      <param name="val">[In] Specifies the step to add.</param>
      <seealso cref="SelectedSteps.AddStepIndex" />
      <seealso cref="SelectedSteps.AddSteps" />
      <seealso cref="SelectedSteps.Clear" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.SelectedSteps.AddStepIndex(System.Int32)">
      <summary>Adds a step to the collection.</summary>
      <remarks>When the SequenceFileViewMgr.StepGroupMode property is <c>StepGroupMode_AllGroups</c> , call the SelectedSteps.AddStep method instead of this method.</remarks>
      <param name="stepIndex">[In] Specifies the index in the current step group of the step to add.</param>
      <seealso cref="SelectedSteps.AddStep" />
      <seealso cref="SelectedSteps.EndSelected" />
      <seealso cref="SequenceFileViewMgr.StepGroup" />
      <seealso cref="SequenceFileViewMgr.StepGroupMode" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.SelectedSteps.AddSteps(System.Object[])">
      <summary>Adds an array of steps to the collection.</summary>
      <param name="val">[In] Specifies the steps to add.</param>
      <seealso cref="SelectedSteps.AddStepIndex" />
      <seealso cref="SelectedSteps.AddSteps" />
      <seealso cref="SelectedSteps.Clear" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.SelectedSteps.BeginUpdate">
      <summary>Call this method before making multiple changes to the SelectedSteps collection. When you finish changing the collection, call the SelectedSteps.EndUpdate method to update the TestStand User Interface (UI) Controls according to the changes.</summary>
      <remarks>Use this method to minimize redrawing in the TestStand UI Controls when you programmatically change the selection.</remarks>
      <seealso cref="SelectedSteps.EndUpdate" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.SelectedSteps.Clear">
      <summary>Removes all items from the collection.</summary>
      <seealso cref="SelectedSteps.AddStep" />
      <seealso cref="SelectedSteps.AddStepIndex" />
      <seealso cref="SelectedSteps.AddSteps" />
      <seealso cref="SelectedSteps.EndSelected" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.SelectedSteps.EndUpdate">
      <summary>Updates the user interface according to all changes to the SelectedSteps collection you made after the previous call to the SelectedSteps.BeginUpdate method.</summary>
      <seealso cref="SelectedSteps.BeginUpdate" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.SelectedSteps.GetStepGroup(System.Int32)">
      <summary>Returns the step group of the specified step in the collection.</summary>
      <returns>Use the following constants with this data type: StepGroup_Cleanup &#8211;(Value: 2) Specifies the Cleanup step group.&#13; StepGroup_Main &#8211;(Value: 1) Specifies the Main step group.&#13; StepGroup_Setup &#8211;(Value: 0) Specifies the Setup step group.</returns>
      <param name="nthSelectedStep">[In] Specifies the index of a step in the collection.</param>
      <seealso cref="SelectedSteps.GetStepIndex" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.SelectedSteps.GetStepIndex(System.Int32)">
      <summary>Retrieves the step index within a step group of a selected step.</summary>
      <returns>The step index of the step in the collection.</returns>
      <param name="nthSelectedStep">[In] Specifies the index of a step in the collection.</param>
      <seealso cref="SelectedSteps.EndSelected" />
      <seealso cref="SelectedSteps.GetStepGroup" />
    </member>
    <member name="T:NationalInstruments.TestStand.Interop.UI.Support.SequenceFileListConnection">
      <summary>Represents a connection from a SequenceFileView Manager control to a control that displays a list of open sequence files. Use the connected control to select a sequence file to open in the SequenceFileView Manager control from the list of sequence files.</summary>
      <seealso cref="SequenceFileListConnections" />
      <seealso cref="SequenceFileViewMgr.ConnectSequenceFileList" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.SequenceFileListConnection.ShowCommentInTip">
      <summary>Specifies whether the item tooltip includes the sequence file comment in controls you connect to display the list of loaded sequence files.</summary>
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.SequenceFileListConnection.ShowFullPath">
      <summary>When this property is <c>True</c> , the connected control displays the full path for all sequence files. Otherwise, the connected control displays only filenames.</summary>
    </member>
    <member name="T:NationalInstruments.TestStand.Interop.UI.Support.SequenceFileListConnections">
      <summary>A collection of SequenceFileListConnection objects.</summary>
      <seealso cref="SequenceFileListConnection" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.SequenceFileListConnections.Count">
      <summary>Returns the number of items in the collection.</summary>
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.SequenceFileListConnections.Item(System.Int32)">
      <summary>Returns a reference to an item at the specified index in the collection.</summary>
      <returns>Item located at the specified index.</returns>
      <param name="itemIndex">[In] Specifies the index of the item to retrieve.</param>
      <seealso cref="SequenceFileListConnection" />
      <seealso cref="SequenceFileListConnections.Count" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.SequenceFileListConnections.Add(System.Object)">
      <summary>Creates and adds a new SequenceFileListConnection to the collection.</summary>
      <returns>New SequenceFileListConnection.</returns>
      <param name="uiObj">[In] Specifies the user interface object to connect.</param>
      <seealso cref="SequenceFileListConnections.Remove" />
      <seealso cref="SequenceFileViewMgr.ConnectSequenceFileList" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.SequenceFileListConnections.Clear">
      <summary>Removes all items from the collection.</summary>
      <seealso cref="SequenceFileListConnections.Remove" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.SequenceFileListConnections.FromControl(System.Object)">
      <summary>Returns the SequenceFileListConnection connected to the uiObj parameter.</summary>
      <returns>SequenceFileListConnection connected to the uiObj parameter. When no SequenceFileListConnection exists for this control, this method returns <c>NULL</c> .</returns>
      <param name="uiObj">[In] Specifies the connected user interface object.</param>
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.SequenceFileListConnections.Remove(System.Object)">
      <summary>Removes the specified item from this collection, if it exists.</summary>
      <returns>Returns <c>True</c> when the SequenceFileListConnection is removed. Returns <c>False</c> when the SequenceFileListConnection is not found.</returns>
      <param name="uiObj">[In] Specifies the user interface object to disconnect.</param>
      <seealso cref="SequenceFileListConnections.Add" />
    </member>
    <member name="T:NationalInstruments.TestStand.Interop.UI.Support.SequenceFileViewMgrConnections">
      <summary>Contains the connections for the SequenceFileView Manager control.</summary>
      <seealso cref="ApplicationMgrConnections" />
      <seealso cref="ExecutionViewMgrConnections" />
      <seealso cref="SequenceFileViewMgr.Connections" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.SequenceFileViewMgrConnections.Caption">
      <summary>Collection of CaptionConnection objects.</summary>
      <seealso cref="CaptionConnection" />
      <seealso cref="CaptionConnections" />
      <seealso cref="SequenceFileViewMgr.ConnectCaption" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.SequenceFileViewMgrConnections.Command">
      <summary>Collection of CommandConnection objects.</summary>
      <seealso cref="CommandConnection" />
      <seealso cref="CommandConnections" />
      <seealso cref="SequenceFileViewMgr.ConnectCommand" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.SequenceFileViewMgrConnections.Image">
      <summary>Collection of ImageConnection objects.</summary>
      <seealso cref="ImageConnection" />
      <seealso cref="ImageConnections" />
      <seealso cref="SequenceFileViewMgr.ConnectImage" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.SequenceFileViewMgrConnections.InsertionPalettes">
      <summary>Collection of InsertionPaletteConnection objects.</summary>
      <seealso cref="InsertionPaletteConnection" />
      <seealso cref="InsertionPaletteConnections" />
      <seealso cref="SequenceFileViewMgr.ConnectInsertionPalette" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.SequenceFileViewMgrConnections.SequenceFileList">
      <summary>Collection of SequenceFileListConnection objects.</summary>
      <seealso cref="SequenceFileListConnection" />
      <seealso cref="SequenceFileListConnections" />
      <seealso cref="SequenceFileViewMgr.ConnectSequenceFileList" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.SequenceFileViewMgrConnections.SequenceList">
      <summary>Collection of SequenceListConnection objects.</summary>
      <seealso cref="SequenceFileViewMgr.ConnectSequenceList" />
      <seealso cref="SequenceListConnection" />
      <seealso cref="SequenceListConnections" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.SequenceFileViewMgrConnections.SequenceView">
      <summary>Collection of SequenceViewConnection objects.</summary>
      <seealso cref="SequenceFileViewMgr.ConnectSequenceView" />
      <seealso cref="SequenceViewConnection" />
      <seealso cref="SequenceViewConnections" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.SequenceFileViewMgrConnections.StepGroupList">
      <summary>Collection of StepGroupListConnection objects.</summary>
      <seealso cref="SequenceFileViewMgr.ConnectStepGroupList" />
      <seealso cref="StepGroupListConnection" />
      <seealso cref="StepGroupListConnections" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.SequenceFileViewMgrConnections.Variables">
      <summary>Collection of VariablesConnection objects.</summary>
      <seealso cref="SequenceFileViewMgr.ConnectVariables" />
      <seealso cref="VariablesConnection" />
      <seealso cref="VariablesConnections" />
    </member>
    <member name="T:NationalInstruments.TestStand.Interop.UI.Support.SequenceListConnection">
      <summary>Represents a connection from a SequenceFileView Manager control to a control that displays a list of sequences for the current sequence file. Use the connected control to select the sequence to display.</summary>
      <seealso cref="SequenceListConnections" />
      <seealso cref="SequenceFileViewMgr.ConnectSequenceList" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.SequenceListConnection.ShowCommentInTip">
      <summary>Specifies whether the item tooltip includes the sequence comment in controls you connect to display the list of sequences in the selected sequence file.</summary>
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.SequenceListConnection.UIControl">
      <summary>Returns the user interface control the connection connects to a SequenceFileView Manager control.</summary>
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.SequenceListConnection.GetColumnIndex(NationalInstruments.TestStand.Interop.UI.Support.SeqListConnectionColumns)">
      <summary>When the specified column is visible, this method returns the index of the column within the ListBoxColumns collection. Otherwise, this method returns <c>-1</c> .</summary>
      <remarks>Use this index in the ListBoxColumns.Item property to return the ListBoxColumn for a specific column.</remarks>
      <param name="column">[In] Specifies the column to select.</param>
      <seealso cref="ListBox.ColumnSet" />
      <seealso cref="ListBoxColumn" />
      <seealso cref="ListBoxColumns" />
      <seealso cref="ListBoxColumns.Item" />
      <seealso cref="SequenceListConnection.GetColumnVisible" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.SequenceListConnection.GetColumnVisible(NationalInstruments.TestStand.Interop.UI.Support.SeqListConnectionColumns)">
      <summary>Returns a Boolean value that indicates whether the column is visible.</summary>
      <param name="column">[In] Specifies the column to select.</param>
      <seealso cref="SequenceListConnection.SetColumnVisible" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.SequenceListConnection.SetColumnVisible(NationalInstruments.TestStand.Interop.UI.Support.SeqListConnectionColumns,System.Boolean)">
      <summary>Specifies whether the column is visible.</summary>
      <remarks>You cannot hide the <c>SeqListConnectionColumn_Label</c> column.</remarks>
      <param name="column">[In] Specifies the column to select.</param>
      <param name="val">[In] Pass <c>False</c> to hide the column. Otherwise, the column is visible.</param>
      <seealso cref="SequenceListConnection.GetColumnVisible" />
    </member>
    <member name="T:NationalInstruments.TestStand.Interop.UI.Support.SequenceListConnections">
      <summary>A collection of SequenceListConnection objects.</summary>
      <seealso cref="SequenceFileViewMgr.ConnectSequenceList" />
      <seealso cref="SequenceListConnection" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.SequenceListConnections.Count">
      <summary>Returns the number of items in the collection.</summary>
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.SequenceListConnections.Item(System.Int32)">
      <summary>Returns a reference to an item at the specified index in the collection.</summary>
      <returns>Item located at the specified index.</returns>
      <param name="itemIndex">[In] Specifies the index of the item to retrieve.</param>
      <seealso cref="SequenceListConnection" />
      <seealso cref="SequenceListConnections.Count" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.SequenceListConnections.Add(System.Object)">
      <summary>Creates and adds a new SequenceListConnection to the collection.</summary>
      <returns>New SequenceListConnection.</returns>
      <param name="uiObj">[In] Specifies the user interface object to connect.</param>
      <seealso cref="SequenceFileViewMgr.ConnectSequenceList" />
      <seealso cref="SequenceListConnections.Remove" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.SequenceListConnections.Clear">
      <summary>Removes all items from the collection.</summary>
      <seealso cref="SequenceListConnections.Remove" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.SequenceListConnections.FromControl(System.Object)">
      <summary>Returns the SequenceListConnection connected to the uiObj parameter.</summary>
      <returns>SequenceListConnection connected to the uiObj parameter. When no SequenceListConnection exists for this control, this method returns <c>NULL</c> .</returns>
      <param name="uiObj">[In] Specifies the connected user interface object.</param>
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.SequenceListConnections.Remove(System.Object)">
      <summary>Removes the specified item from this collection, if it exists.</summary>
      <returns>Returns <c>True</c> when the SequenceListConnection is removed. Returns <c>False</c> when the SequenceListConnection is not found.</returns>
      <param name="uiObj">[In] Specifies the user interface object to disconnect.</param>
      <seealso cref="SequenceListConnections.Add" />
    </member>
    <member name="T:NationalInstruments.TestStand.Interop.UI.Support.SequenceViewConnection">
      <summary>Represents a connection from a SequenceFileView Manager control to a SequenceView control. The SequenceView control shows the contents of the current sequence in the SequenceFileView Manager control. Use the SequenceFileViewMgr.Connections property to obtain a collection of SequenceViewConnection objects.</summary>
      <seealso cref="SequenceFileViewMgr.Connections" />
      <seealso cref="SequenceView" />
      <seealso cref="SequenceViewConnections" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.SequenceViewConnection.DoubleClickEditsStepProperties">
      <summary>Specifies whether the connected SequenceView control displays the Step Properties dialog box when editing is enabled and the user double-clicks a step. This property defaults to <c>True</c> . Set the property to <c>False</c> if you implement an alternate behavior for double-clicking a step in a sequence file.</summary>
      <seealso cref="SequenceView" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.SequenceViewConnection.UIControl">
      <summary>Returns the user interface control the connection connects to a SequenceFileView Manager control.</summary>
    </member>
    <member name="T:NationalInstruments.TestStand.Interop.UI.Support.SequenceViewConnections">
      <summary>A collection of SequenceViewConnection objects you obtain by calling the SequenceFileViewMgr.Connections property.</summary>
      <seealso cref="SequenceFileViewMgr.ConnectSequenceView" />
      <seealso cref="SequenceFileViewMgr.Connections" />
      <seealso cref="SequenceViewConnection" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.SequenceViewConnections.Count">
      <summary>Returns the number of items in the collection.</summary>
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.SequenceViewConnections.Item(System.Int32)">
      <summary>Returns a reference to an item at the specified index in the collection.</summary>
      <returns>Item located at the specified index.</returns>
      <param name="itemIndex">[In] Specifies the index of the item to retrieve.</param>
      <seealso cref="SequenceViewConnection" />
      <seealso cref="SequenceViewConnections.Count" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.SequenceViewConnections.Add(System.Object)">
      <summary>Creates and adds a new SequenceViewConnection to the collection.</summary>
      <returns>New SequenceViewConnection.</returns>
      <param name="uiObj">[In] Specifies the user interface object to connect.</param>
      <seealso cref="SequenceFileViewMgr.ConnectSequenceView" />
      <seealso cref="SequenceViewConnections.Remove" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.SequenceViewConnections.Clear">
      <summary>Removes all items from the collection.</summary>
      <seealso cref="SequenceViewConnections.Remove" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.SequenceViewConnections.FromControl(System.Object)">
      <summary>Returns the SequenceViewConnection connected to the uiObj parameter.</summary>
      <returns>SequenceViewConnection connected to the uiObj parameter. When no SequenceViewConnection exists for this control, this method returns <c>NULL</c> .</returns>
      <param name="uiObj">[In] Specifies the connected user interface object.</param>
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.SequenceViewConnections.Remove(System.Object)">
      <summary>Removes the specified item from this collection, if it exists.</summary>
      <returns>Returns <c>True</c> when the SequenceViewConnection is removed. Returns <c>False</c> when the SequenceViewConnection is not found.</returns>
      <param name="uiObj">[In] Specifies the user interface object to disconnect.</param>
      <seealso cref="SequenceViewConnections.Add" />
    </member>
    <member name="T:NationalInstruments.TestStand.Interop.UI.Support.StepGroupListConnection">
      <summary>Represents a connection from a SequenceFileView Manager control to a control that displays the list of step groups. Use the connected control to select the step group for the current sequence.&#13; <para>Note:  This class currently contains no properties or methods. Properties or methods might be added to this class in future versions of TestStand.&#13; </para></summary>
      <seealso cref="StepGroupListConnections" />
    </member>
    <member name="T:NationalInstruments.TestStand.Interop.UI.Support.StepGroupListConnections">
      <summary>A collection of StepGroupListConnection objects.</summary>
      <seealso cref="SequenceFileViewMgr.ConnectStepGroupList" />
      <seealso cref="StepGroupListConnection" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.StepGroupListConnections.Count">
      <summary>Returns the number of items in the collection.</summary>
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.StepGroupListConnections.Item(System.Int32)">
      <summary>Returns a reference to an item at the specified index in the collection.</summary>
      <returns>Item located at the specified index.</returns>
      <param name="itemIndex">[In] Specifies the index of the item to retrieve.</param>
      <seealso cref="StepGroupListConnection" />
      <seealso cref="StepGroupListConnections.Count" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.StepGroupListConnections.Add(System.Object)">
      <summary>Creates and adds a new StepGroupListConnection to the collection.</summary>
      <returns>New StepGroupListConnection.</returns>
      <param name="uiObj">[In] Specifies the user interface object to connect.</param>
      <seealso cref="SequenceFileViewMgr.ConnectStepGroupList" />
      <seealso cref="StepGroupListConnections.Remove" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.StepGroupListConnections.Clear">
      <summary>Removes all items from the collection.</summary>
      <seealso cref="StepGroupListConnections.Remove" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.StepGroupListConnections.FromControl(System.Object)">
      <summary>Returns the StepGroupListConnection connected to the uiObj parameter.</summary>
      <returns>StepGroupListConnection connected to the uiObj parameter. When no StepGroupListConnection exists for this control, this method returns <c>NULL</c> .</returns>
      <param name="uiObj">[In] Specifies the connected user interface object.</param>
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.StepGroupListConnections.Remove(System.Object)">
      <summary>Removes the specified item from this collection, if it exists.</summary>
      <returns>Returns <c>True</c> when the StepGroupListConnection is removed. Returns <c>False</c> when the StepGroupListConnection is not found.</returns>
      <param name="uiObj">[In] Specifies the user interface object to disconnect.</param>
      <seealso cref="StepGroupListConnections.Add" />
    </member>
    <member name="T:NationalInstruments.TestStand.Interop.UI.Support.Strings">
      <summary>A collection of strings. You can obtain a reference to the collection from the ApplicationMgr.CommandLineArguments property, the ExpressionEdit.GetValidEvaluationTypes , and ExpressionEdit.SetValidEvaluationTypes methods, and the ApplicationMgr.ProcessUserCommandLineArguments event.</summary>
      <seealso cref="ApplicationMgr.CommandLineArguments" />
      <seealso cref="ApplicationMgr.ProcessUserCommandLineArguments" />
      <seealso cref="ExpressionEdit.GetValidEvaluationTypes" />
      <seealso cref="ExpressionEdit.SetValidEvaluationTypes" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.Strings.Count">
      <summary>Returns the number of items in the collection.</summary>
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.Strings.Item(System.Int32)">
      <summary>Returns a reference to an item at the specified index in the collection.</summary>
      <returns>The item at the specified index.</returns>
      <param name="itemIndex">[In] Specifies the index of the item to retrieve.</param>
      <seealso cref="Strings.Count" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.Strings.Add(System.String)">
      <summary>Adds a string to the end of the collection.</summary>
      <param name="val">[In] Specifies the string to be added.</param>
      <seealso cref="Strings.Insert" />
      <seealso cref="Strings.Remove" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.Strings.Clear">
      <summary>Removes all items from the collection.</summary>
      <seealso cref="Strings.Remove" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.Strings.Insert(System.Int32,System.String)">
      <summary>Adds a new item to the collection at the specified index.</summary>
      <param name="itemIndex">[In] Specifies the index of the item to insert.</param>
      <param name="val">[In] Specifies the string to be added.</param>
      <seealso cref="Strings.Add" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.Strings.Remove(System.Int32)">
      <summary>Removes the specified item from this collection, if it exists.</summary>
      <param name="itemIndex">[In] Specifies the index of the item to remove.</param>
      <seealso cref="Strings.Add" />
    </member>
    <member name="T:NationalInstruments.TestStand.Interop.UI.Support.ThreadListConnection">
      <summary>Represents a connection from the ExecutionView Manager control to a control that displays the list of threads in the execution. You can use the connected control to display the foreground thread and to change the foreground thread when the execution is paused.&#13; <para>Note:  This class currently contains no properties or methods. Properties or methods might be added to this class in future versions of TestStand.&#13; </para></summary>
      <seealso cref="ThreadListConnections" />
    </member>
    <member name="T:NationalInstruments.TestStand.Interop.UI.Support.ThreadListConnections">
      <summary>A collection of ThreadListConnection objects.</summary>
      <seealso cref="ExecutionViewMgr.ConnectThreadList" />
      <seealso cref="ThreadListConnection" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.ThreadListConnections.Count">
      <summary>Returns the number of items in the collection.</summary>
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.ThreadListConnections.Item(System.Int32)">
      <summary>Returns a reference to an item at the specified index in the collection.</summary>
      <returns>Item located at the specified index.</returns>
      <param name="itemIndex">[In] Specifies the index of the item to retrieve.</param>
      <seealso cref="ThreadListConnection" />
      <seealso cref="ThreadListConnections.Count" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.ThreadListConnections.Add(System.Object)">
      <summary>Creates and adds a new ThreadListConnection to the collection.</summary>
      <returns>New ThreadListConnection.</returns>
      <param name="uiObj">[In] Specifies the user interface object to connect.</param>
      <seealso cref="ExecutionViewMgr.ConnectThreadList" />
      <seealso cref="ThreadListConnections.Remove" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.ThreadListConnections.Clear">
      <summary>Removes all items from the collection.</summary>
      <seealso cref="ThreadListConnections.Remove" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.ThreadListConnections.FromControl(System.Object)">
      <summary>Returns the ThreadListConnection connected to the uiObj parameter.</summary>
      <returns>ThreadListConnection connected to the uiObj parameter. When no ThreadListConnection exists for this control, this method returns <c>NULL</c> .</returns>
      <param name="uiObj">[In] Specifies the connected user interface object.</param>
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.ThreadListConnections.Remove(System.Object)">
      <summary>Removes the specified item from this collection, if it exists.</summary>
      <returns>Returns <c>True</c> when the ThreadListConnection is removed. Returns <c>False</c> when the ThreadListConnection is not found.</returns>
      <param name="uiObj">[In] Specifies the user interface object to disconnect.</param>
      <seealso cref="ThreadListConnections.Add" />
    </member>
    <member name="T:NationalInstruments.TestStand.Interop.UI.Support.VariablesConnection">
      <summary>Represents a connection from a SequenceFileView Manager or ExecutionView Manager control to a VariablesView control.</summary>
      <seealso cref="VariablesView" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.VariablesConnection.UIControl">
      <summary>Returns the user interface control that the connection connects to a SequenceFileView Manager or ExecutionView Manager control.</summary>
      <seealso cref="ExecutionViewMgr" />
      <seealso cref="SequenceFileViewMgr" />
    </member>
    <member name="T:NationalInstruments.TestStand.Interop.UI.Support.VariablesConnections">
      <summary>A collection of VariablesConnection objects.</summary>
      <seealso cref="ExecutionViewMgr.ConnectVariables" />
      <seealso cref="SequenceFileViewMgr.ConnectVariables" />
      <seealso cref="VariablesConnection" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.VariablesConnections.Count">
      <summary>Returns the number of items in the collection.</summary>
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.VariablesConnections.Item(System.Int32)">
      <summary>Returns a reference to an item at the specified index in the collection.</summary>
      <returns>Item located at the specified index.</returns>
      <param name="itemIndex">[In] Specifies a zero-based index of the item to retrieve.</param>
      <seealso cref="VariablesConnection" />
      <seealso cref="VariablesConnections.Count" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.VariablesConnections.Add(System.Object)">
      <summary>Creates and adds a new VariablesConnection to the collection.</summary>
      <returns>New VariablesConnection object.</returns>
      <param name="uiObj">[In] Specifies the user interface object to connect.</param>
      <seealso cref="ExecutionViewMgr.ConnectVariables" />
      <seealso cref="SequenceFileViewMgr.ConnectVariables" />
      <seealso cref="VariablesConnections.Remove" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.VariablesConnections.Clear">
      <summary>Removes all items from the collection.</summary>
      <seealso cref="VariablesConnections.Remove" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.VariablesConnections.FromControl(System.Object)">
      <summary>Returns the VariablesConnection connected to the uiObj parameter.</summary>
      <returns>VariablesConnection connected to the uiObj parameter. When no VariablesConnection exists for this control, this method returns <c>NULL</c> .</returns>
      <param name="uiObj">[In] Specifies the connected user interface object.</param>
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.VariablesConnections.Remove(System.Object)">
      <summary>Removes the specified item from this collection, if it exists.</summary>
      <returns>Returns <c>True</c> when the VariablesConnection is removed. Returns <c>False</c> when the VariablesConnection is not found.</returns>
      <param name="uiObj">[In] Specifies the user interface object to disconnect.</param>
      <seealso cref="VariablesConnection" />
      <seealso cref="VariablesConnections.Add" />
    </member>
    <member name="T:NationalInstruments.TestStand.Interop.UI.Support.SelectionFlags">
      <summary>Use these constants to select step group start or end markers and to expand or collapse step groups. These constants apply only when the application displays more than one step group at a time.&#13; You cannot select step group start and end markers when steps are selected. You cannot select steps and step group end markers in collapsed step groups.</summary>
      <seealso cref="ExecutionViewMgr.SelectedSteps" />
      <seealso cref="ExecutionViewMgr.StepGroupMode" />
      <seealso cref="SelectedSteps.SelectionFlags" />
      <seealso cref="SequenceFileViewMgr.SelectedSteps" />
      <seealso cref="SequenceFileViewMgr.StepGroupMode" />
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.SelectionFlags.SelectionFlag_CleanupCollapsed">
      <summary>&#8211;(Value: 256) Collapses the Cleanup step group.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.SelectionFlags.SelectionFlag_CleanupEndSelected">
      <summary>&#8211;(Value: 32) Selects the end marker for the Cleanup step group.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.SelectionFlags.SelectionFlag_CleanupStartSelected">
      <summary>&#8211;(Value: 4) Selects the start marker for the Cleanup step group.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.SelectionFlags.SelectionFlag_MainCollapsed">
      <summary>&#8211;(Value: 128) Collapses the Main step group.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.SelectionFlags.SelectionFlag_MainEndSelected">
      <summary>&#8211;(Value: 16) Selects the end marker for the Main step group.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.SelectionFlags.SelectionFlag_MainStartSelected">
      <summary>&#8211;(Value: 2) Selects the start marker for the Main step group.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.SelectionFlags.SelectionFlag_NoFlags">
      <summary>&#8211;(Value: 0) No collapsed step group and no selected step group markers.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.SelectionFlags.SelectionFlag_SetupCollapsed">
      <summary>&#8211;(Value: 64) Collapses the Setup step group.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.SelectionFlags.SelectionFlag_SetupEndSelected">
      <summary>&#8211;(Value: 8) Selects the end marker for the Setup step group.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.SelectionFlags.SelectionFlag_SetupStartSelected">
      <summary>&#8211;(Value: 1) Selects the start marker for the Setup step group.</summary>
    </member>
    <member name="T:NationalInstruments.TestStand.Interop.UI.Support.CaptionSources">
      <summary>These constants specify types of caption sources. Each caption source provides text that describes an aspect of the current application state. You can use these constants to connect a caption to a Label or StatusBarPane using the ApplicationMgr.ConnectCaption , ExecutionViewMgr.ConnectCaption , or SequenceFileViewMgr.ConnectCaption method.&#13; To obtain the text of a caption without connecting it to a control, call the ApplicationMgr.GetCaptionText , ExecutionViewMgr.GetCaptionText , or SequenceFileViewMgr.GetCaptionText method.&#13; A caption source applies to all manager controls unless the help for the enumeration element specifies the particular manager control or controls with which it applies.</summary>
      <seealso cref="ApplicationMgr.ConnectCaption" />
      <seealso cref="ApplicationMgr.GetCaptionText" />
      <seealso cref="ExecutionViewMgr.ConnectCaption" />
      <seealso cref="ExecutionViewMgr.GetCaptionText" />
      <seealso cref="Label" />
      <seealso cref="SequenceFileViewMgr.ConnectCaption" />
      <seealso cref="SequenceFileViewMgr.GetCaptionText" />
      <seealso cref="StatusBarPane" />
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CaptionSources.CaptionSource_BatchSerialNumber">
      <summary>&#8211;(Value: 4) Displays the batch serial number for the batch that contains the current execution. A process model sends the batch serial number through the <c>UIMsg_ModelState_Identified</c> UIMessageCode. This caption source applies only to the ExecutionView Manager control.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CaptionSources.CaptionSource_BatchState">
      <summary>&#8211;(Value: 6) Displays a description of the execution state of the batch that contains the current execution. For example, this caption might display <c>Initializing</c> , <c>Testing</c> , <c>Waiting</c> , or <c>Completed [Passed]</c> . This caption source applies only to the ExecutionView Manager control.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CaptionSources.CaptionSource_BatchStatus">
      <summary>&#8211;(Value: 5) Displays the batch result status for the batch that contains the current execution. A process model sends the batch status through the <c>UIMsg_ModelState_TestingComplete</c> UIMessageCode. This caption source applies only to the ExecutionView Manager control.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CaptionSources.CaptionSource_CurrentCallStackEntry">
      <summary>&#8211;(Value: 26) Displays a name that identifies the current call stack item in the foreground thread in the current execution. This caption source applies only to the ExecutionView Manager control.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CaptionSources.CaptionSource_CurrentExecution">
      <summary>&#8211;(Value: 24) Displays a name that identifies the current execution. This caption source applies only to the ExecutionView Manager control.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CaptionSources.CaptionSource_CurrentProcessModelFile">
      <summary>&#8211;(Value: 27) Displays the path name of the process model file for the currently executing or currently selected sequence file. When you pass <c>True</c> to the long name option for the caption, the caption displays the full path name. Otherwise, the caption displays the base filename.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CaptionSources.CaptionSource_CurrentSequence">
      <summary>&#8211;(Value: 13) Displays the name of the currently executing or currently selected sequence. This caption source applies to the ExecutionView Manager and SequenceFileView Manager controls.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CaptionSources.CaptionSource_CurrentSequenceComment">
      <summary>&#8211;(Value: 14) Displays the comment for the currently executing or currently selected sequence. This caption source applies to the ExecutionView Manager and SequenceFileView Manager controls.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CaptionSources.CaptionSource_CurrentSequenceFile">
      <summary>&#8211;(Value: 11) Displays the path name of the currently executing or currently selected sequence file with a read-only, locked, executing, or modified file state suffix. When you pass <c>True</c> to the long name option for the caption, the caption displays the full path name. Otherwise, the caption displays the base filename. This caption source applies to the ExecutionView Manager and SequenceFileView Manager controls.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CaptionSources.CaptionSource_CurrentSequenceFile_FileStateOnly">
      <summary>&#8211;(Value: 33) Displays only the read-only, locked, executing, or modified file state of the currently executing or currently selected sequence file. This caption source applies to the ExecutionView Manager and SequenceFileView Manager controls.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CaptionSources.CaptionSource_CurrentSequenceFile_WithoutFileState">
      <summary>&#8211;(Value: 32) Displays the path name of the currently executing or currently selected sequence file without a file state suffix. When you pass <c>True</c> to the long name option for the caption, the caption displays the full path name. Otherwise, the caption displays the base filename. This caption source applies to the ExecutionView Manager and SequenceFileView Manager controls.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CaptionSources.CaptionSource_CurrentSequenceFileComment">
      <summary>&#8211;(Value: 12) Displays the comment for the currently executing or currently selected sequence file. This caption source applies to the ExecutionView Manager and SequenceFileView Manager controls.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CaptionSources.CaptionSource_CurrentStep">
      <summary>&#8211;(Value: 16) Displays the name of the current step in the current execution. This caption source applies only to the ExecutionView Manager control.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CaptionSources.CaptionSource_CurrentStepComment">
      <summary>&#8211;(Value: 17) Displays the comment for the current step in the current execution. This caption source applies only to the ExecutionView Manager control.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CaptionSources.CaptionSource_CurrentStepGroup">
      <summary>&#8211;(Value: 15) Displays the name of the currently executing or currently selected step group. This caption source applies to the ExecutionView Manager and SequenceFileView Manager controls.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CaptionSources.CaptionSource_CurrentStepIndex_ZeroBased">
      <summary>&#8211;(Value: 18) Displays the zero-based index of the current step in the current execution. This caption source applies only to the ExecutionView Manager control.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CaptionSources.CaptionSource_CurrentTestIndex_OneBased">
      <summary>&#8211;(Value: 19) Displays the one-based index of the current step in the current execution. This caption source applies only to the ExecutionView Manager control.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CaptionSources.CaptionSource_CurrentThread">
      <summary>&#8211;(Value: 25) Displays a name that identifies the foreground thread in the current execution. This caption source applies only to the ExecutionView Manager control.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CaptionSources.CaptionSource_Date">
      <summary>&#8211;(Value: 31) Displays the current date. When you pass <c>True</c> to the long name option for the caption, the caption displays the system long date format. Otherwise, the caption displays the system short date format.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CaptionSources.CaptionSource_EngineEnvironment">
      <summary>&#8211;(Value: 34) Displays the path name of the current TestStand environment. When you pass <c>True</c> to the long name option for the caption, the caption displays the full path name. Otherwise, the caption displays the base filename.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CaptionSources.CaptionSource_MacroExpression">
      <summary>&#8211;(Value: 1) Displays the evaluated result of a format expression that can contain macros that specify text from other caption sources. You can use this caption source to combine text from multiple caption sources. Place the macros that specify other caption sources within string constants in the format expression for the caption text or caption connection you create with this caption source. The following are the available macros: Macro, Caption Source, Specifies caption source long name <para><code>&#37;UUTSerialNumber&#37;, CaptionSource_UUTSerialNumber, no</code></para><para><code>&#37;UUTStatus&#37;, CaptionSource_UUTStatus, no</code></para><para><code>&#37;BatchSerialNumber&#37;, CaptionSource_BatchSerialNumber, no</code></para><para><code>&#37;BatchStatus&#37;, CaptionSource_BatchStatus, no</code></para><para><code>&#37;BatchState&#37;, CaptionSource_BatchState, no</code></para><para><code>&#37;ModelState&#37;, CaptionSource_ModelState, no</code></para><para><code>&#37;UserName&#37;, CaptionSource_UserName, no</code></para><para><code>&#37;ProgressText&#37;, CaptionSource_ProgressText, no</code></para><para><code>&#37;ProgressPercent&#37;, CaptionSource_ProgressPercent, no</code></para><para><code>&#37;CurrentSequenceFile&#37;, CaptionSource_CurrentSequenceFile, no</code></para><para><code>&#37;CurrentSequence&#37;, CaptionSource_CurrentSequence, no</code></para><para><code>&#37;CurrentStepGroup&#37;, CaptionSource_CurrentStepGroup, no</code></para><para><code>&#37;CurrentStep&#37;, CaptionSource_CurrentStep, no</code></para><para><code>&#37;CurrentStepIndex_ZeroBased&#37;, CaptionSource_CurrentStepIndex_ZeroBased, no</code></para><para><code>&#37;CurrentTestIndex_OneBased&#37;, CaptionSource_CurrentTestIndex_OneBased, no</code></para><para><code>&#37;NumberOfSteps&#37;, CaptionSource_NumberOfSteps, no</code></para><para><code>&#37;CurrentExecution&#37;, CaptionSource_CurrentExecution, no</code></para><para><code>&#37;CurrentThread&#37;, CaptionSource_CurrentThread, no</code></para><para><code>&#37;CurrentCallStackEntry&#37;, CaptionSource_CurrentCallStackEntry, no</code></para><para><code>&#37;CurrentProcessModelFile&#37;, CaptionSource_CurrentProcessModelFile, no</code></para><para><code>&#37;UUTSerialNumberLongName&#37;, CaptionSource_UUTSerialNumber, yes</code></para><para><code>&#37;UUTStatusLongName&#37;, CaptionSource_UUTStatus, yes</code></para><para><code>&#37;BatchSerialNumberLongName&#37;, CaptionSource_BatchSerialNumber, yes</code></para><para><code>&#37;BatchStatusLongName&#37;, CaptionSource_BatchStatus, yes</code></para><para><code>&#37;BatchStateLongName&#37;, CaptionSource_BatchState, yes</code></para><para><code>&#37;ModelStateLongName&#37;,CaptionSource_ModelState,yes</code></para><para><code>&#37;UserNameLongName&#37;,CaptionSource_UserName,yes</code></para><para><code>&#37;ProgressTextLongName&#37;,CaptionSource_ProgressText,yes</code></para><para><code>&#37;ProgressPercentLongName&#37;,CaptionSource_ProgressPercent,yes</code></para><para><code>&#37;CurrentSequenceFileLongName&#37;,CaptionSource_CurrentSequenceFile,yes</code></para><para><code>&#37;CurrentSequenceLongName&#37;,CaptionSource_CurrentSequence,yes</code></para><para><code>&#37;CurrentStepGroupLongName&#37;,CaptionSource_CurrentStepGroup,yes</code></para><para><code>&#37;CurrentStepLongName&#37;,CaptionSource_CurrentStep,yes</code></para><para><code>&#37;CurrentStepIndex_ZeroBasedLongName&#37;,CaptionSource_CurrentStepIndex_ZeroBased,yes</code></para><para><code>&#37;CurrentTestIndex_OneBasedLongName&#37;, CaptionSource_CurrentTestIndex_OneBased, yes</code></para><para><code>&#37;NumberOfStepsLongName&#37;, CaptionSource_NumberOfSteps, yes</code></para><para><code>&#37;CurrentExecutionLongName&#37;, CaptionSource_CurrentExecution, yes</code></para><para><code>&#37;CurrentThreadLongName&#37;, CaptionSource_CurrentThread, yes</code></para><para><code>&#37;CurrentCallStackEntryLongName&#37;, CaptionSource_CurrentCallStackEntry, yes</code></para><c>&#37;CurrentProcessModelFileLongName&#37;, CaptionSource_CurrentProcessModelFile, yes</c></summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CaptionSources.CaptionSource_ModelState">
      <summary>&#8211;(Value: 7) Displays a description of the execution state of the current execution. For example, this caption might display <c>Initializing</c> , <c>Testing</c> , <c>Waiting</c> , or <c>Completed [Passed]</c> . This caption source applies only to the ExecutionView Manager control.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CaptionSources.CaptionSource_NotASource">
      <summary>&#8211;(Value: 0) Guaranteed to never be a valid caption source specifier.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CaptionSources.CaptionSource_NumberOfSteps">
      <summary>&#8211;(Value: 22) Displays the number of steps in the currently executing or currently selected step group. This caption source applies to the ExecutionView Manager and SequenceFileView Manager controls.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CaptionSources.CaptionSource_NumberOfTests">
      <summary>&#8211;(Value: 23) Displays the number of steps in the currently executing or currently selected step group. The description uses the word test in place of the word step . This caption source applies to the ExecutionView Manager and SequenceFileView Manager controls.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CaptionSources.CaptionSource_ProgressPercent">
      <summary>&#8211;(Value: 10) Displays the progress percentage information for the current execution. This caption indicates the progress of operations for which the execution chooses to report the amount of progress. The caption does not necessarily reflect the progress of the execution as a whole. A process model sends the progress percent through the <c>UIMsg_ProgressPercent</c> UIMessageCode. This caption source applies only to the ExecutionView Manager control.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CaptionSources.CaptionSource_ProgressText">
      <summary>&#8211;(Value: 9) Displays the progress message for the current execution. A process model sends the progress text through the <c>UIMsg_ProgressText</c> UIMessageCode. This caption source applies only to the ExecutionView Manager control.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CaptionSources.CaptionSource_ReportLocation">
      <summary>&#8211;(Value: 28) Displays the location of the report for the current execution. The Report.Location property specifies the display value for a report. This caption source applies only to the ExecutionView Manager control.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CaptionSources.CaptionSource_SelectedSteps_ZeroBased">
      <summary>&#8211;(Value: 20) Displays a description of which steps are selected. The description uses zero-based indexes. This caption source applies to the ExecutionView Manager and SequenceFileView Manager controls.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CaptionSources.CaptionSource_SelectedTests_OneBased">
      <summary>&#8211;(Value: 21) Displays a description of which steps are selected. The description uses one-based indexes and the word test in place of the word step . This caption source applies to the ExecutionView Manager and SequenceFileView Manager controls.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CaptionSources.CaptionSource_TestSocketIndex">
      <summary>&#8211;(Value: 29) Displays the zero-based index of the test socket for the current execution. Displays nothing when the execution is not participating in a multi-socket test process. A process model sends the text socket index through the <c>UIMsg_ModelState_BeginTesting</c> and <c>UIMsg_ModelState_Waiting</c> UIMessageCodes. This caption source applies only to the ExecutionView Manager control.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CaptionSources.CaptionSource_Time">
      <summary>&#8211;(Value: 30) Displays the current time using the system time format.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CaptionSources.CaptionSource_UserName">
      <summary>&#8211;(Value: 8) Displays the name of the current user. When you pass <c>True</c> to the long name option for the caption, the caption displays the full user name. Otherwise, the caption displays the user login name.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CaptionSources.CaptionSource_UUTSerialNumber">
      <summary>&#8211;(Value: 2) Displays the serial number of the UUT for the current execution. A process model sends the UUT serial number through the <c>UIMsg_ModelState_Identified</c> UIMessageCode. This caption source applies only to the ExecutionView Manager control.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CaptionSources.CaptionSource_UUTStatus">
      <summary>&#8211;(Value: 3) Displays the result status of the UUT for the current execution. A process model sends the UUT status through the <c>UIMsg_ModelState_TestingComplete</c> UIMessageCode. This caption source applies only to the ExecutionView Manager control.</summary>
    </member>
    <member name="T:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds">
      <summary>These constants specify types of standard commands. CommandKinds values specify a single command or a set of commands that can contain several commands or no commands, depending on the state of the application.&#13; You can pass these constants to the ApplicationMgr.ConnectCommand , SequenceFileViewMgr.ConnectCommand , and ExecutionViewMgr.ConnectCommand methods to connect commands to buttons or checkboxes. You can also connect commands to menu items .&#13; <para>Note:  If you connect a command that applies to the control that has the input focus, such as <c>CommandKind_Edit_Cut</c> and <c>CommandKind_Edit_EditCode</c> , to a button control, the command does not function after the first time the user clicks the button because the button acquires the input focus. To avoid this issue, you must ensure the button does not acquire the input focus when clicked. For a TestStand Button, you can achieve this by setting the Button.Style property to <c>ButtonStyle_ToolBar</c> .&#13; </para> You can pass these constants to the Commands.InsertKind method to directly create command objects.&#13; Most commands, such as <c>OpenSequenceFile</c> , <c>Login</c> , and <c>Restart</c> , behave the same as the corresponding menu items in the TestStand Sequence Editor with regard to the action they take and the circumstances under which they are enabled. Refer to the NI TestStand Environment Reference Help for the corresponding sequence editor menu item for more information about how the item behaves.&#13; TestStand assigns default images to some commands, which TestStand displays when you connect the command to a Button control and you enable images for the control.</summary>
      <seealso cref="ApplicationMgr" />
      <seealso cref="ApplicationMgr.ConnectCommand" />
      <seealso cref="ApplicationMgr.PostCommandExecute" />
      <seealso cref="ApplicationMgr.PreCommandExecute" />
      <seealso cref="ApplicationMgr.UndoStack" />
      <seealso cref="Button" />
      <seealso cref="Command" />
      <seealso cref="Command.Enabled" />
      <seealso cref="Command.UserData" />
      <seealso cref="Command.UserObject" />
      <seealso cref="Command.Visible" />
      <seealso cref="Commands.InsertKind" />
      <seealso cref="Commands" />
      <seealso cref="ExecutionViewMgr" />
      <seealso cref="ExecutionViewMgr.ConnectCommand" />
      <seealso cref="ListBox" />
      <seealso cref="SequenceFileViewMgr" />
      <seealso cref="SequenceFileViewMgr.ConnectCommand" />
      <seealso cref="SequenceView" />
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_Abort">
      <summary>&#8211;(Value: 75) Aborts the current execution. The execution does not run the Cleanup steps. This command applies to the ExecutionView Manager control only.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_AbortAll">
      <summary>&#8211;(Value: 78) Aborts all executions. This command applies only to the Application Manager control.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_Break">
      <summary>&#8211;(Value: 71) Suspends the selected execution. This command applies only to the ExecutionView Manager control. This command has a default image.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_BreakAll">
      <summary>&#8211;(Value: 76) Suspends all executions. This command applies only to the Application Manager control. This command has a default image.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_BreakOnFirstStep">
      <summary>&#8211;(Value: 50) Toggles whether executions suspend at the first step.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_BreakOnSequenceFailure">
      <summary>&#8211;(Value: 52) Toggles whether executions suspend when a sequence fails.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_BreakOnStepFailure">
      <summary>&#8211;(Value: 51) Toggles whether executions suspend when a step fails.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_BreakpointSubmenu">
      <summary>&#8211;(Value: 85) Contains the <c>CommandKind_ToggleBreakpoint</c> and <c>CommandKind_DisplayBreakpointSettings</c> subsidiary commands. When you insert this command into a menu, each subsidiary command appears as a submenu item. This command applies to the ExecutionView Manager and SequenceFileView Manager controls.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_BreakResume">
      <summary>&#8211;(Value: 72) Suspends the selected execution if it is executing. Resumes the selected execution if it is suspended. This command applies only to the ExecutionView Manager control.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_Close">
      <summary>&#8211;(Value: 21) Closes the currently selected sequence file or execution. This command applies to the ExecutionView Manager and SequenceFileView Manager controls.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_CloseAll">
      <summary>&#8211;(Value: 22) Closes all executions and sequence files. This command applies only to the Application Manager control.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_CloseCompletedExecutions">
      <summary>&#8211;(Value: 23) Closes all completed executions. This command applies only to the Application Manager control.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_ConfigurationEntryPointDefaultMenuInsertionMarker">
      <summary>&#8211;(Value: 113) Specifies a set of commands that contains a <c>CommandKind_RunEntryPoint</c> command for each Configuration entry point with a menu hint that does not select a menu other than the current menu. Because most entry points do not have menu hints, this constant typically specifies all Configuration entry points.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_ConfigurationEntryPointInsertionMarker">
      <summary>&#8211;(Value: 112) Specifies a set of commands that contains a <c>CommandKind_RunEntryPoint</c> command for each Configuration entry point with a menu hint that selects the current menu.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_ConfigurationEntryPoints_Set">
      <summary>&#8211;(Value: 145) Specifies a set of commands that contains a <c>CommandKind_RunEntryPoint</c> command for each Configuration entry point. When you specify commands to create menu items, use the <c>CommandKind_ConfigurationEntryPointInsertionMarker</c> and <c>CommandKind_ConfigurationEntryPointDefaultInsertionMarker</c> constants to honor menu hints entry points can specify.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_ConfigureAdapters">
      <summary>&#8211;(Value: 90) Launches the Adapter Configuration dialog box.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_ConfigureEngineEnvironment">
      <summary>&#8211;(Value: 94) Launches the Configure Environment dialog box.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_ConfigureExternalViewers">
      <summary>&#8211;(Value: 93) Launches the Configure External Viewers dialog box.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_ConfigureSearchDirectories">
      <summary>&#8211;(Value: 92) Launches the Edit Search Directories dialog box.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_ConfigureSequenceViews">
      <summary>&#8211;(Value: 149) Launches the Edit Step List Configurations dialog box. This command applies to the ExecutionView Manager and SequenceFileView Manager controls.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_ConfigureStationOptions">
      <summary>&#8211;(Value: 91) Launches the Station Options dialog box.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_Container">
      <summary>&#8211;(Value: 1) Contains only subsidiary commands.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_Custom">
      <summary>&#8211;(Value: 3) Represents an action you define. You must set Command properties, such as the Command.Enabled and Command.Visible properties, to the values you require. Although this command does not perform an action when it executes, an application can perform an action when it receives the ApplicationMgr.PreCommandExecute or ApplicationMgr.PostCommandExecute event for the command. You can attach data you define to the command using the Command.UserObject and Command.UserData properties so the data is available to the application in the handlers for <c>PreCommandExecute</c> and <c>PostCommandExecute</c> events.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_CustomizeTools">
      <summary>&#8211;(Value: 101) Launches the Customize Tools Menu dialog box.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_DefaultConfigureMenu_Set">
      <summary>&#8211;(Value: 124) Specifies a set of commands that correspond to the typical items in the Configure menu of a TestStand application. Although the specific commands this constant represents might vary according to the version of TestStand, the following is a representative set of commands: <para><code>CommandKind_ConfigureStationOptions</code></para><para><code>CommandKind_ConfigureSearchDirectories</code></para><para><code>CommandKind_ConfigureExternalViewers</code></para><para><code>CommandKind_ConfigureAdapters</code></para><para><code>CommandKind_Separator</code></para><para><code>CommandKind_ExecutionEntryPointInsertionMarker</code></para><c>CommandKind_ConfigurationEntryPointDefaultMenuInsertionMarker</c></summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_DefaultDebugMenu_Set">
      <summary>&#8211;(Value: 123) Specifies a set of commands that correspond to the typical items in the Debug menu of a TestStand application. Although the specific commands this constant represents might vary according to the version of TestStand, the following is a representative set of commands: <para><code>CommandKind_ExecutionEntryPointInsertionMarker</code></para><para><code>CommandKind_ConfigurationEntryPointInsertionMarker</code></para><para><code>CommandKind_Separator</code></para><para><code>CommandKind_ToggleBreakpoint</code></para><para><code>CommandKind_SetRunModeSubmenu</code></para><para><code>CommandKind_Separator</code></para><para><code>CommandKind_Resume</code></para><para><code>CommandKind_StepInto</code></para><para><code>CommandKind_StepOver</code></para><para><code>CommandKind_StepOut</code></para><para><code>CommandKind_SetNextStep</code></para><para><code>CommandKind_Separator</code></para><para><code>CommandKind_Break</code></para><para><code>CommandKind_Terminate</code></para><para><code>CommandKind_Abort</code></para><para><code>CommandKind_Separator</code></para><para><code>CommandKind_BreakAll</code></para><para><code>CommandKind_TerminateAll</code></para><para><code>CommandKind_AbortAll</code></para><para><code>CommandKind_ResumeAll</code></para><para><code>CommandKind_Separator</code></para><c>CommandKind_DisplayBreakAndWatchPoints</c></summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_DefaultEditMenu_Set">
      <summary>&#8211;(Value: 128) Specifies a set of commands that correspond to the typical items in the Edit menu of a TestStand application. Although the specific commands this constant represents might vary according to the version of TestStand, the following is a representative set of commands: <para><code>CommandKind_Edit_Undo*</code></para><para><code>CommandKind_Edit_Redo*</code></para><para><code>CommandKind_Separator*</code></para><para><code>CommandKind_Edit_Cut*</code></para><para><code>CommandKind_Edit_Copy</code></para><para><code>CommandKind_Edit_Paste*</code></para><para><code>CommandKind_Edit_Delete*</code></para><para><code>CommandKind_Edit_Rename*</code></para><para><code>CommandKind_Separator</code></para><para><code>CommandKind_SelectAll</code></para><para><code>CommandKind_Separator*</code></para><para><code>CommandKind_Edit_EditSteps_Set*</code></para><para><code>CommandKind_Edit_SpecifyModule*</code></para><para><code>CommandKind_Edit_EditCode*</code></para><para><code>CommandKind_Edit_Preconditions*</code></para><para><code>CommandKind_Separator*</code></para><para><code>CommandKind_Edit_SequenceFileCallbacks*</code></para><para><code>CommandKind_Separator*</code></para><para><code>CommandKind_Edit_StepProperties*</code></para><para><code>CommandKind_Edit_SequenceProperties*</code></para><c>CommandKind_Edit_SequenceFileProperties*</c> * The command is present only when editing is enabled.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_DefaultExecuteMenu_Set">
      <summary>&#8211;(Value: 121) Specifies a set of commands that correspond to the typical menu items in the Execute menu of a TestStand application. Although the specific commands this constant represents might vary according to the version of TestStand, the following is a representative set of commands: <para><code>CommandKind_Restart</code></para><para><code>CommandKind_Separator</code></para><para><code>CommandKind_ExecutionEntryPointDefaultMenuInsertionMarker</code></para><para><code>CommandKind_ConfigurationEntryPointDefaultMenuInsertionMarker</code></para><para><code>CommandKind_Separator</code></para><para><code>CommandKind_RunCurrentSequence</code></para><para><code>CommandKind_Separator</code></para><para><code>CommandKind_RunSelectedSteps</code></para><para><code>CommandKind_RunSelectedStepsUsingEntryPointSubmenu</code></para><para><code>CommandKind_LoopOnSelectedSteps</code></para><para><code>CommandKind_LoopOnSelectedStepsUsingEntryPointSubmenu</code></para><para><code>CommandKind_Separator</code></para><para><code>CommandKind_BreakOnFirstStep</code></para><para><code>CommandKind_BreakOnStepFailure</code></para><para><code>CommandKind_BreakOnSequenceFailure</code></para><c>CommandKind_TracingEnabled</c> This command applies only to the ExecutionView Manager control.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_DefaultFileMenu_Set">
      <summary>&#8211;(Value: 120) Specifies a set of commands that correspond to the typical items in the File menu of a TestStand application. Although the specific commands this constant represents might vary according to the version of TestStand, the following is a representative set of commands: <para><code>CommandKind_Login</code></para><para><code>CommandKind_Logout</code></para><para><code>CommandKind_Separator</code></para><para><code>CommandKind_Edit_NewSequenceFile*</code></para><para><code>CommandKind_OpenSequenceFiles</code></para><para><code>CommandKind_Close</code></para><para><code>CommandKind_Separator</code></para><para><code>CommandKind_CloseAll</code></para><para><code>CommandKind_CloseCompletedExecutions</code></para><para><code>CommandKind_Separator</code></para><para><code>CommandKind_OpenWorkspaceBrowser</code></para><para><code>CommandKind_Separator</code></para><para><code>CommandKind_Edit_Save*</code></para><para><code>CommandKind_Edit_SaveAs*</code></para><para><code>CommandKind_Edit_SaveAll*</code></para><para><code>CommandKind_Separator*</code></para><para><code>CommandKind_UnloadAllModules</code></para><para><code>CommandKind_LockUnlock</code></para><para><code>CommandKind_Separator</code></para><para><code>CommandKind_ExecutionEntryPointInsertionMarker</code></para><para><code>CommandKind_ConfigurationEntryPointInsertionMarker</code></para><para><code>CommandKind_Separator</code></para><para><code>CommandKind_MRUFiles_Set</code></para><para><code>CommandKind_Separator</code></para><c>CommandKind_Exit</c> * The command is present only when editing is enabled.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_DefaultHelpMenu_Set">
      <summary>&#8211;(Value: 440) Specifies a set of commands that corresponds to the typical items in the Help menu of a TestStand application. Although the specific commands this constant represents might vary according to the version of TestStand, the following is a representative set of commands: <para><code>CommandKind_ShowTestStandHelp</code></para><para><code>CommandKind_ShowGuideToDocumentation</code></para><para><code>CommandKind_ShowHelpTopic</code></para><para><code>CommandKind_Separator</code></para><para><code>CommandKind_ShowTestStandWebResources</code></para><para><code>CommandKind_ShowTestStandDiscussionForum</code></para><para><code>CommandKind_Separator</code></para><para><code>CommandKind_ShowPatents</code></para><para><code>CommandKind_Separator</code></para><para><code>CommandKind_ExecutionEntryPointInsertionMarker</code></para><c>CommandKind_ConfigurationEntryPointInsertionMarker</c></summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_DefaultListBarContextMenu_Set">
      <summary>&#8211;(Value: 127) Specifies a set of commands that corresponds to the typical items in the list bar context menu of a TestStand application. Although the specific commands this constant represents might vary according to the version of TestStand, the following are a representative set of commands: SequenceFileView Manager Control: <para><code>CommandKind_ExecutionEntryPointDefaultMenuInsertionMarker</code></para><para><code>CommandKind_Separator</code></para><para><code>CommandKind_RunCurrentSequence</code></para><para><code>CommandKind_Separator</code></para><para><code>CommandKind_OpenSequenceFile</code></para><c>CommandKind_Close</c> ExecutionView Manager Control: <para><code>CommandKind_Close</code></para><para><code>CommandKind_CloseCompletedExecutions</code></para><para><code>CommandKind_Separator</code></para><para><code>CommandKind_TerminateRestart</code></para><para><code>CommandKind_BreakResume</code></para><para><code>CommandKind_Abort</code></para><para><code>CommandKind_Separator</code></para><para><code>CommandKind_BreakAll</code></para><para><code>CommandKind_TerminateAll</code></para><para><code>CommandKind_AbortAll</code></para><c>CommandKind_ResumeAll</c></summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_DefaultSequenceListContextMenu_Set">
      <summary>&#8211;(Value: 129) Specifies a set of commands that corresponds to the typical items in the sequence list context menu of a TestStand application. This constant applies to the SequenceFileView Manager control. Although the specific commands this constant represents might vary according to the version of TestStand, the following are a representative set of commands: <para><code>CommandKind_Edit_InsertSequence*</code></para><para><code>CommandKind_Separator*</code></para><para><code>CommandKind_Edit_Cut*</code></para><para><code>CommandKind_Edit_Copy*</code></para><para><code>CommandKind_Edit_Paste*</code></para><para><code>CommandKind_Edit_Delete*</code></para><para><code>CommandKind_Edit_Rename*</code></para><para><code>CommandKind_Separator*</code></para><para><code>CommandKind_Edit_SequenceFileCallbacks*</code></para><para><code>CommandKind_Separator*</code></para><c>CommandKind_Edit_SequenceProperties*</c> * The command is present only when editing is enabled.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_DefaultSequenceViewContextMenu_Set">
      <summary>&#8211;(Value: 126) Specifies a set of commands that corresponds to the typical items in the sequence view context menu of a TestStand application. Although the specific commands this constant represents might vary according to the version of TestStand, the following are a representative set of commands: SequenceFileView Manager Control : <para><code>CommandKind_Edit_InsertStepsSubmenu*</code></para><para><code>CommandKind_Edit_EncapsulateSelectedStepsSubmenu*</code></para><para><code>CommandKind_Edit_SelectDefaultAdapters_Set*</code></para><para><code>CommandKind_Separator*</code></para><para><code>CommandKind_Edit_EditSteps_Set*</code></para><para><code>CommandKind_Edit_SpecifyModule*</code></para><para><code>CommandKind_Edit_EditCode*</code></para><para><code>CommandKind_Edit_Preconditions*</code></para><para><code>CommandKind_Separator*</code></para><para><code>CommandKind_BreakpointSubmenu</code></para><para><code>CommandKind_SetRunModeSubmenu</code></para><para><code>CommandKind_Separator</code></para><para><code>CommandKind_Edit_Cut*</code></para><para><code>CommandKind_Edit_Copy*</code></para><para><code>CommandKind_Edit_Paste*</code></para><para><code>CommandKind_Edit_Delete*</code></para><para><code>CommandKind_Edit_Rename*</code></para><para><code>CommandKind_Separator</code></para><para><code>CommandKind_RunSelectedSteps</code></para><para><code>CommandKind_RunSelectedStepsUsingEntryPointsSubmenu</code></para><para><code>CommandKind_LoopOnSelectedSteps</code></para><para><code>CommandKind_LoopOnSelectedStepsUsingEntryPointsSubmenu</code></para><para><code>CommandKind_Separator</code></para><para><code>CommandKind_SequenceViewConfigurationsSubmenu</code></para><para><code>CommandKind_Separator*</code></para><c>CommandKind_Edit_StepProperties*</c> ExecutionView Manager Control : <para><code>CommandKind_BreakpointSubmenu</code></para><para><code>CommandKind_SetRunModeSubmenu</code></para><para><code>CommandKind_Separator</code></para><para><code>CommandKind_RunSelectedSteps</code></para><para><code>CommandKind_LoopOnSelectedSteps</code></para><para><code>CommandKind_Separator</code></para><para><code>CommandKind_SetNextStep</code></para><para><code>CommandKind_Separator*</code></para><c>CommandKind_SequenceViewConfigurationsSubmenu</c> * The command is present only when editing is enabled.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_DefaultToolsMenu_Set">
      <summary>&#8211;(Value: 125) Specifies a set of commands that correspond to the typical items found in the Tools menu of a TestStand application. Although the specific commands this constant represents might vary according to the version of TestStand, the following is a representative set of commands: <para><code>CommandKind_Tools_Set</code></para><para><code>CommandKind_Separator</code></para><para><code>CommandKind_CustomizeTools</code></para><para><code>CommandKind_Separator</code></para><para><code>CommandKind_ExecutionEntryPointInsertionMarker</code></para><c>CommandKind_ConfigurationEntryPointInsertionMarker</c></summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_DisplayBreakpointsAndWatchExpressions">
      <summary>&#8211;(Value: 80) Launches the Edit Breakpoints/Watch Expressions dialog box.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_DisplayBreakpointSettings">
      <summary>&#8211;(Value: 81) Launches the Breakpoint Settings dialog box for the selected step. This command applies to the ExecutionView Manager or SequenceFileView Manager controls.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_Edit_AdvancedSequenceListSubmenu">
      <summary>&#8211;(Value: 451) Contains the <c>CommandKind_Edit_Attributes</c> subsidiary command. When you insert this command into a menu, the subsidiary commands appear within a submenu item. This command applies to the SequenceFileView Manager control.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_Edit_Attributes">
      <summary>&#8211;(Value: 450) Displays the Attributes dialog box. TestStand supports this command only for a sequence connection. This command applies to the SequenceFileView Manager control. This command has a default image.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_Edit_Copy">
      <summary>&#8211;(Value: 204) Copies the selection to the clipboard. This command applies to the SequenceFileView Manager control. This command has a default image.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_Edit_Cut">
      <summary>&#8211;(Value: 203) Moves the selection onto the clipboard. This command applies to the SequenceFileView Manager control. This command has a default image.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_Edit_Delete">
      <summary>&#8211;(Value: 206) Deletes the selection. This command applies to the SequenceFileView Manager control.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_Edit_EditCode">
      <summary>&#8211;(Value: 216) Displays the module source code for the step with focus. This command applies to the SequenceFileView Manager control.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_Edit_EditPaths">
      <summary>&#8211;(Value: 223) Launches the Edit Paths in Files dialog box.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_Edit_EditStep">
      <summary>&#8211;(Value: 217) Performs a step type-dependent editing operation on the step with focus. Typically, the operation launches an editing dialog box. For example, this command might launch the Edit Numeric Limit Test dialog box for a Numeric Limit Test step. You do not create commands of this type. Instead, the <c>CommandKind_Edit_EditSteps_Set</c> and <c>CommandKind_Edit_EditStepsSubmenu</c> constants contain commands of this type as needed. This command applies to the SequenceFileView Manager control.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_Edit_EditSteps_Set">
      <summary>&#8211;(Value: 341) Specifies a set of commands that contains a <c>CommandKind_Edit_EditStep</c> command for each step type specific editing operation that applies to the step with focus. A step type can define the available editing operations for instances of the type by specifying Edit substeps, which typically call a module to launch an editing dialog box.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_Edit_EditStepsSubmenu">
      <summary>&#8211;(Value: 301) Specifies a container command with subsidiary commands the <c>CommandKind_Edit_ EditSteps_Set</c> constant specifies. When you insert this command into a menu, the subsidiary commands appear within a submenu item. This command applies to the SequenceFileView Manager control.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_Edit_EncapsulateSelectedSteps">
      <summary>&#8211;(Value: 224) Surrounds the selected steps with the specified step and a corresponding end step. You do not create commands of this type. Instead, the <c>CommandKind_Edit_EncapsulateSelectedSteps_Set</c> and <c>CommandKind_Edit_EncapsulateSelectedStepsSubmenu</c> constants contain commands of this type as needed. This command applies to the SequenceFileView Manager control.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_Edit_EncapsulateSelectedSteps_Set">
      <summary>&#8211;(Value: 343) Specifies a set of commands that contains a <c>CommandKind_Edit_EncapsulateSelectedSteps</c> command for each available step type with the StepType.CanEncapsulate property set to <c>True</c> and that starts a block structure in a sequence. Insert this command into a menu to create the contents of the Encapsulate With context menu. This command applies to the SequenceFileView Manager control.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_Edit_EncapsulateSelectedStepsSubmenu">
      <summary>&#8211;(Value: 303) Specifies a container command whose subsidiary commands the <c>CommandKind_Edit_EncapsulateSelectedSteps_Set</c> constant specifies. When you insert this command into a menu, each subsidiary command is visible as a submenu item. This command applies to the SequenceFileView Manager control.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_Edit_InsertSequence">
      <summary>&#8211;(Value: 221) Inserts a new empty sequence into the selected sequence file. This command applies to the SequenceFileView Manager control.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_Edit_InsertStep">
      <summary>&#8211;(Value: 207) Inserts a step into the selected file. You do not create commands of this type. Instead, the <c>CommandKind_Edit_InsertSteps_Set</c> and <c>CommandKind_Edit_InsertStepsSubmenu</c> constants contain commands of this type as needed. This command applies to the SequenceFileView Manager control.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_Edit_InsertSteps_Set">
      <summary>&#8211;(Value: 340) Specifies a set of commands that contains a <c>CommandKind_Edit_InsertStep</c> command for each available step type. The commands are organized hierarchically as specified for the step types in the Step Type Menu Editor dialog box. Insert this command into a menu to create the contents of the Insert Step context menu. This command applies to the SequenceFileView Manager control.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_Edit_InsertStepsSubmenu">
      <summary>&#8211;(Value: 300) Specifies a container command with subsidiary commands the <c>CommandKind_Edit_InsertSteps_Set</c> constant specifies. When you insert this command into a menu, each subsidiary command is visible as a submenu item. This command applies to the SequenceFileView Manager control.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_Edit_NewSequenceFile">
      <summary>&#8211;(Value: 211) Creates a new, empty sequence file. This command applies to the SequenceFileView Manager control. This command has a default image.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_Edit_Paste">
      <summary>&#8211;(Value: 205) Pastes the contents of the clipboard into the selected file. This command applies to the SequenceFileView Manager control. This command has a default image.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_Edit_Preconditions">
      <summary>&#8211;(Value: 218) Launches the Preconditions dialog box. This command applies to the SequenceFileView Manager control.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_Edit_Redo">
      <summary>&#8211;(Value: 201) Calls Redo on the UndoStack of the connected manager control. This command applies to the SequenceFileView Manager and Application Manager controls. When connected to a SequenceFileView Manager control, this command redoes the last edit to the currently selected sequence file an undo command reverted. Before connecting this command to the Application Manager control, you must assign an UndoStack to the ApplicationMgr.UndoStack property. This command has a default image.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_Edit_Rename">
      <summary>&#8211;(Value: 202) Enters name-editing mode for the step with focus or the sequence item in a SequenceView or ListBox control. This command applies to the SequenceFileView Manager control.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_Edit_Save">
      <summary>&#8211;(Value: 208) Saves the selected sequence file. This command applies to the SequenceFileView Manager control. This command has a default image.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_Edit_SaveAll">
      <summary>&#8211;(Value: 210) Saves all modified sequences files. This command has a default image.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_Edit_SaveAs">
      <summary>&#8211;(Value: 209) Launches the Save As dialog box. The dialog box prompts you to choose a location in which to save the selected sequence file. This command applies to the SequenceFileView Manager control.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_Edit_SelectDefaultAdapter">
      <summary>&#8211;(Value: 220) Select a specific module adapter for new steps. You do not create commands of this type. Instead, the <c>CommandKind_Edit_SelectDefaultAdapters_Set</c> and <c>CommandKind_Edit_SelectDefaultAdaptersSubmenu</c> constants contain commands of this type as needed.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_Edit_SelectDefaultAdapters_Set">
      <summary>&#8211;(Value: 342) Specifies a set of commands that contains a <c>CommandKind_Edit_SelectDefaultAdapter</c> command for each module adapter.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_Edit_SelectDefaultAdaptersSubmenu">
      <summary>&#8211;(Value: 302) Specifies a container command with subsidiary commands the <c>CommandKind_Edit_SelectDefaultAdapters_Set</c> constant specifies. When you insert this command into a menu, each subsidiary command is visible as a submenu item.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_Edit_SequenceFileCallbacks">
      <summary>&#8211;(Value: 222) Launches the Sequence File Callbacks dialog box. This command applies to the SequenceFileView Manager control.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_Edit_SequenceFileProperties">
      <summary>&#8211;(Value: 214) Launches the Sequence File Properties dialog box for the selected sequence file.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_Edit_SequenceProperties">
      <summary>&#8211;(Value: 213) Launches the Sequence Properties dialog box for the sequence with focus.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_Edit_SpecifyModule">
      <summary>&#8211;(Value: 215) Launches the Specify Module dialog box for the step with focus. This command applies to the SequenceFileView Manager control.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_Edit_StepProperties">
      <summary>&#8211;(Value: 212) Launches the Step Properties dialog box for the step with focus.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_Edit_Undo">
      <summary>&#8211;(Value: 200) Calls Undo on the UndoStack of the connected manager control. This command applies to the SequenceFileView Manager and Application Manager controls. When connected to a SequenceFileView Manager control, this command reverts the most recent edit to the currently selected sequence file. Before connecting this command to the Application Manager control, you must assign an UndoStack to the <c>ApplicationMgr.UndoStack</c> property. This command has a default image.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_ExecutionEntryPointDefaultMenuInsertionMarker">
      <summary>&#8211;(Value: 111) Specifies a set of commands that contains a <c>CommandKind_RunEntryPoint</c> command for each Execution entry point with a menu hint that does not select a menu other than the current menu. Because most entry points do not have menu hints, this constant typically specifies all Execution entry points.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_ExecutionEntryPointInsertionMarker">
      <summary>&#8211;(Value: 110) Specifies a set of commands that contains a <c>CommandKind_RunEntryPoint</c> command for each Execution entry point with a menu hint that selects the current menu.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_ExecutionEntryPoints_Set">
      <summary>&#8211;(Value: 141) Specifies a set of commands that contains a <c>CommandKind_RunEntryPoint</c> command for each Execution entry point. When you specify commands to create menu items, use the <c>CommandKind_ExecutionEntryPointInsertionMarker</c> and <c>CommandKind_ExecutionEntryPointDefaultInsertionMarker</c> constants to honor any menu hints the entry points might specify.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_Exit">
      <summary>&#8211;(Value: 30) Unloads all files and exits the application.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_LockUnlock">
      <summary>&#8211;(Value: 148) When a sequence file is protected, this command launches the Lock File dialog box or the Unlock File dialog box, depending on whether the file is currently locked.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_Login">
      <summary>&#8211;(Value: 25) Launches the user login dialog box.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_LoginLogout">
      <summary>&#8211;(Value: 27) Launches the user login dialog box when no user is logged in. Otherwise, logs out the current user.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_Logout">
      <summary>&#8211;(Value: 26) Logs out the current user.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_LoopEntryPointOnSelectedSteps">
      <summary>&#8211;(Value: 43) Launches the Loop On Selected Steps dialog box, in which you can specify how many times the command loops on the selected steps using a specific Process Model entry point sequence. Do not directly create commands of this type. Instead, the following constants contain commands of this type as needed: <para><code>CommandKind_LoopOnSelectedStepsUsingEntryPoints_Set</code></para><c>CommandKind_LoopOnSelectedStepsUsingEntryPointsSubmenu</c> This command applies to the ExecutionView Manager and SequenceFileView Manager controls.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_LoopOnSelectedSteps">
      <summary>&#8211;(Value: 48) Launches the Loop On Selected Steps dialog box, in which you can specify how many times the command loops on the selected steps without using a process model. This command applies to the ExecutionView Manager and SequenceFileView Manager controls.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_LoopOnSelectedStepsUsingEntryPoints_Set">
      <summary>&#8211;(Value: 144) Specifies a set of <c>CommandKind_LoopEntryPointOnSelectedSteps</c> commands that contains a command to run the selected steps with each applicable Execution entry point.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_LoopOnSelectedStepsUsingEntryPointsSubmenu">
      <summary>&#8211;(Value: 49) For each applicable Process Model entry point, this command contains a subsidiary command that launches the Loop On Selected Steps dialog box, in which you can specify how many times the subsidiary command loops on the selected steps using the entry point. When you insert this command into a menu, each subsidiary command is listed as a submenu item. This command applies to the ExecutionView Manager and SequenceFileView Manager controls.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_MRUFile">
      <summary>&#8211;(Value: 29) Opens a file in the most recently used (MRU) file list. Each command in the set opens one of the files from the most recently used file list. Do not directly create commands of this type. Instead, use <c>CommandKind_MRUFiles_Set</c> to create a set of commands of this type.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_MRUFiles_Set">
      <summary>&#8211;(Value: 140) Specifies a set of <c>CommandKind_MRUFile</c> commands. Each command opens one of the files in the MRU file list. This command applies only to the Application Manager control.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_NotACommand">
      <summary>&#8211;(Value: 0) Guaranteed to never be a valid command kind specifier.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_OpenSequenceFile">
      <summary>&#8211;(Value: 20) Launches the Open File dialog box. When the user selects a sequence file, the command loads and displays the file. This command has a default image.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_OpenSequenceFiles">
      <summary>&#8211;(Value: 147) Launches the Open Multiple File dialog box, in which the user can select any number of files to open. The command loads all selected sequence files and displays one of the selected sequence files. This command has a default image.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_OpenWorkspaceBrowser">
      <summary>&#8211;(Value: 24) Launches the Workspace Browser dialog box.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_Restart">
      <summary>&#8211;(Value: 40) Restarts the selected execution. This command applies only to the ExecutionView Manager control. This command has a default image.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_Resume">
      <summary>&#8211;(Value: 66) Resumes the selected execution. This command applies only to the ExecutionView Manager control. This command has a default image.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_ResumeAll">
      <summary>&#8211;(Value: 79) Resumes all executions. This command applies only to the Application Manager control. This command has a default image.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_RunCurrentSequence">
      <summary>&#8211;(Value: 44) Runs the selected sequence without using a process model. This command applies only to the SequenceFileView Manager control. This command has a default image.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_RunEntryPoint">
      <summary>&#8211;(Value: 41) Runs a particular Process Model entry point sequence. Do not directly create commands of this type. Instead, use one of the following constants to create commands of this type as needed: <para><code>CommandKind_ExecutionEntryPoints_Set</code></para><para><code>CommandKind_ConfigurationEntryPoints_Set</code></para><para><code>CommandKind_ExecutionEntryPointInsertionMarker</code></para><para><code>CommandKind_ExecutionEntryPointDefaultMenuInsertionMarker</code></para><para><code>CommandKind_ConfigurationEntryPointInsertionMarker</code></para><c>CommandKind_ConfigurationEntryPointDefaultInsertionMarker</c> This command has a default image.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_RunEntryPointOnSelectedSteps">
      <summary>&#8211;(Value: 42) Runs the selected steps using a specific Process Model entry point sequence. Do not directly create commands of this type. Instead, use one of the following constants to create commands of this type, as needed: <para><code>CommandKind_RunSelectedStepsUsingEntryPoints_Set</code></para><c>CommandKind_RunSelectedStepsUsingEntryPointSubmenu</c> These commands apply only to the SequenceFileView Manager control.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_RunModeForceFail">
      <summary>&#8211;(Value: 63) Sets the run mode of the selected steps to <c>Force Fail</c> . This command applies to the ExecutionView Manager and SequenceFileView Manager controls.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_RunModeForcePass">
      <summary>&#8211;(Value: 62) Sets the run mode of the selected steps to <c>Force Pass</c> . This command applies to the ExecutionView Manager and SequenceFileView Manager controls.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_RunModeNormal">
      <summary>&#8211;(Value: 65) Sets the run mode of the selected steps to <c>Normal</c> . This command applies to the ExecutionView Manager and SequenceFileView Manager controls.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_RunModeSkip">
      <summary>&#8211;(Value: 64) Sets the run mode of the selected steps to <c>Skip</c> . This command applies to the ExecutionView Manager and SequenceFileView Manager controls.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_RunSelectedSteps">
      <summary>&#8211;(Value: 46) Runs the selected steps without using a process model. This command applies to the ExecutionView Manager and SequenceFileView Manager controls.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_RunSelectedStepsUsingEntryPoints_Set">
      <summary>&#8211;(Value: 143) Specifies a set of <c>CommandKind_RunEntryPointOnSelectedSteps</c> commands that contains a command to run the selected steps with each applicable Execution entry point.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_RunSelectedStepsUsingEntryPointsSubmenu">
      <summary>&#8211;(Value: 47) For each applicable Process Model entry point, this command contains a subsidiary command that runs the selected steps with that entry point. When you insert this command into a menu, each subsidiary command appears as an item in a submenu. This command applies only to the SequenceFileView Manager control.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_RunSequences_Set">
      <summary>&#8211;(Value: 142) Specifies a set of <c>CommandKind_RunSpecificSequence</c> commands that contains commands to run each sequence in the selected file without using a process model. This command applies only to the SequenceFileView Manager control.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_RunSpecificSequence">
      <summary>&#8211;(Value: 45) Runs a specific sequence without using a process model. You do not directly create commands of this type. Instead, the <c>CommandKinds_RunSequences_Set</c> constant contains commands of this type as needed. This command applies only to the SequenceFileView Manager control.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_SelectAll">
      <summary>&#8211;(Value: 219) Selects all the items or text in the control with focus.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_Separator">
      <summary>&#8211;(Value: 2) Denotes a visual separation between other commands. For example, when commands appear as items in a menu, commands of this type appear as menu item separator bars.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_SequenceViewConfiguration">
      <summary>&#8211;(Value: 116) Do not directly create commands of this type. Instead the <c>CommandKind_SequenceViewConfigurations_Set</c> constant contains commands of this type as needed.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_SequenceViewConfigurations_Set">
      <summary>&#8211;(Value: 139) Specifies a set of <c>CommandKind_SequenceViewConfiguration</c> commands. Each command in the set applies a specific configuration to all SequenceView controls that connect to the specified manager control. This command applies to the ExecutionView Manager and SequenceFileView Manager controls.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_SequenceViewConfigurationsSubmenu">
      <summary>&#8211;(Value: 118) Contains all the <c>CommandKind_SequenceViewConfiguration</c> commands the <c>CommandKind_SequenceViewConfigurations_Set</c> constant specifies, followed by a <c>CommandKind_Separator</c> and a <c>CommandKind_ConfigureSequenceViews</c> command. Insert this command into a menu to create a submenu with menu items to apply any existing SequenceView configuration or to edit the set of available configurations. This command applies to the ExecutionView Manager and SequenceFileView Manager controls.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_SetNextStep">
      <summary>&#8211;(Value: 70) Moves the execution pointer to the selected step. This command applies only to the ExecutionView Manager control. This command has a default image.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_SetRunModeSubmenu">
      <summary>&#8211;(Value: 61) Contains the following subsidiary commands: <para><code>CommandKind_RunModeForcePass</code></para><para><code>CommandKind_RunModeForceFail</code></para><para><code>CommandKind_RunModeSkip</code></para><c>CommandKind_RunModeForceNormal</c> When you insert this command into a menu, each subsidiary command appears as an item in a submenu. This command applies to the ExecutionView Manager and SequenceFileView Manager controls.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_ShowExamples">
      <summary>&#8211;(Value: 453) Launches the help for the NI TestStand example programs.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_ShowGettingStarted">
      <summary>&#8211;(Value: 454) Launches the Getting Started with TestStand manual.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_ShowGuideToDocumentation">
      <summary>&#8211;(Value: 421) Launches a topic that is a guide to the TestStand documentation . This command is visible only when editing is enabled.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_ShowHelpTopic">
      <summary>&#8211;(Value: 422) Launches the help for the currently active TestStand User Interface Control.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_ShowInList">
      <summary>&#8211;(Value: 400) Takes the selected step for an ExecutionView Manager control and selects the step in a SequenceFileView Manager control. This command is used in the context menu of a SequenceView control connected to an ExecutionView Manager control, and the command displays the step in the SequenceView control connected to a SequenceFileView Manager control.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_ShowInVariables">
      <summary>&#8211;(Value: 401) Takes the selected step for an ExecutionView Manager control and selects the step in a VariablesView control connected to the ExecutionView Manager control. This command is used in the context menu of a SequenceView control connected to an ExecutionView Manager control.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_ShowPatents">
      <summary>&#8211;(Value: 425) Displays a list of National Instruments patents.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_ShowTestStandDiscussionForum">
      <summary>&#8211;(Value: 424) Opens the TestStand discussion forum on <c>ni.com</c> in a web browser. This command is visible only when editing is enabled.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_ShowTestStandHelp">
      <summary>&#8211;(Value: 420) Launches the NI TestStand Help file. This command is visible only when editing is enabled.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_ShowTestStandWebResources">
      <summary>&#8211;(Value: 423) Opens the TestStand support web page in a browser. This command is visible only when editing is enabled.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_ShowUpdateService">
      <summary>&#8211;(Value: 452) Launches the NI Update Service. This option is available only when you have installed the NI Update Service.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_StepInto">
      <summary>&#8211;(Value: 67) Steps into the current step in the selected execution. This command applies only to the ExecutionView Manager control. This command has a default image.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_StepOut">
      <summary>&#8211;(Value: 69) Resumes execution through the end of the current sequence and suspends before the next step in the calling sequence. This command applies only to the ExecutionView Manager control. This command has a default image.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_StepOver">
      <summary>&#8211;(Value: 68) Steps over the current step in the selected execution. This command applies only to the ExecutionView Manager control. This command has a default image.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_Terminate">
      <summary>&#8211;(Value: 73) Terminates the selected execution. This command applies only to the ExecutionView Manager control. This command has a default image.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_TerminateAll">
      <summary>&#8211;(Value: 77) Terminates all executions. This command applies only to the Application Manager control. This command has a default image.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_TerminateRestart">
      <summary>&#8211;(Value: 74) Terminates the selected execution if it is executing or suspended and restarts the selected execution if it has completed. This command applies only to the ExecutionView Manager control. This command has a default image.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_ToggleBreakpoint">
      <summary>&#8211;(Value: 60) Toggles the breakpoint state of the selected steps. This command applies to the ExecutionView Manager and SequenceFileView Manager controls.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_ToolItem">
      <summary>&#8211;(Value: 100) Executes a particular tool item in the TestStand Tools menu. Do not directly create commands of this type. Instead, the <c>CommandKind_Tools_Set</c> constant contains a command of this type for each item in the TestStand Tools menu.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_Tools_Set">
      <summary>&#8211;(Value: 146) Specifies a set of <c>CommandKind_ToolItem</c> commands that contains a command for each tool item in the Tools menu.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_TracingEnabled">
      <summary>&#8211;(Value: 53) Toggles whether the user interface application displays the steps in an execution as they execute.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_UnloadAllModules">
      <summary>&#8211;(Value: 28) Removes all code modules from memory.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.CommandKinds.CommandKind_UnloadStepModule">
      <summary>&#8211;(Value: 455) Displays the module source code for the step with focus. This command is similar to CommandKind_Edit_EditCode, but does not increment the change count of the current sequence file. Unlike CommandKind_Edit_EditCode, this command is available when a sequence file is not editable, such as while the sequence is executing. CommandKind_UnloadStepModule is not available while any executions are actively running; the user must suspend all executions to use this command. This command applies to the SequenceFileView Manager and ExecutionView Manager control.</summary>
    </member>
    <member name="T:NationalInstruments.TestStand.Interop.UI.Support.ImageSources">
      <summary>These constants specify types of image sources. Each image source provides an icon that indicates an aspect of the current application state. You can use these constants to connect an image to a StatusBar pane or button using the ExecutionViewMgr.ConnectImage or SequenceFileViewMgr.ConnectImage methods.&#13; To obtain an image name without connecting it to a control, call the ApplicationMgr.GetImageName , ExecutionViewMgr.GetImageName , or SequenceFileViewMgr.GetImageName method. An image name is an icon name you can use to retrieve an icon from the TestStand Engine.&#13; An image source applies to all manager controls unless the help for the enumeration element specifies particular manager controls to which it applies.</summary>
      <seealso cref="ApplicationMgr.GetImageName" />
      <seealso cref="ExecutionViewMgr" />
      <seealso cref="ExecutionViewMgr.ConnectImage" />
      <seealso cref="ExecutionViewMgr.GetImageName" />
      <seealso cref="SequenceFileViewMgr" />
      <seealso cref="SequenceFileViewMgr.ConnectImage" />
      <seealso cref="SequenceFileViewMgr.GetImageName" />
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.ImageSources.ImageSource_BatchState">
      <summary>&#8211;(Value: 6) Displays an image that indicates the execution state of the batch that contains the current execution. This image source applies only to the ExecutionView Manager control.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.ImageSources.ImageSource_BatchStatus">
      <summary>&#8211;(Value: 5) Displays an image that indicates the batch result status for the batch that contains the current execution. This image source applies only to the ExecutionView Manager control.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.ImageSources.ImageSource_CurrentCallStackEntry">
      <summary>&#8211;(Value: 23) Displays a call stack icon for the selected stack frame in the current execution thread. When no current thread exists, the image source displays an empty image. This image source applies only to the ExecutionView Manager control.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.ImageSources.ImageSource_CurrentExecution">
      <summary>&#8211;(Value: 21) Displays an execution icon when a current execution exists. Otherwise, the image source displays an empty image. This image source applies only to the ExecutionView Manager control.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.ImageSources.ImageSource_CurrentProcessModelFile">
      <summary>&#8211;(Value: 24) Displays a sequence file icon when a process model exists for the currently executing or currently selected file. Otherwise, the image source displays an empty image. This image source applies to the ExecutionView Manager and SequenceFileView Manager controls.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.ImageSources.ImageSource_CurrentSequence">
      <summary>&#8211;(Value: 12) Displays a sequence icon when a currently executing or currently selected sequence exists. Otherwise, the image source displays an empty image. This image source applies to the ExecutionView Manager and SequenceFileView Manager controls.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.ImageSources.ImageSource_CurrentSequenceFile">
      <summary>&#8211;(Value: 11) Displays a sequence file icon when a currently executing or currently selected file exists. Otherwise, the image source displays an empty image. This image source applies to the ExecutionView Manager and SequenceFileView Manager controls.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.ImageSources.ImageSource_CurrentStep">
      <summary>&#8211;(Value: 14) Displays the icon for the current step in the current execution. This image source applies only to the ExecutionView Manager control.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.ImageSources.ImageSource_CurrentStepGroup">
      <summary>&#8211;(Value: 13) Displays an image that indicates the currently executing or currently selected step group. This image source applies to the ExecutionView Manager and SequenceFileView Manager controls.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.ImageSources.ImageSource_CurrentThread">
      <summary>&#8211;(Value: 22) Displays a thread icon when a current thread for the current execution exists. When no current thread exists, the image source displays an empty image. This image source applies only to the ExecutionView Manager control.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.ImageSources.ImageSource_ModelState">
      <summary>&#8211;(Value: 7) Displays an image that indicates the state of the current execution. This image source applies only to the ExecutionView Manager control.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.ImageSources.ImageSource_NotASource">
      <summary>&#8211;(Value: 0) Guaranteed to never be a valid image source specifier.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.ImageSources.ImageSource_UUTStatus">
      <summary>&#8211;(Value: 3) Displays an image that indicates the result status of the unit under test for the current execution. This image source applies only to the ExecutionView Manager control.</summary>
    </member>
    <member name="T:NationalInstruments.TestStand.Interop.UI.Support.NumericSources">
      <summary>These constants specify types of numeric sources. Each numeric source provides numeric values that describe an aspect of the current application state. You can use these constants to connect the execution progress state to a StatusBarPane progress indicator with the ExecutionViewMgr.ConnectNumeric method.&#13; To obtain a numeric value without connecting it to a control, call the ExecutionViewMgr.GetNumericValue method.&#13; A numeric source applies to all manager controls unless the help for the enumeration element specifies a particular manager control or controls with which it applies.</summary>
      <seealso cref="ExecutionViewMgr" />
      <seealso cref="ExecutionViewMgr.ConnectNumeric" />
      <seealso cref="ExecutionViewMgr.GetNumericValue" />
      <seealso cref="StatusBarPane" />
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.NumericSources.NumericSources_NotASource">
      <summary>&#8211;(Value: 0) Guaranteed to never be a valid numeric source specifier.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.NumericSources.NumericSources_ProgressPercent">
      <summary>&#8211;(Value: 10) A value from <c>0.0</c> to <c>100.0</c> that indicates the percentage of progress the current execution reports. This value indicates the progress of operations for which the execution chooses to report the amount of progress. The value does not necessarily reflect the progress of the execution as a whole. This numeric source applies only to the ExecutionView Manager control.</summary>
    </member>
    <member name="T:NationalInstruments.TestStand.Interop.UI.Support.SeqListConnectionColumns">
      <summary>These constants represent the column type you can use with the column parameter of the SequenceListConnection.SetColumnVisible and SequenceListConnection.GetColumnVisible methods.</summary>
      <seealso cref="SequenceListConnection.GetColumnVisible" />
      <seealso cref="SequenceListConnection.SetColumnVisible" />
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.SeqListConnectionColumns.SeqListConnectionColumn_Comments">
      <summary>&#8211;(Value: 1) Specifies the column that contains the comment of the sequence.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.SeqListConnectionColumns.SeqListConnectionColumn_Label">
      <summary>&#8211;(Value: 0) Specifies the column that contains the name of the sequence.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.SeqListConnectionColumns.SeqListConnectionColumn_Requirements">
      <summary>&#8211;(Value: 2) Specifies the column that contains the requirements of the sequence.</summary>
    </member>
  </members>
</doc>
Libs/25/NationalInstruments.TestStand.Interop.UI.dll
Binary files differ
Libs/25/NationalInstruments.TestStand.Interop.UI.xml
New file
Diff too large
Libs/25/NationalInstruments.TestStand.Utility.dll
Binary files differ
Libs/25/NationalInstruments.TestStand.Utility.xml
New file
@@ -0,0 +1,2303 @@
<?xml version="1.0"?>
<doc>
    <assembly>
        <name>NationalInstruments.TestStand.Utility</name>
    </assembly>
    <members>
        <member name="T:NationalInstruments.TestStand.Utility.TSHelper">
            <summary>
            This class contains various methods that can be useful when you use the TestStand API or the TestStand UI Controls API from a .NET language
            </summary>
            <lastupdated>9/29/2011 1:54:18 PM</lastupdated>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.TSHelper.GetTestStandSplashImage">
            <summary>
            Returns  the standard image used as the background TestStand splash screens.
            </summary>
            <returns>The splash screen image.</returns>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.TSHelper.GetTestStandAnimatedSplashImage">
            <summary>
            Returns  the standard animated image used as the background TestStand splash screens.
            </summary>
            <returns>The animated splash screen image.</returns>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.TSHelper.DoSynchronousGCForCOMObjectDestruction">
            <summary>
            This method ensures than any COM objects pending for garbage collection are released before it returns.
            </summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.TSHelper.MakePath(System.String,System.String,System.String)">
            <summary>
            Creates a path with the <paramref name="directory"/>, <paramref name="fileName"/> and
            <paramref name="extension"/> specified by combining the three.
            </summary>
            <param name="directory">The directory part of the path</param>
            <param name="fileName">The file name part of the path</param>
            <param name="extension">
            The extension part of the path. The extension can be passed with or without the dot.
            </param>
            <returns>
            The combined path <paramref name="directory"/>\<paramref name="fileName"/>.<paramref name="extension"/>
            </returns>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.TSHelper.NumericSuffixStartingIndex(System.String)">
            <summary>
            Returns the index of the underscore in the numeric suffix at the end of
            <paramref name="fileName"/>. The numeric suffix is defined as an underscore followed by
            one or more digits.
            </summary>
            <param name="fileName">The file name to get a numeric index from.</param>
            <returns>The index of the underscore in the numeric suffix.</returns>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.TSHelper.GetFileNameWithCountSuffix(System.String,System.Int32)">
            <summary>
            Creates a new file name from the base <paramref name="fileName"/> with a numeric suffix
            with an integer part <paramref name="count"/>
            </summary>
            <example>
            GetFileNameWithCountSuffix("abc", 3) --> "abc_3"
            </example>
            <param name="fileName">The base part of the file name to generate</param>
            <param name="count">The integer part of the suffix of th file name to generate</param>
            <returns>A string with the file name generated from the base and count specified</returns>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.TSHelper.LongCreateUniqueFile(System.String,System.String,System.String)">
            <summary>
            Returns the path of a unique file name in <paramref name="directory"/> with the base
            <paramref name="fileName"/> specified and <paramref name="extension"/>. The method will
            return the result of calling <see cref="M:System.IO.Path.Combine(System.String,System.String)"/> with
            <paramref name="directory"/> and <paramref name="fileName"/> if no file with that name
            already exists in <paramref name="directory"/> or it will create a new unique file name
            with a numeric suffix.
            </summary>
            <param name="directory">The directory where the unique file name will be created</param>
            <param name="fileName">The base part of the file name which will be generated</param>
            <param name="extension">The extension to add to the file name</param>
            <returns>A path guaranteed to be unique in the directory specified.</returns>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.TSHelper.CreateUniqueFile(System.String,System.String,System.String)">
            <summary>
            Returns the path of a unique file name in <paramref name="directory"/> with the base
            <paramref name="fileName"/> specified and <paramref name="extension"/>. The method will
            return the result of calling <see cref="M:System.IO.Path.Combine(System.String,System.String)"/> with
            <paramref name="directory"/> and <paramref name="fileName"/> if no file with that name
            already exists in <paramref name="directory"/> or it will create a new unique file name
            with a numeric suffix.
            </summary>
            <param name="directory">The directory where the unique file name will be created</param>
            <param name="fileName">The base part of the file name which will be generated</param>
            <param name="extension">The extension to add to the file name</param>
            <returns>A path guaranteed to be unique in the directory specified.</returns>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.TSHelper.CreateUniqueFileInternal(System.String,System.String,System.String,System.Boolean)">
            <summary>
            <see cref="M:NationalInstruments.TestStand.Utility.TSHelper.CreateUniqueFile(System.String,System.String,System.String)"/>
            </summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.TSHelper.ParseEnvironmentPathFromArgs(System.String[]@,System.Boolean,System.String)">
             <summary>This is a helper function that command line applications that accept an engine
             environment argument on the command line can use to parse out the environment argument.  The
             environment must be passed with the syntax:
             /env {PATH}
             or, for example,
             /env d:\MyEnv.tsenv
             The argument can appear anywhere on the command line.
             If found, the path is returned and the environment argument is removed from the array.  If no
             environment argument is present, <paramref name="defaultEnvironment"/> is returned and args is left unchanged.
             If multiple environments are specified, only the first is removed from the list and returned.  It is up
             to the command line parsing logic of the application to ignore or error if additional /env arguments
             are present.</summary>
             <param name="args">The command line arguments.  If an environment is found, it will be removed from the
             array.</param>
             <param name="allowExceptions">Pass true to allow this function to generate an exception if the arguments
             are invalid.  Pass false if you are handling command line exceptions elsewhere.  If you use the
             TestStand Application Manager in your application, pass false.</param>
             <param name="defaultEnvironment">if no environment is found, the method returns this value.</param>
             <returns>The environment path if one was passed, null otherwise.</returns>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.TSHelper.MakeEnvironmentArg(System.String)">
            <summary>Create a command line argument to specify the TestStand environment to an application that uses
            the /env "{PATH}" syntax.</summary>
            <param name="path">The path to the environment.</param>
            <returns>An empty string if path is null or empty.  Otherwise, returns
                 /env + "{PATH}"
            enclosed in quotes and preceded by a space.  This is to fascilitate construction of a command
            line.</returns>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.TSHelper.TE_ROOT_KEY">
            <summary>The path to TestStand related keys in the registry relative to HKEY_LOCAL_MACHINE.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.TSHelper.HKLM_TE_ROOT_KEY">
            <summary>The path to TestStand related keys in the registry including HKEY_LOCAL_MACHINE.</summary>
        </member>
        <member name="T:NationalInstruments.TestStand.Utility.Menus">
            <summary>
            This class contains various methods that can be useful when you use the TestStand API or the TestStand UI Controls API from a .NET language
            </summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Menus.TranslateShortcutKeyToDotNet(NationalInstruments.TestStand.Interop.UI.ShortcutKeys,System.Int32)">
            <summary>
                <para>This method converts a ShortcutKeys and ShortcutModifiers into a .NET Shortcut key value. If no equivalent .NET Shortcut value exists, the method returns Shortcut.None.</para>
                <para>Typically, you call a higher level method, such as TSUtil.InsertCommandsInMenu, to create .NET menu items that execute TestStand commands.  In that case, the higher level method calls this method for you to determine the correct menu shortcut values.</para>
            </summary>
            <param name="key">a ShortcutKeys value
            </param>
            <param name="modifier">a ShortcutModifiers value
            </param>
            <returns>the .NET Shortcut value that corresponds to the key and modifier value you specify
            </returns>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Menus.InsertCommandObjectInMenu(NationalInstruments.TestStand.Interop.UI.Command,System.Windows.Forms.Menu,System.Windows.Forms.MenuItem,System.Boolean)">
            <summary>
            Typically, you call InsertCommandsInMenu instead of this method. However, if you have a TestStand.Interop.UI.Command object for which you want to create a menu item, you can call this method directly.
            </summary>
            <param name="command">
            Pass the TestStand.Interop.UI.Command object that represent the action the menu item takes when the user selects it.
            </param>
            <param name="parentMenu">
            Pass the menu into which to insert the menu item.
            </param>
            <param name="menuItemToInsertBefore">
            The MenuItem before which the method inserts the new menu item.  To insert at the end of the menu, pass Nothing (VB) or null (C#)
            </param>
            <param name="useShortCutKeys">
            Pass false to prevent menu items from having shortcut keys.
            </param>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Menus.InsertCommandsInMenu(System.Collections.IList,System.Windows.Forms.Menu,System.Windows.Forms.MenuItem,System.Object,System.Boolean)">
            <summary>
                <para>Use this overload of InsertCommandsInMenu when you do not need to know the actual number of menu items the method inserts.<br></br></para>
                <para>Refer to the other overload of this method for more information.</para>
            </summary>
            <param name="commandTypes">A list in which each element is a TestStand.Interop.UI.CommandKinds value. For each element in the list, the method inserts the corresponding menu item(s) into the menu.
            </param>
            <param name="parentMenu">The menu into which the method inserts the menu items
            </param>
            <param name="menuItemToInsertBefore">
            The MenuItem before which the method inserts the new menu items.  To insert at the end of the menu, pass Nothing (VB) or null (C#)
            </param>
            <param name="managerControl">Pass the TestStand.Interop.UI.SequenceFileViewMgr or TestStand.Interop.UI.ExecutionViewMgr control, if any, to which the new menu item(s) apply. If the commands do not apply to a view manager control, pass the TestStand.Interop.UI.ApplicationMgr control that you placed on one of your application forms.
            </param>
            <param name="useShortCutKeys">
            Pass false to prevent menu items from having shortcut keys.
            </param>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Menus.RemoveInvalidShortcutKeys(NationalInstruments.TestStand.Interop.UI.Commands)">
            <summary>
            .NET does not support certain keys as menu shortcuts. Call this method to remove shortcuts that .NET does not support
            from a Commands collection before calling Commands.InsertIntoWin32Menu
            </summary>
            <param name="commands">
            Pass the TestStand.Interop.UI.Commands object that represent the actions that populate a context menu.
            </param>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Menus.InsertCommandsInMenu(System.Collections.IList,System.Windows.Forms.Menu,System.Windows.Forms.MenuItem,System.Object,System.Int32@,System.Boolean)">
            <summary>
                <para>As an alternative to manually writing menu handler code for common TestStand commands, you can use this method to create new menu items that execute the commands you specify without requiring any additional code.</para>
                <para>To create the menu items, you specify a list of TestStand.Interop.UI.CommandKinds elements. Each element specifies a menu item or group of menu items to insert. To each menu item this method inserts, it attaches a TestStand.Interop.UI.Command object that represents the action the menu item takes.  The method installs an event handler for the menu item that automatically invokes the associated command object when the user selects the menu item.</para>
                <para>Typically, you call this method in response to the MenuStart event to populate the menu with the commands that apply to the current state of the application.  Before you call this method, you can call RemoveMenuCommands to remove any menu items you previously inserted.</para>
            </summary>
            <param name="commandTypes">A list in which each element is a TestStand.Interop.UI.CommandKinds value. For each element in the list, the method inserts the corresponding menu item(s) into the menu.
            </param>
            <param name="parentMenu">The menu into which the method inserts the menu items
            </param>
            <param name="menuItemToInsertBefore">
            The MenuItem before which the method inserts the new menu items.  To insert at the end of the menu, pass Nothing (VB) or null (C#)
            </param>
            <param name="managerControl">Pass the TestStand.Interop.UI.SequenceFileViewMgr or TestStand.Interop.UI.ExecutionViewMgr control, if any, to which the new menu item(s) apply. If the commands do not apply to a view manager control, pass the TestStand.Interop.UI.ApplicationMgr control that you placed on one of your application forms.
            </param>
            <param name="numInserted">This out parameter returns the number of menu items the method inserts.  The number of menu items does not necessarily equal the number of TestStand.Interop.UI.CommandKinds elements you specify because, depending on the CommandType and the state of the application, a single CommandType element might create several menu items or none at all. The parameter counts only items the method adds to the menu you pass. The parameter does not count items the method inserts into submenus the method creates.
            </param>
            <param name="useShortCutKeys">
            Pass false to prevent menu items from having shortcut keys.
            </param>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Menus.InsertCommandCollectionInMenu(NationalInstruments.TestStand.Interop.UI.Commands,System.Windows.Forms.Menu,System.Windows.Forms.MenuItem,System.Boolean)">
            <summary>Typically, you call InsertCommandsInMenu instead of this method. However, if you have a TestStand.Interop.UI.CommandCollection object for which you want to create menu items, you can call this method directly.
            </summary>
            <param name="commandCollection">A TestStand.Interop.UI.CommandCollection that contains the Commands to place in the menu.
            </param>
            <param name="parentMenu">
            The menu into which to insert the menu item.
            </param>
            <param name="menuItemToInsertBefore">
            The MenuItem before which the method inserts the new menu item. To insert at the end of the menu, pass Nothing (VB) or null (C#)
            </param>
            <param name="useShortCutKeys">
            Pass false to prevent menu items from having shortcut keys.
            </param>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Menus.RemoveMenuCommands(System.Windows.Forms.Menu,System.Boolean,System.Boolean)">
            <summary>
                <para>Call this method to remove menus and menu items that you insert with TSUtil methods such as InsertCommandsInMenu. Optionally, you can also remove menu and menu items that you insert by other means.</para>
                <para>Typically, you call this method when handling a MenuStart event in order to clear the menu so that you can then call InsertCommandsInMenu to populate the menu with items that are appropriate for the current state of the application.
            </para>
            </summary>
            <param name="menu">The method removes any menus or menu items that TSUtil methods create under this menu, including the menu itself. To remove items from all menus, pass the Menu that is the menubar.
            </param>
            <param name="removeNonTSMenus">
            Pass true to also remove menus that you did not insert by calling a TSUtil method.
            </param>
            <param name="removeNonTSItems">
            Pass true to also remove menu items that you did not insert by calling a TSUtil method.
            </param>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Menus.BeginUpdate(System.Windows.Forms.Form)">
            <summary>
                <para>This method prevents edits made by the Menus class from affecting the visual state of the form's menu.</para>
                <para>Call this method prior to making changes to a form's menu with the Menu class.</para>
                <para>After edits are made, call EndUpdate to present the modified menu.</para>
            </summary>
            <param name="form">Pass the form which contains the menu being modified.
            </param>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Menus.EndUpdate">
            <summary>
                <para>This method restores a form's modified menu and resumes updates.</para>
                <para>Call this method after making changes to a form's menu using the Menus class.</para>
                <para>Ensure that each call to EndUpdate is preceded by a call to BeginUpdate</para>
                <para>(Note: These calls can not be nested).</para>
            </summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Menus.CleanupMenu(System.Windows.Forms.Menu)">
            <summary>
                <para>This method removes any duplicate menu shortcut keys or redundant menu separator bars.</para>
                <para>If you make multiple calls to InsertCommandsInMenu or if call InsertCommandsInMenu to add to an existing menu, it can be difficult to prevent duplicate shortcut keys and separator bars because the inserted menus item may vary based on the state of the application.  Rather than trying to prevent duplicate shortcuts and separators, it is simpler to remove them with this method after you update the menu bar.</para>
                <para>Typically you call this method on the entire menu bar after you update a menu in response to a MenuStart event.</para>
            </summary>
            <param name="menu">Pass the menu to recursively search for duplicate shortcut keys and separator bars. Typically you pass the menu object that represents the menubar for a form.
            </param>
        </member>
        <member name="T:NationalInstruments.TestStand.Utility.Win32">
            <summary>
            Exposes selected Win32 SDK Functions. Typically, you only uses these functions in .NET code when necessary to implement a work-around for a .NET limitation or bug.
            </summary>
        </member>
        <member name="T:NationalInstruments.TestStand.Utility.Win32.CopyDataStruct">
            <summary>
            Data structure for send message
            </summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32.CopyDataStruct.SetMessage(System.String)">
            <summary>
            Sets the message of this structure and stores it in global memory in order to be able to send
            it to another process. If you are calling this method you will need to call the DisposeMessage()
            method to clean up the used memory.
            </summary>
            <param name="message"></param>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32.CopyDataStruct.GetMessage">
            <summary>
            Converts the message pointer into a string
            </summary>
            <returns>The string in the messages data</returns>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32.CopyDataStruct.DisposeMessage">
            <summary>
            Cleans the global memory used in the message
            </summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32.PostMessage(System.Runtime.InteropServices.HandleRef,System.UInt32,System.IntPtr,System.IntPtr)">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32.SendMessage(System.Runtime.InteropServices.HandleRef,System.UInt32,System.IntPtr,System.IntPtr)">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32.GetMenu(System.Runtime.InteropServices.HandleRef)">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32.GetKeyState(System.Int32)">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32.GetParent(System.Runtime.InteropServices.HandleRef)">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32.GetWindowThreadProcessId(System.Runtime.InteropServices.HandleRef,System.UInt32@)">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32.LockWindowUpdate(System.Runtime.InteropServices.HandleRef)">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32.GetFileTime(System.IntPtr,System.Runtime.InteropServices.ComTypes.FILETIME@,System.Runtime.InteropServices.ComTypes.FILETIME@,System.Runtime.InteropServices.ComTypes.FILETIME@)">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32.GetLongPathNameW(System.String,System.Text.StringBuilder,System.Int32)">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32.GetFileAttributesW(System.String)">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32.SetFileAttributesW(System.String,NationalInstruments.TestStand.Utility.Win32.FileAttributes)">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32.FindFirstFileW(System.String,NationalInstruments.TestStand.Utility.Win32.WIN32_FIND_DATAW@)">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32.FindNextFileW(System.IntPtr,NationalInstruments.TestStand.Utility.Win32.WIN32_FIND_DATAW@)">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32.CreateFileW(System.String,NationalInstruments.TestStand.Utility.Win32.FileAccess,NationalInstruments.TestStand.Utility.Win32.FileShare,System.IntPtr,NationalInstruments.TestStand.Utility.Win32.CreationDisposition,NationalInstruments.TestStand.Utility.Win32.FileAttributes,System.IntPtr)">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32.CreateDirectoryW(System.String,System.IntPtr)">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32.MoveFileExW(System.String,System.String,NationalInstruments.TestStand.Utility.Win32.MoveFileExFlags)">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32.CopyFileW(System.String,System.String,System.Boolean)">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32.DeleteFileW(System.String)">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32.RemoveDirectoryW(System.String)">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32.FindClose(System.IntPtr)">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32.GetFileSize(System.IntPtr,System.UInt32@)">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32.GetFileSizeEx(System.IntPtr,System.Int64@)">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32.WriteFile(System.IntPtr,System.Byte[],System.UInt32,System.UInt32@,System.IntPtr)">
            <summary>Refer to Microsoft Win32 SDK Help.
            We use IntPtr for lpOverLapped here beacuse it is easier to pass null that way.
            </summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32.GlobalAlloc(System.UInt32,System.UIntPtr)">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32.GlobalFree(System.IntPtr)">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32.SendStringMessage(System.Runtime.InteropServices.HandleRef,System.UInt32,System.IntPtr,NationalInstruments.TestStand.Utility.Win32.CopyDataStruct@)">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32.FindWindow(System.IntPtr,System.String)">
             <summary>
             Refer to Microsoft Win32 SDK Help.
             Note:  Pass IntPtr.Zero for the first parameter.
             </summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32.FindWindowEx(System.Runtime.InteropServices.HandleRef,System.Runtime.InteropServices.HandleRef,System.String,System.String)">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32.SetForegroundWindow(System.Runtime.InteropServices.HandleRef)">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32.GetActiveWindow">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32.OpenIcon(System.Runtime.InteropServices.HandleRef)">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32.IsIconic(System.Runtime.InteropServices.HandleRef)">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32.CreateMutex(System.IntPtr,System.Boolean,System.String)">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32.WaitForSingleObject(System.IntPtr,System.UInt32)">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32.ReleaseMutex(System.IntPtr)">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32.CloseHandle(System.IntPtr)">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32.LoadLibrary(System.String)">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32.FreeLibrary(System.IntPtr)">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.INFINITE">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.WAIT_ABANDONED">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.WAIT_OBJECT_0">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.WAIT_TIMEOUT">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.WAIT_FAILED">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.MAX_PATH">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.WM_QUERYENDSESSION">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.WM_COPYDATA">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.WM_SYSKEYDOWN">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.WM_KEYDOWN">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.WM_ENTERMENULOOP">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.WM_INITMENU">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.WM_EXITMENULOOP">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.BCM_SETSHIELD">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.VK_F1">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.VK_F4">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.VK_F24">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.VK_BACK">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.VK_TAB">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.VK_SHIFT">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.VK_CONTROL">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.VK_PAUSE">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.VK_SPACE">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.VK_PRIOR">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.VK_NEXT">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.VK_END">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.VK_HOME">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.VK_LEFT">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.VK_UP">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.VK_RIGHT">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.VK_DOWN">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.VK_INSERT">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.VK_DELETE">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.VK_NUMPAD0">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.VK_NUMPAD1">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.VK_NUMPAD2">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.VK_NUMPAD3">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.VK_NUMPAD4">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.VK_NUMPAD5">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.VK_NUMPAD6">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.VK_NUMPAD7">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.VK_NUMPAD8">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.VK_NUMPAD9">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.VK_MULTIPLY">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.VK_ADD">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.VK_SUBTRACT">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.VK_DECIMAL">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.VK_DIVIDE">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.ERROR_SUCCESS">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.ERROR_FILE_NOT_FOUND">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.ERROR_PATH_NOT_FOUND">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.ERROR_ACCESS_DENIED">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.ERROR_INVALID_DRIVE">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.ERROR_NO_MORE_FILES">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.ERROR_SHARING_VIOLATION">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.ERROR_FILE_EXISTS">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.ERROR_INVALID_NAME">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.ERROR_DIR_NOT_EMPTY">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.ERROR_ALREADY_EXISTS">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.ERROR_FILENAME_EXCED_RANGE">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.ERROR_OPERATION_ABORTED">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.REGDB_E_CLASSNOTREG">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="P:NationalInstruments.TestStand.Utility.Win32.INVALID_HANDLE_VALUE">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.INVALID_FILE_SIZE">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="T:NationalInstruments.TestStand.Utility.Win32.FileAttributes">
            <summary>Refer to Microsoft Win32 SDK Help for SetFileAttributes()
            and GetFileAttributes() functions.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAttributes.INVALID_FILE_ATTRIBUTES">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAttributes.FILE_ATTRIBUTE_ARCHIVE">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAttributes.FILE_ATTRIBUTE_COMPRESSED">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAttributes.FILE_ATTRIBUTE_DEVICE">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAttributes.FILE_ATTRIBUTE_DIRECTORY">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAttributes.FILE_ATTRIBUTE_ENCRYPTED">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAttributes.FILE_ATTRIBUTE_HIDDEN">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAttributes.FILE_ATTRIBUTE_NORMAL">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAttributes.FILE_ATTRIBUTE_NOT_CONTENT_INDEXED">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAttributes.FILE_ATTRIBUTE_OFFLINE">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAttributes.FILE_ATTRIBUTE_READONLY">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAttributes.FILE_ATTRIBUTE_REPARSE_POINT">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAttributes.FILE_ATTRIBUTE_SPARSE_FILE">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAttributes.FILE_ATTRIBUTE_SYSTEM">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAttributes.FILE_ATTRIBUTE_TEMPORARY">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAttributes.FILE_ATTRIBUTE_VIRTUAL">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAttributes.ReadOnly">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAttributes.Hidden">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAttributes.System">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAttributes.Directory">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAttributes.Archive">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAttributes.Device">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAttributes.Normal">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAttributes.Temporary">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAttributes.SparseFile">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAttributes.ReparsePoint">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAttributes.Compressed">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAttributes.Offline">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAttributes.NotContentIndexed">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAttributes.Encrypted">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="T:NationalInstruments.TestStand.Utility.Win32.FileAccess">
            <summary>Refer to Microsoft Win32 SDK Help for "File Security and
            Access Rights," "Generic Access Rights," "File Access Rights
            Constants," as well as the WinNT.h header file.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAccess.GENERIC_READ">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAccess.GENERIC_WRITE">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAccess.GENERIC_EXECUTE">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAccess.GENERIC_ALL">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAccess.DELETE">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAccess.READ_CONTROL">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAccess.WRITE_DAC">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAccess.WRITE_OWNER">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAccess.SYNCHRONIZE">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAccess.STANDARD_RIGHTS_REQUIRED">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAccess.STANDARD_RIGHTS_READ">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAccess.STANDARD_RIGHTS_WRITE">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAccess.STANDARD_RIGHTS_EXECUTE">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAccess.STANDARD_RIGHTS_ALL">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAccess.SPECIFIC_RIGHTS_ALL">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAccess.FILE_READ_DATA">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAccess.FILE_LIST_DIRECTORY">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAccess.FILE_WRITE_DATA">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAccess.FILE_ADD_FILE">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAccess.FILE_APPEND_DATA">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAccess.FILE_ADD_SUBDIRECTORY">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAccess.FILE_CREATE_PIPE_INSTANCE">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAccess.FILE_READ_EA">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAccess.FILE_WRITE_EA">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAccess.FILE_EXECUTE">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAccess.FILE_TRAVERSE">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAccess.FILE_DELETE_CHILD">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAccess.FILE_READ_ATTRIBUTES">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAccess.FILE_WRITE_ATTRIBUTES">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAccess.FILE_ALL_ACCESS">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAccess.FILE_GENERIC_READ">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAccess.FILE_GENERIC_WRITE">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAccess.FILE_GENERIC_EXECUTE">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="T:NationalInstruments.TestStand.Utility.Win32.FileShare">
            <summary>Refer to Microsoft Win32 SDK Help for the CreateFile()
            function, "Creating and Opening Files" as well as the WinNT.h
            header file.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileShare.FILE_SHARE_READ">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileShare.FILE_SHARE_WRITE">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileShare.FILE_SHARE_DELETE">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="T:NationalInstruments.TestStand.Utility.Win32.CreationDisposition">
            <summary>Refer to Microsoft Win32 SDK Help for the CreateFile()
            function.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.CreationDisposition.CREATE_NEW">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.CreationDisposition.CREATE_ALWAYS">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.CreationDisposition.OPEN_EXISTING">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.CreationDisposition.OPEN_ALWAYS">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.CreationDisposition.TRUNCATE_EXISTING">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="T:NationalInstruments.TestStand.Utility.Win32.MoveFileExFlags">
            <summary>Refer to Microsoft Win32 SDK Help for MoveFileEx()
            function.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.MoveFileExFlags.MOVEFILE_REPLACE_EXISTING">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.MoveFileExFlags.MOVEFILE_COPY_ALLOWED">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.MoveFileExFlags.MOVEFILE_DELAY_UNTIL_REBOOT">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.MoveFileExFlags.MOVEFILE_WRITE_THROUGH">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.MoveFileExFlags.MOVEFILE_CREATE_HARDLINK">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.MoveFileExFlags.MOVEFILE_FAIL_IF_NOT_TRACKABLE">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="T:NationalInstruments.TestStand.Utility.Win32.WIN32_FIND_DATAW">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.WIN32_FIND_DATAW.dwFileAttributes">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.WIN32_FIND_DATAW.ftCreationTime">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.WIN32_FIND_DATAW.ftLastAccessTime">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.WIN32_FIND_DATAW.ftLastWriteTime">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.WIN32_FIND_DATAW.nFileSizeHigh">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.WIN32_FIND_DATAW.nFileSizeLow">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.WIN32_FIND_DATAW.dwReserved0">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.WIN32_FIND_DATAW.dwReserved1">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.WIN32_FIND_DATAW.cFileName">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.WIN32_FIND_DATAW.cAlternateFileName">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="T:NationalInstruments.TestStand.Utility.Win32.AppBarMessage">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.AppBarMessage.ABM_NEW">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.AppBarMessage.ABM_REMOVE">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.AppBarMessage.ABM_QUERYPOS">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.AppBarMessage.ABM_SETPOS">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.AppBarMessage.ABM_GETSTATE">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.AppBarMessage.ABM_GETTASKBARPOS">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.AppBarMessage.ABM_ACTIVATE">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.AppBarMessage.ABM_GETAUTOHIDEBAR">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.AppBarMessage.ABM_SETAUTOHIDEBAR">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.AppBarMessage.ABM_WINDOWPOSCHANGED">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.AppBarMessage.ABM_SETSTATE">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="T:NationalInstruments.TestStand.Utility.Win32.APPBARDATA">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.APPBARDATA.cbSize">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.APPBARDATA.hWnd">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.APPBARDATA.uCallbackMessage">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.APPBARDATA.uEdge">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.APPBARDATA.rc">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.APPBARDATA.lParam">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32.APPBARDATA.GetNewInstance">
            <summary>
            Create a new instance of <see cref="T:NationalInstruments.TestStand.Utility.Win32.APPBARDATA"/> with <see cref="F:NationalInstruments.TestStand.Utility.Win32.APPBARDATA.cbSize"/>
            correctly set for the size of the type.
            </summary>
            <returns>A new instance of <see cref="T:NationalInstruments.TestStand.Utility.Win32.APPBARDATA"/></returns>
        </member>
        <member name="T:NationalInstruments.TestStand.Utility.Win32.RECT">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="P:NationalInstruments.TestStand.Utility.Win32.RECT.Left">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="P:NationalInstruments.TestStand.Utility.Win32.RECT.Top">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="P:NationalInstruments.TestStand.Utility.Win32.RECT.Right">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="P:NationalInstruments.TestStand.Utility.Win32.RECT.Bottom">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="P:NationalInstruments.TestStand.Utility.Win32.RECT.Width">
            <summary>
            Returns the width of the rectangle
            </summary>
        </member>
        <member name="P:NationalInstruments.TestStand.Utility.Win32.RECT.Height">
            <summary>
            Returns the height of the rectangle
            </summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32.SHAppBarMessage(System.UInt32,NationalInstruments.TestStand.Utility.Win32.APPBARDATA@)">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="T:NationalInstruments.TestStand.Utility.Win32Wrap">
            <summary>
            Win32Wrap contains methods that wrap some of the P/Invoke defined
            calls in the Win32 class.  The idea is to shield consumers from
            detail of calling Win32 methods directly.  Win32Wrap methods
            handle things like buffer sizing, translating Win32 error codes
            to appropriate exceptions, etc.
            </summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32Wrap.SendSetShieldMessage(System.Runtime.InteropServices.HandleRef,System.Boolean)">
            <summary>
            Call the SendMessage function with the message type <see cref="F:NationalInstruments.TestStand.Utility.Win32.BCM_SETSHIELD"/>
            to set or unset the UAC shield in the control <paramref name="controlReference"/>
            </summary>
            <param name="controlReference">
            A <see cref="T:System.Runtime.InteropServices.HandleRef"/> to the control which should display the UAC shield.
            </param>
            <param name="setShield">Whether to show or hide the UAC shield.</param>
            <returns></returns>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32Wrap.FindWindow(System.String)">
            <summary>
            Call the FindWindow Win API function. This method will return a pointer with a handle to the window if it was found or
            a null pointer if not found.
            </summary>
            <param name="windowTitle">
            The window title to match, if empty string or not specified then match all. The window name must be localized by the
            caller of this method.
            </param>
            <returns>A pointer to a window handle which matches the values passed in or a null pointer if no window matches.</returns>
            <exception cref="T:System.Runtime.InteropServices.COMException">If the FindWindow method returns an error</exception>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32Wrap.SendStringMessage(System.Runtime.InteropServices.HandleRef,System.UInt32,System.String)">
            <summary>
            Sends the specified message string with the specified code (or WM_USER if not defined) to the window handle specified.
            In order to get a window handle call FindWindow
            </summary>
            <param name="windowHandle">The window handle received from FindWindow</param>
            <param name="messageCode">The message code to send</param>
            <param name="messageString">The message string to send</param>
            <returns>A pointer with information, depends on the message sent</returns>
            <exception cref="T:System.Runtime.InteropServices.COMException">If the SendMessage method returns an error</exception>
            <exception cref="T:System.ArgumentNullException">If window handle is null</exception>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32Wrap.CreateMutex(System.String,System.Boolean)">
            <summary>
            Creates or opens a named or unnamed mutex object.
            </summary>
            <param name="mutexName">The name of the mutex object. The name is limited to MAX_PATH characters. Name comparison is case sensitive.</param>
            <param name="initialOwner">
            If this value is true and the caller created the mutex, the calling thread obtains initial ownership of the mutex object.
            Otherwise, the calling thread does not obtain ownership of the mutex.</param>
            <returns>A handle to a mutex object.</returns>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32Wrap.CreateMutex(System.String,System.Boolean@,System.Boolean)">
            <summary>
            Creates a mutex with the name specified and returns a handle to it.
            </summary>
            <param name="mutexName">The name of the mutex object. The name is case sensitive.</param>
            <param name="initialOwner">If the value is true the calling thread obtains initial ownership of the mutex object.</param>
            <param name="alreadyExists">Returns true if the mutex already existed, false otherwise</param>
            <returns>A handle to a mutex object.</returns>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32Wrap.WaitForSingleObject(System.IntPtr,System.UInt32)">
            <summary>
            Waits for the specified mutex and returns true if the mutex was signaled.
            </summary>
            <param name="mutex">The mutex reference to wait on, call CallCreateMutex to get it.</param>
            <param name="timeout">The time out in milliseconds to wait, if not specified wait forever.</param>
            <returns>
            True if the mutex was signaled, false if a timeout occurred or if the thread which owned
            this mutex released it.
            </returns>
            <exception cref="T:System.Runtime.InteropServices.COMException">If the function fails</exception>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32Wrap.ReleaseMutex(System.IntPtr)">
            <summary>
            Releases ownership of the specified mutex object.
            </summary>
            <param name="mutex">A handle to a mutex object.</param>
            <returns>True if the mutex was successfully closed.</returns>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32Wrap.CloseHandle(System.IntPtr)">
            <summary>CloseHandle() is a wrapper for
            <see cref="M:NationalInstruments.TestStand.Utility.Win32.CloseHandle(System.IntPtr)"/>.  It differs in two
            ways.  First, it takes care of checking the return value of
            Win32.CloseHandle() and throws an appropriate exception.
            This means that CloseHandle() will generally either return
            true or throw and exception.  The one exception to this rule
            is if <see cref="P:NationalInstruments.TestStand.Utility.Win32.INVALID_HANDLE_VALUE"/> is passed as
            the argument.  In this case, the wrapper function returns
            false immediately without ever invoking the Win32 method.
            </summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32Wrap.GetLongPathNameW(System.String)">
            <summary>GetLongPathNameW() is a wrapper for
            <see cref="M:NationalInstruments.TestStand.Utility.Win32.GetLongPathNameW(System.String,System.Text.StringBuilder,System.Int32)"/>
            that takes care of buffer sizing and converting Win32 error
            codes to exceptions.</summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32Wrap.GetLongPathNameW_Long(System.String)">
            <summary>GetLongPathNameW_Long() is a wrapper for
            <see cref="M:NationalInstruments.TestStand.Utility.Win32.GetLongPathNameW(System.String,System.Text.StringBuilder,System.Int32)"/>
            that takes care of all of the escaping for paths longer than
            MAX_PATH, as well as buffer sizing, and converting Win32 error
            codes to exceptions.</summary>
        </member>
        <member name="T:NationalInstruments.TestStand.Utility.Win32Wrap.FindFirstFileW_Wrapper">
            <summary>FindFirstFileW_Wrapper is a wrapper around the Win32
            FindFirstFileW() / FindNextFileW() / FindClose() functions.
            It manages the find handle returned by FindFirstFileW(),
            providing final clean-up via the IDisposable interface.
            Also, most error scenarios are mapped to appropriate .Net
            exceptions.  (ERROR_FILE_NOT_FOUND for FindFirstFileW()
            and ERROR_NO_MORE_FILES for FindNextFileW() are treated as
            status causing false to be returned.  These cases do not
            lead to exceptions.)
            To use FindFirstFileW_Wrapper, instantiate an empty instance
            using the no-arg constructor.  Initialize the wrapper by
            calling FindFirstFileW() on it, just as you would normally
            call FindFirstFileW().  Iterate through the found files by
            calling FindNextFileW() on the wrapper, just as you would
            normally call FindNextFileW().
            When you are done, you should call Dispose() to clean up.
            FindClose() has also been provided should you want to keep
            the wrapper around for later use without holding on to the
            current find handle.
            The wrapper can be reused as needed by calling FindFirstFileW().
            This will release the current find handle before reinitializing
            the wrapper.</summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32Wrap.FindFirstFileW_Wrapper.IsDots(System.String)">
            <summary>Tests if a directory is "." (the current directory)
            or ".." (the parent directory).  This is handy because
            FindFirstFileW() includes "." and ".." in its returned files
            when you ask for all files in a directory using the "*"
            pattern.</summary>
            <param name="fileName">The file name to test.  This is the
            simple file name, not the full path.</param>
            <returns>true if fileName is "." or "..", false
            otherwise.</returns>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32Wrap.FindFirstFileW_Wrapper.Finalize">
            <summary>Finalizer for FindFirstFileW_Wrapper.</summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32Wrap.FindFirstFileW_Wrapper.Dispose(System.Boolean)">
            <summary>Dispose helper method for disposable pattern
            described at
            http://msdn.microsoft.com/en-us/library/system.idisposable.dispose.aspx.
            </summary>
            <param name="disposing">true if Dispose(bool) is called from
            IDisposable.Dispose(),  false if Dispose(bool) is called from
            the finalizer.</param>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32Wrap.FindFirstFileW_Wrapper.FindClose">
            <summary>Close the current find handle, if any, associated
            with this wrapper.
            Normally you will not need to invoke FindClose().  You can
            call FindFirstFileW() to reinitialize the wrapper with a
            new set of files or Dispose() when you are done.
            FindClose() will throw an exception if it fails for any
            reason other than the current handle being
            INVALID_HANDLE_VALUE.</summary>
            <returns>true if the current handle was successfully closed,
            or false if the current handle is invalid.</returns>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32Wrap.FindFirstFileW_Wrapper.FindFirstFileW(System.String,NationalInstruments.TestStand.Utility.Win32.WIN32_FIND_DATAW@)">
            <summary>Closes the existing find handle, if any, and
            searches a directory for a file or subdirectory with a
            name that matches a specific name (or partial name if
            wildcards are used).
            For paths longer than MAX_PATH, see FindFirstFileW_Long().
            FindFirstFileW() will throw an appropriate exception if
            there is a problem closing the existing find handle (if
            present) or the underlying Win32 FindFirstFileW() call
            fails for any reason other than ERROR_FILE_NOT_FOUND.
            </summary>
            <param name="fileName">The directory or path, and the file
            name, which can include wildcard characters, for example,
            an asterisk (*) or a question mark (?).
            This parameter should not end in a trailing backslash (\).
            If the string ends with a wildcard, period (.), or directory
            name, the user must have access permissions to the root and
            all subdirectories on the path.
            To extend the path name limit beyond MAX_PATH to 32,767 wide
            characters, prepend "\\?\" to the path, or use
            FindFirstFileW_Long().</param>
            <param name="findFileData">A WIN32_FIND_DATAW structure that
            receives information about a found file or directory.</param>
            <returns>If the function succeeds, the return value is
            true and the findFileData parameter contains information
            about the next file or directory found. If no files are
            found, findFileData is left unchanged and false is returned.
            </returns>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32Wrap.FindFirstFileW_Wrapper.FindNextFileW(NationalInstruments.TestStand.Utility.Win32.WIN32_FIND_DATAW@)">
            <summary>Continues a file search from a previous call to the
            FindFirstFileW() or FindFirstFileW_Long() methods.</summary>
            <param name="findFileData">A WIN32_FIND_DATAW structure
            that receives information about the found file or
            subdirectory.
            FindNextFileW() throws an exception if it encounters an
            error other than reaching the end of the list.
            </param>
            <returns>If the function succeeds, the return value is
            true and the findFileData parameter contains information
            about the next file or directory found.  If there are no
            more files, findFileData is left unchanged and false is
            returned.</returns>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32Wrap.FindFirstFileW_Wrapper.FindFirstFileW_Long(System.String,NationalInstruments.TestStand.Utility.Win32.WIN32_FIND_DATAW@)">
            <summary>This function mimics the behavior of
            FindFirstFileW(), but works for paths longer than MAX_PATH.
            Note that paths longer than MAX_PATH cannot be relative and
            cannot contain wild cards, so we cannot truly duplicate the
            behavior of FindFirstFileW() for arbitrary paths.
            Note:  This method will escape any path you give it with "\\?\"
            (or "\\?\UNC\" if appropriate). You should not prepend the
            "\\?\" to the path yourself.</summary>
            <param name="fileName">The directory or path, and the file
            name.  The path must be absolute.  It cannot use forward
            slashes to represent path separators, a period to represent
            the current directory, or double dots to represent the parent
            directory.</param>
            <param name="findFileData">A WIN32_FIND_DATAW structure that
            receives information about a found file or directory.</param>
            <returns>true if at least one file was found, false if no
            files were found</returns>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32Wrap.FindFirstFileW_Wrapper.disposed">
            <summary>Set to true once Dispose() has been executed
            once.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32Wrap.FindFirstFileW_Wrapper.mFindHandle">
            <summary>The current find handle we are iterating
            over.</summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32Wrap.CreateFileW(System.String,NationalInstruments.TestStand.Utility.Win32.FileAccess,NationalInstruments.TestStand.Utility.Win32.FileShare,System.IntPtr,NationalInstruments.TestStand.Utility.Win32.CreationDisposition,NationalInstruments.TestStand.Utility.Win32.FileAttributes,System.IntPtr)">
            <summary>CreateFileW() is a wrapper for
            <see cref="M:NationalInstruments.TestStand.Utility.Win32.CreateFileW(System.String,NationalInstruments.TestStand.Utility.Win32.FileAccess,NationalInstruments.TestStand.Utility.Win32.FileShare,System.IntPtr,NationalInstruments.TestStand.Utility.Win32.CreationDisposition,NationalInstruments.TestStand.Utility.Win32.FileAttributes,System.IntPtr)"/>
            that takes care of converting Win32 error codes to exceptions.
            </summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32Wrap.CreateDirectoryW(System.String,System.IntPtr)">
            <summary>CreateDirectoryW() is a wrapper for
            <see cref="M:NationalInstruments.TestStand.Utility.Win32.CreateDirectoryW(System.String,System.IntPtr)"/>
            that takes care of converting Win32 error codes to exceptions.
            </summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32Wrap.CreateFileW_Long(System.String,NationalInstruments.TestStand.Utility.Win32.FileAccess,NationalInstruments.TestStand.Utility.Win32.FileShare,System.IntPtr,NationalInstruments.TestStand.Utility.Win32.CreationDisposition,NationalInstruments.TestStand.Utility.Win32.FileAttributes,System.IntPtr)">
            <summary>CreateFileW_Long() is a wrapper for
            <see cref="M:NationalInstruments.TestStand.Utility.Win32.CreateFileW(System.String,NationalInstruments.TestStand.Utility.Win32.FileAccess,NationalInstruments.TestStand.Utility.Win32.FileShare,System.IntPtr,NationalInstruments.TestStand.Utility.Win32.CreationDisposition,NationalInstruments.TestStand.Utility.Win32.FileAttributes,System.IntPtr)"/>
            that takes care of converting Win32 error codes to exceptions.
            It also escapes the fileName argument with the appropriate
            long path prefix (\\?\ or \\?\UNC\).</summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32Wrap.CreateDirectoryW_Long(System.String,System.IntPtr)">
            <summary>CreateDirectoryW_Long() is a wrapper for
            <see cref="M:NationalInstruments.TestStand.Utility.Win32.CreateDirectoryW(System.String,System.IntPtr)"/>
            that takes care of converting Win32 error codes to exceptions.
            It also escapes the fileName argument with the appropriate
            long path prefix (\\?\ or \\?\UNC\).</summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32Wrap.GetFileSizeEx(System.IntPtr)">
            <summary>GetFileSizeEx() is a wrapper for
            <see cref="M:NationalInstruments.TestStand.Utility.Win32.GetFileSizeEx(System.IntPtr,System.Int64@)"/>
            that takes care of converting Win32 error codes to exceptions.
            </summary>
            <returns>The 64-bit file size.</returns>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32Wrap.WriteFile(System.IntPtr,System.Byte[])">
            <summary>WriteFile() is a wrapper for
            <see cref="M:NationalInstruments.TestStand.Utility.Win32.WriteFile(System.IntPtr,System.Byte[],System.UInt32,System.UInt32@,System.IntPtr)"/>
            that takes care of converting Win32 error codes to exceptions.
            It also converts the output numberOfBytesWritten parameter to a
            return value and passes null for lpOverLapped for convenience.
            </summary>
            <param name="hFile">A handle to the file or I/O device (e.g.
            file, file stream, physical disk, etc.)</param>
            <param name="lpBuffer">A buffer containing the data to be written
            to the file or device.</param>
            <returns>The number of bytes to be written to the file or device.</returns>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32Wrap.GetFileSize(System.IntPtr)">
            <summary>GetFileSize() is a wrapper for
            <see cref="M:NationalInstruments.TestStand.Utility.Win32.GetFileSize(System.IntPtr,System.UInt32@)"/>
            that takes care of converting Win32 error codes to exceptions.
            It also handles the conversion of the 32-bit low and high sizes
            to a single 64-bit ulong return value.</summary>
            <returns>The 64-bit file size.</returns>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32Wrap.MoveFileExW(System.String,System.String,NationalInstruments.TestStand.Utility.Win32.MoveFileExFlags)">
            <summary>MoveFileExW() is a wrapper for
            <see cref="M:NationalInstruments.TestStand.Utility.Win32.MoveFileExW(System.String,System.String,NationalInstruments.TestStand.Utility.Win32.MoveFileExFlags)"/>
            that takes care of converting Win32 error codes to exceptions.
            </summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32Wrap.MoveFileExW_Long(System.String,System.String,NationalInstruments.TestStand.Utility.Win32.MoveFileExFlags)">
            <summary>MoveFileExW_Long() is a wrapper for
            <see cref="M:NationalInstruments.TestStand.Utility.Win32.MoveFileExW(System.String,System.String,NationalInstruments.TestStand.Utility.Win32.MoveFileExFlags)"/>
            that takes care of converting Win32 error codes to exceptions.
            It also escapes the existingFileName and newFileName arguments
            with the appropriate long path prefix (\\?\ or
            \\?\UNC\).</summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32Wrap.CopyFileW(System.String,System.String,System.Boolean)">
            <summary>CopyFileW() is a wrapper for
            <see cref="M:NationalInstruments.TestStand.Utility.Win32.CopyFileW(System.String,System.String,System.Boolean)"/>
            that takes care of converting Win32 error codes to exceptions.
            </summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32Wrap.CopyFileW_Long(System.String,System.String,System.Boolean)">
            <summary>CopyFileW_Long() is a wrapper for
            <see cref="M:NationalInstruments.TestStand.Utility.Win32.CopyFileW(System.String,System.String,System.Boolean)"/>
            that takes care of converting Win32 error codes to exceptions.
            It also escapes the existingFileName and newFileName arguments
            with the appropriate long path prefix (\\?\ or
            \\?\UNC\).</summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32Wrap.DeleteFileW(System.String)">
            <summary>DeleteFileW() is a wrapper for
            <see cref="M:NationalInstruments.TestStand.Utility.Win32.DeleteFileW(System.String)"/>
            that takes care of converting Win32 error codes to exceptions.
            </summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32Wrap.RemoveDirectoryW(System.String)">
            <summary>RemoveDirectoryW() is a wrapper for
            <see cref="M:NationalInstruments.TestStand.Utility.Win32.RemoveDirectoryW(System.String)"/>
            that takes care of converting Win32 error codes to exceptions.
            </summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32Wrap.DeleteFileW_Long(System.String)">
            <summary>DeleteFileW_Long() is a wrapper for
            <see cref="M:NationalInstruments.TestStand.Utility.Win32.DeleteFileW(System.String)"/>
            that takes care of converting Win32 error codes to exceptions.
            It also escapes the fileName argument with the appropriate
            long path prefix (\\?\ or \\?\UNC\).</summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32Wrap.RemoveDirectoryW_Long(System.String)">
            <summary>RemoveDirectoryW_Long() is a wrapper for
            <see cref="M:NationalInstruments.TestStand.Utility.Win32.RemoveDirectoryW(System.String)"/>
            that takes care of converting Win32 error codes to exceptions.
            It also escapes the fileName argument with the appropriate
            long path prefix (\\?\ or \\?\UNC\).</summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32Wrap.GetFileAttributesW(System.String)">
            <summary>
            GetFileAttributesW() is a wrapper for <see cref="M:NationalInstruments.TestStand.Utility.Win32.GetFileAttributesW(System.String)"/>
            that takes care of converting Win32 error codes to exceptions.
            </summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32Wrap.GetFileAttributesW_Long(System.String)">
            <summary>
            GetFileAttributesW_Long() is a wrapper for <see cref="M:NationalInstruments.TestStand.Utility.Win32.GetFileAttributesW(System.String)"/>
            that takes care of converting Win32 error codes to exceptions. It also escapes the path
            argument with the appropriate long path prefix (\\?\ or \\?\UNC\).
            </summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32Wrap.SetFileAttributesW(System.String,NationalInstruments.TestStand.Utility.Win32.FileAttributes)">
            <summary>
            SetFileAttributesW() is a wrapper for <see cref="M:NationalInstruments.TestStand.Utility.Win32.SetFileAttributesW(System.String,NationalInstruments.TestStand.Utility.Win32.FileAttributes)"/>
            that takes care of converting Win32 error codes to exceptions.
            </summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32Wrap.SetFileAttributesW_Long(System.String,NationalInstruments.TestStand.Utility.Win32.FileAttributes)">
            <summary>
            SetFileAttributesW_Long() is a wrapper for <see cref="M:NationalInstruments.TestStand.Utility.Win32.SetFileAttributesW(System.String,NationalInstruments.TestStand.Utility.Win32.FileAttributes)"/>
            that takes care of converting Win32 error codes to exceptions. It also escapes the path
            argument with the appropriate long path prefix (\\?\ or \\?\UNC\).
            </summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32Wrap.ThrowExceptionForLastError">
            <summary>This method calls
            <see cref="M:NationalInstruments.TestStand.Utility.Win32Wrap.ThrowExceptionForWin32Error(System.Int32)"/> on the return
            value of <see cref="M:System.Runtime.InteropServices.Marshal.GetLastWin32Error"/>.</summary>
        </member>
        <member name="T:NationalInstruments.TestStand.Utility.ITestStandLocalizable">
            <summary>
            Use the ITestStandLocalizable to allow a custom user control to be localizable.
            </summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.ITestStandLocalizable.Localize(NationalInstruments.TestStand.Interop.API.Engine,System.String)">
            <summary>
            When called, this method will localize the control that it is called in using the
            <paramref name="engine"/> and <paramref name="category"/>.
            </summary>
            <param name="engine">The engine used to localize</param>
            <param name="category">The category used to localize</param>
        </member>
        <member name="T:NationalInstruments.TestStand.Utility.Localizer">
            <summary>
            Use a localizer to localize the Text property of .net menu items or controls.
            </summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Localizer.#ctor(NationalInstruments.TestStand.Interop.API.Engine)">
            <summary>
            Creates a new Localizer object. Localizers created with this constructor do not localize all TestStand UI Controls when LocalizeForm is called.
            </summary>
            <param name="engine">
            The Localizer uses the TestStand engine you pass to obtain the localized text for menu items and controls.
            </param>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Localizer.#ctor(NationalInstruments.TestStand.Interop.UI.Ax.AxApplicationMgr)">
            <summary>
            Creates a new Localizer object.
            </summary>
            <param name="applicationMgr">
            The Localizer uses the TestStand ApplicationMgr you pass to obtain the localized text for menu items and controls.
            </param>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Localizer.#ctor(NationalInstruments.TestStand.Interop.UI.ApplicationMgr)">
            <summary>
            Creates a new Localizer object.
            </summary>
            <param name="applicationMgr">
            The Localizer uses the TestStand ApplicationMgr you pass to obtain the localized text for menu items and controls.
            </param>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Localizer.#ctor(NationalInstruments.TestStand.Interop.API.Engine,NationalInstruments.TestStand.Interop.UI.Ax.AxApplicationMgr)">
            <summary>
            Creates a new Localizer object.
            </summary>
            <param name="engine">
            The Localizer uses the TestStand engine you pass to obtain the localized text for menu items and controls.
            </param>
            <param name="applicationMgr">
            The Localizer uses the ApplicationMgr you pass to localize text for the TestStand User Interface controls. You can pass null to this parameter if you do not wish to localize UI controls.
            </param>
        </member>
        <member name="P:NationalInstruments.TestStand.Utility.Localizer.Engine">
            <remarks>
            Returns the Engine with which the Localize was constructed.
            </remarks>
        </member>
        <member name="P:NationalInstruments.TestStand.Utility.Localizer.ApplicationMgr">
            <remarks>
            Returns the ApplicationMgr with which the Localizer was constructed. Obsolete, use GetApplicationMgr instead.
            </remarks>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Localizer.GetApplicationMgr">
            <remarks>
            Returns the ApplicationMgr with which the Localizer was constructed.
            </remarks>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Localizer.LocalizeControls(System.Windows.Forms.Control.ControlCollection,System.String)">
            <summary>
            Localize the collection of controls in <paramref name="controls"/> with the string in
            <paramref name="category"/>
            </summary>
            <param name="controls">The controls collection to localize</param>
            <param name="category">The category to localize with</param>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Localizer.LocalizeForm(System.Windows.Forms.Form,System.String,System.Boolean)">
            <summary><para>This method localizes the text on a form to the current language the TestStand language setting selects.</para>
                <para>For each control on a form, this method uses the value of the Control.Text property as a tag to obtain a localized string from the TestStand string resource category you specify. If a localized string with that tag exists, the method replaces the value of the Control.Text property with the localized string. If the tag does not exist, the method does not alter the control text.</para>
                <para>The method also localizes controls that reside within other controls or tab pages.</para>
            </summary>
            <param name="form">Pass the form to localize.
            </param>
            <param name="category">Pass the category name of the TestStand string resource section that contains the localized strings for the form.
            </param>
            <param name="localizeMenu">Pass true to localize the menu item text for the items in the menu bar of the form.
            </param>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Localizer.LocalizeMenu(System.Windows.Forms.Menu,System.String)">
            <summary>
                <para>This method localizes the menu item text to the current language the TestStand language setting selects.</para>
                <para>For each item in a menu, this method uses the value of the MenuItem.Text property as a tag to obtain a localized string from the TestStand string resource category you specify. If a localized string with that tag exists, the method replaces the value of the MenuItem.Text property with the localized string. If the tag does not exist, the method does not alter the menu item text.</para>
                <para>The method also localizes menu items that reside within sub-menus.</para>
            </summary>
            <param name="menu">Pass the menu to localize.
            </param>
            <param name="category">Pass the category name of the TestStand string resource section that contains the localized strings for the menu.
            </param>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Localizer.LocalizeContextMenu(System.Windows.Forms.ContextMenuStrip,System.String)">
            <summary>
            Localizes the text in all menu items for a context menu strip to the current language the
            TestStand language setting selects. For each menu item this method uses the value of the menu
            item Text property as a tag to obtain a localized string from the string from the TestStand
            string resource category you specify. If a localized string with that tag exists, the method
            replaces the value of the Control.Text property with the localized string; if the tag does
            not exist, the method does not alter the control text.
            </summary>
            <param name="menu">Pass the context menu strip to localize</param>
            <param name="category">
            Pass the category name of the TestStand string resource section that contains the localized
            strings for the form.
            </param>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Localizer.LocalizeNotifyIcon(System.Windows.Forms.NotifyIcon,System.String)">
            <summary>
            Localizes the text in a notify icon for a context menu strip to the current language the
            TestStand language setting selects. For each menu item in the context menu strip this
            method uses the value of the menu item Text property as a tag to obtain a localized string
            from the string from the TestStand string resource category you specify. If a localized
            string with that tag exists, the method replaces the value of the Control.Text property
            with the localized string; if the tag does not exist, the method does not alter the control
            text.
            </summary>
            <param name="icon">Pass the notify icon to localize</param>
            <param name="category">
            Pass the category name of the TestStand string resource section that contains the localized
            strings for the form.
            </param>
        </member>
        <member name="T:NationalInstruments.TestStand.Utility.Tiler">
            <remarks>
            You can use this class for tiling forms or other objects when the Form.LayoutMdi method is not adequate or applicable
            </remarks>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Tiler.#ctor">
            <summary>
            Use a Tiler object to layout windows or other objects in a square or nearly square grid
            </summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Tiler.SetNumTiles(System.Int32)">
            <summary>
            Specificies the number of tiles to partition into a square or nearly square grid
            </summary>
            <param name="numTiles">The number of tiles to layout in a grid</param>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Tiler.GetTilePosition(System.Int32,System.Int32@,System.Int32@)">
            <summary>
            Returns the tile coordinates of a specified tile in the grid of tiles
            </summary>
            <param name="tileIndex">the index of a tile, from 0 to (number-of-tiles - 1)</param>
            <param name="x">returns the x position of the tile, from 0 to (max-number-of-tiles-in-a-row - 1)</param>
            <param name="y">returns the y position of the tile, from 0 to (max-number-of-tiles-in-a-column - 1)</param>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Tiler.TileWindows(System.Collections.ICollection,System.Drawing.Rectangle)">
            <summary>
            Lays out a collection of forms in a grid within the specified bounds
            </summary>
            <param name="forms">a collection of forms</param>
            <param name="bounds">the rectangle within which to layout the forms</param>
        </member>
        <member name="T:NationalInstruments.TestStand.Utility.LayoutPersister">
            <remarks>
            You can use this class for saving and loading control bounds or sizes to/from a TestStand application's configuration file.
            </remarks>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.LayoutPersister.SaveSizes(NationalInstruments.TestStand.Interop.UI.Ax.AxApplicationMgr,System.Windows.Forms.Control[])">
            <summary>
            Saves the height and width for each of the specified controls into a TestStand application's configuration file.
            </summary>
            <param name="applicationMgr">Pass the ApplicationMgr control for the application</param>
            <param name="controls">Pass any number of controls</param>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.LayoutPersister.SaveSizes(NationalInstruments.TestStand.Interop.UI.Ax.AxApplicationMgr,System.String,System.Windows.Forms.Control[])">
            <summary>
            Saves the height and width for each of the specified controls into a TestStand application's configuration file. This overload let you specify the name of the configuration file property that stores the information.
            </summary>
            <param name="applicationMgr">Pass the ApplicationMgr control for the application</param>
            <param name="configurationPropertyName">Pass the name of the configuration file subproperty that stores the information</param>
            <param name="controls">Pass any number of controls</param>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.LayoutPersister.SaveBounds(NationalInstruments.TestStand.Interop.UI.Ax.AxApplicationMgr,System.Windows.Forms.Control[])">
            <summary>
            Saves the bounds for each of the specified controls into a TestStand application's configuration file.
            </summary>
            <param name="applicationMgr">Pass the ApplicationMgr control for the application</param>
            <param name="controls">Pass any number of controls</param>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.LayoutPersister.SaveBounds(NationalInstruments.TestStand.Interop.UI.Ax.AxApplicationMgr,System.String,System.Windows.Forms.Control[])">
            <summary>
            Saves the bounds for each of the specified controls into a TestStand application's configuration file. This overload let you specify the name of the configuration file property that stores the information.
            </summary>
            <param name="applicationMgr">Pass the ApplicationMgr control for the application</param>
            <param name="configurationPropertyName">Pass the name of the configuration file subproperty that stores the information</param>
            <param name="controls">Pass any number of controls</param>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.LayoutPersister.LoadSizes(NationalInstruments.TestStand.Interop.UI.Ax.AxApplicationMgr,System.Windows.Forms.Control[])">
            <summary>
            Loads the height and width for each of the specified controls into a TestStand application's configuration file. You must call LoadSizes and SaveSizes with the same set of controls in the same order.
            </summary>
            <param name="applicationMgr">Pass the ApplicationMgr control for the application</param>
            <param name="controls">Pass any number of controls</param>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.LayoutPersister.LoadSizes(NationalInstruments.TestStand.Interop.UI.Ax.AxApplicationMgr,System.String,System.Windows.Forms.Control[])">
            <summary>
            Loads the height and width for each of the specified controls into a TestStand application's configuration file. You must call LoadSizes and SaveSizes with the same set of controls in the same order. This overload let you specify the name of the configuration file property that stores the information.
            </summary>
            <param name="applicationMgr">Pass the ApplicationMgr control for the application</param>
            <param name="configurationPropertyName">Pass the name of the configuration file subproperty that stores the information</param>
            <param name="controls">Pass any number of controls</param>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.LayoutPersister.LoadBounds(NationalInstruments.TestStand.Interop.UI.Ax.AxApplicationMgr,System.Windows.Forms.Control[])">
            <summary>
            Loads the bounds for each of the specified controls into a TestStand application's configuration file. You must call LoadBounds and SaveBounds with the same set of controls in the same order.
            </summary>
            <param name="applicationMgr">Pass the ApplicationMgr control for the application</param>
            <param name="controls">Pass any number of controls</param>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.LayoutPersister.LoadBounds(NationalInstruments.TestStand.Interop.UI.Ax.AxApplicationMgr,System.String,System.Windows.Forms.Control[])">
            <summary>
            Loads the bounds for each of the specified controls into a TestStand application's configuration file. You must call LoadBounds and SaveBounds with the same set of controls in the same order. This overload let you specify the name of the configuration file property that stores the information.
            </summary>
            <param name="applicationMgr">Pass the ApplicationMgr control for the application</param>
            <param name="configurationPropertyName">Pass the name of the configuration file subproperty that stores the information</param>
            <param name="controls">Pass any number of controls</param>
        </member>
        <member name="T:NationalInstruments.TestStand.Utility.Splitters">
            <remarks>
            You can use this class to simplify the implementation of splitter bars when using the border properties of TestStand UI Controls.
            </remarks>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Splitters.DragSplitter(System.Windows.Forms.Control,System.Windows.Forms.Control,System.Int32,System.Int32,System.Int32,System.Int32,System.Int64)">
            <summary>
            Call this method from the BorderDragged event for a TestStand control that has a drag border enabled in order to resize the control that owns the drag border and
            the control that shares the area split by the border. This method has been tested only with one or fewer borders per control. It may require modification for use with more than one border per control.
            /// </summary>
            <param name="master">Pass the control that receives the BorderDragged event.</param>
            <param name="slave">Pass the control that shares the area split by the drag border of the master control.</param>
            <param name="newX">Pass the value of newX received in the BorderDragged event handler.</param>
            <param name="newY">Pass the value of newY received in the BorderDragged event handler.</param>
            <param name="newWidth">Pass the value of newWidth received in the BorderDragged event handler.</param>
            <param name="newHeight">Pass the value of newHeight received in the BorderDragged event handler.</param>
            <param name="bordersChanged">Pass the value of bordersChanged received in the BorderDragged event handler.</param>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Splitters.DivideSpaceBetweenPanes(System.Boolean,System.Int32,System.Int32,System.Windows.Forms.Control[])">
            <summary>
            Call this method to divide an area between two or more panes. If the area is larger or smaller than the current sum of the pane sizes, the available
            area is distributed among the open panes in proportion to their current relative sizes.
            This method has been tested only with one or fewer borders per control. It may require modification for use with more than one border per control.
            /// </summary>
            <param name="verticalSplitter">Pass true if the controls are separated by vertical drag borders that divide a horizontal space. Pass false if the controls are separated by horizontal drag borders that divide a vertical space.</param>
            <param name="spaceStart">Pass the start of area that the panes share. If the splitters are vertical, pass the X coordinate for the start of the area. If the splitters are horizontal, pass the Y coordinate for the start of the area.</param>
            <param name="spaceEnd">Pass the end of area that the panes share. If the splitters are vertical, pass the X coordinate for the end of the area. If the splitters are horizontal, pass the Y coordinate for the end of the area.</param>
            <param name="panes">Pass the controls that share the specified area. For vertical splitters, pass the controls in order from left to right. For horizontal splitters, pass the controls in order from top to bottom.</param>
        </member>
        <member name="T:NationalInstruments.TestStand.Utility.ErrorMessage">
            <remarks>
            Use this class to help format error messages
            </remarks>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.ErrorMessage.AppendCodeAndDescription(NationalInstruments.TestStand.Interop.UI.Ax.AxApplicationMgr,System.String,System.Int64)">
            <summary>
            Returns the errorString with the error code and code description appended to it if the code is a TestStand error code.
            </summary>
            <param name="applicationMgr">Pass the ApplicationMgr control for the application</param>
            <param name="errorMessage">Pass the error message</param>
            <param name="errorCode">Pass the error code</param>
        </member>
        <member name="T:NationalInstruments.TestStand.Utility.ApplicationWrapper">
            <remarks>
            This class exists to provide an exception suppressing wrapper around System.Windows.Forms.Application.Run
            </remarks>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.ApplicationWrapper.Run(System.Windows.Forms.Form)">
            <remarks>
            This method is identical to System.Windows.Forms.Application.Run() except that it suppresses a harmless exception that can occur during dll unloading if the application exited while
            a menu is open. The error occurs only in a very specific interaction between Windows forms, Windows timer messages, and COM components. This is a simple workaround.
            </remarks>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.ApplicationWrapper.Run(System.Windows.Forms.ApplicationContext)">
            <remarks>
            This method is identical to System.Windows.Forms.Application.Run() except that it suppresses a harmless exception that can occur during dll unloading if the application exited while
            a menu is open. The error occurs only in a very specific interaction between Windows forms, Windows timer messages, and COM components. This is a simple workaround.
            </remarks>
        </member>
        <member name="T:NationalInstruments.TestStand.Utility.LaunchTestStandApplicationInNewDomain">
            <remarks>
            You can use this class to launch the application in a separate AppDomain. This class ensures
            that the TestStand Engine is destructed after the application exits so that the Engine does
            not report incorrect object leaks.
            </remarks>
        </member>
        <member name="T:NationalInstruments.TestStand.Utility.LaunchTestStandApplicationInNewDomain.MainEntryPointDelegate">
            <summary>
            Delegate for the main entry point to the application.
            </summary>
        </member>
        <member name="T:NationalInstruments.TestStand.Utility.LaunchTestStandApplicationInNewDomain.MainEntryPointDelegateWithArgs">
            <summary>
            Delegate for the main entry point to the application with command-line arguments
            </summary>
        </member>
        <member name="T:NationalInstruments.TestStand.Utility.LaunchTestStandApplicationInNewDomain.MainEntryPointDelegateWithArgsReturnCode">
            <summary>
            Delegate for the main entry point to the application with command-line arguments and a return code.
            </summary>
            <returns></returns>
        </member>
        <member name="T:NationalInstruments.TestStand.Utility.LaunchTestStandApplicationInNewDomain.DisplayErrorMessageDelegate">
            <summary>
            Delegate for displaying error messages from the LaunchProtected method
            </summary>
            <param name="caption">Receives the caption that should be displayed in the message</param>
            <param name="message">Receives the error message to display</param>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.LaunchTestStandApplicationInNewDomain.Launch(NationalInstruments.TestStand.Utility.LaunchTestStandApplicationInNewDomain.MainEntryPointDelegateWithArgs,System.String[])">
            <summary>
            Launches the application in a new AppDomain. This method can throw exceptions when using
            an old 32-bit Engine. Use LaunchProtected instead.
            </summary>
            <param name="entryPoint">Pass the main entry point to the application</param>
            <param name="args">Command-line arguments</param>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.LaunchTestStandApplicationInNewDomain.Launch(NationalInstruments.TestStand.Utility.LaunchTestStandApplicationInNewDomain.MainEntryPointDelegate)">
            <summary>
            Launches the application in a new AppDomain. This method can throw exceptions when using
            an old 32-bit Engine. Use LaunchProtected instead.
            </summary>
            <param name="entryPoint">Pass the main entry point to the application</param>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.LaunchTestStandApplicationInNewDomain.LaunchProtected(NationalInstruments.TestStand.Utility.LaunchTestStandApplicationInNewDomain.MainEntryPointDelegateWithArgs,System.String[],System.String,NationalInstruments.TestStand.Utility.LaunchTestStandApplicationInNewDomain.DisplayErrorMessageDelegate,System.Boolean)">
            <summary>
            Launches the application in a new AppDomain. If the engine cannot be created displays
            an error message. Handles the specific case that the engine cannot be created in
            process because a version of TestStand that is only 32-bit is active and this
            application is 64-bit.
            </summary>
            <param name="entryPoint">Pass the main entry point to the application</param>
            <param name="applicationName">The name of the application to display in an error message in case of errors.</param>
            <param name="args">Pass the arguments expected by the <paramref name="entryPoint"/> method.</param>
            <param name="displayErrorMessage">Pass the method to use if an error message needs to be displayed</param>
            <param name="parseArgs">Pass true to enable the application to parse TestStand specific arguments, such as the "/env" flag, from the command line. Pass false if your application handles all command line arguments manually</param>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.LaunchTestStandApplicationInNewDomain.LaunchProtected(NationalInstruments.TestStand.Utility.LaunchTestStandApplicationInNewDomain.MainEntryPointDelegate,System.String,NationalInstruments.TestStand.Utility.LaunchTestStandApplicationInNewDomain.DisplayErrorMessageDelegate)">
            <summary>
            Launches the application in a new AppDomain. If the engine cannot be created displays
            an error message. Handles the specific case that the engine cannot be created in
            process because a version of TestStand that is only 32-bit is active and this
            application is 64-bit.
            </summary>
            <param name="entryPoint">Pass the main entry point to the application</param>
            <param name="applicationName">The name of the application to display in an error message in case of errors.</param>
            <param name="displayErrorMessage">Pass the method to use if an error message needs to be displayed</param>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.LaunchTestStandApplicationInNewDomain.LaunchProtectedReturnCode(NationalInstruments.TestStand.Utility.LaunchTestStandApplicationInNewDomain.MainEntryPointDelegateWithArgsReturnCode,System.String[],System.String,NationalInstruments.TestStand.Utility.LaunchTestStandApplicationInNewDomain.DisplayErrorMessageDelegate,System.Boolean)">
            <summary>
            Launches the application in a new AppDomain. If the engine cannot be created displays
            an error message. Handles the specific case that the engine cannot be created in process
            because a version of TestStand that is only 32-bit is active and this application
            is 64-bit. Will return the return code given by entryPoint. If the Application cannot
            be run or unloaded appropriately, this method will return the code -1000.
            </summary>
            <param name="entryPoint"></param>
            <param name="args"></param>
            <param name="applicationName"></param>
            <param name="displayErrorMessage"></param>
            <param name="parseArgs">Pass true to enable the application to parse TestStand specific arguments, such as the "/env" flag, from the command line. Pass false if your application handles all command line arguments manually</param>
            <returns></returns>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.LaunchTestStandApplicationInNewDomain.SetEngineEnvironment(System.String)">
            <summary>
            Initialize the environment using the provided path. This method must be called before creating an instance of the TestStand engine.
            </summary>
            <param name="engineEnvironmentPath"></param>
        </member>
        <member name="T:NationalInstruments.TestStand.Utility.LongPath">
            <summary>
            This is a utilitiy class to help work with path names greater than
            MAX_PATH.
            </summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.LongPath.DirectorySeparatorChar">
            <summary>Provided for convenience.  <see cref="F:System.IO.Path.DirectorySeparatorChar"/></summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.LongPath.AltDirectorySeparatorChar">
            <summary>Provided for convenience.  <see cref="F:System.IO.Path.AltDirectorySeparatorChar"/></summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.LongPath.VolumeSeparatorChar">
            <summary>Provided for convenience.  <see cref="F:System.IO.Path.VolumeSeparatorChar"/></summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.LongPath.IsPathRooted(System.String)">
            <summary>Provided for convenience.  <see cref="M:System.IO.Path.IsPathRooted(System.String)"/></summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.LongPath.UsesDriveLetter(System.String)">
            <summary>Very simple check to see if the path begins with a drive letter (e.g. "C:").
            Because UsesDriveLetter() is an internal helper function, it does not normalize the path.  You must
            do that if you want to.</summary>
            <param name="path">The path to evaluate.</param>
            <returns>true if path begins with a drive letter; false otherwise.</returns>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.LongPath.IsAbsolute(System.String)">
            <summary>Checks if the path is absolute.
            Because InAbsolute() is an internal helper function, it does not normalize the path.  You must do that
            if you want to.</summary>
            <param name="path">The path to evaluate.</param>
            <returns>true if path is absolute; false otherwise.</returns>
        </member>
        <member name="T:NationalInstruments.TestStand.Utility.LongPath.PathNotAbsoluteException">
            <summary>Long paths cannot be relative.  This exception is thrown when one of our path functions
            encounters a relative path.
            See also http://msdn.microsoft.com/en-us/library/windows/desktop/aa365247.aspx
            </summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.LongPath.PathNotAbsoluteException.#ctor">
            <summary>Construct a new PathNotAbsoluteException.</summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.LongPath.CheckAndNormalizePath(System.String,System.String,System.Boolean)">
             <summary>This is a helper function for methods such as
             <see cref="M:NationalInstruments.TestStand.Utility.LongPath.GetPathRoot(System.String)"/> and
             <see cref="M:NationalInstruments.TestStand.Utility.LongPath.GetDirectoryName(System.String)"/>.
             It checks for conditions that the C# documentation
             specifies lead to argument exceptions.  It also performs
             normalization. I found when reverse engineering some of the C#
             path methods that they were implicitly normalizing path
             arguments in multiple ways:
             1.  They trim leading and trailing whitespace.
             2.  They replace all slashes with backslashes.
             3.  Runs of consecutive directory separators are coalesced.
             This method performs said normalization.
             In addition, this method will optionally evaluate "." and ".." chacters.  Note that doing so requires
             path be absolute.  If collapseDots is true and path is relative, a PathNotAbsoluteException is thrown.
             Checking and normalization are combined because some of the
             checking needs to happen before and some after
             normalization.</summary>
             <param name="path">The path to normalize.</param>
             <param name="paramName">The name of the paramter (to use with exceptions.)</param>
             <param name="collapseDots">Evaluate the ".." and "." chacters in the specified path.</param>
             <returns>A normalized version of the path.</returns>
             <exception cref="T:System.ArgumentException">If the path is empty,
             contains invalid path characters, or is not of legal
             form.</exception>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.LongPath.GetDirectoryName(System.String)">
            <summary>This function mimics the behavior of
            <see cref="M:System.IO.Path.GetDirectoryName(System.String)"/>
            but works on paths longer than MAX_PATH.
            NOTE:  Every attempt was made to make this method match the
            behavior of Path.GetDirectoryName() as closely as possible,
            but the actual behavior of Path.GetDirectoryName() is more
            complex than documented at MSDN.  We had to reverse engineer
            the actual behavior for many cases.  Our implementation may
            miss some corner cases, particularly of the normalization
            process.  This implementation was tested and works for most
            reasonable cases.</summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.LongPath.GetFullPath(System.String)">
            <summary>This function mimics the behavior of
            <see cref="M:System.IO.Path.GetFullPath(System.String)"/> but works for
            paths longer than MAX_PATH.  Note that paths longer than
            MAX_PATH cannot be relative, so we cannot truly duplicate the
            behavior of Path.GetFullPath() for arbitrary paths.
            Note:  This method will escape any path you give it with "\\?\"
            (or "\\?\UNC\" if appropriate). You should not prepend the
            "\\?\" to the path yourself.</summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.LongPath.GetPathRoot(System.String)">
             <summary>This function mimics the behavior of
             <see cref="M:System.IO.Path.GetPathRoot(System.String)"/>
             but works on paths longer than MAX_PATH.
             NOTE:  Every attempt was made to make this method match the
             behavior of Path.GetPathRoot() as closely as possible,
             but the actual behavior of Path.GetPathRoot() is more
             complex than documented at MSDN.  We had to reverse engineer
             the actual behavior for many cases.  Our implementation may
             miss some corner cases, particularly of the normalization
             process.  This implementation was tested and works for most
             reasonable cases.</summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.LongPath.GetFileName(System.String)">
            <summary>
            Convenience method which calls into <see cref="M:System.IO.Path.GetFileName(System.String)"/>
            </summary>
            <param name="path">The path to get the file name for</param>
            <returns>The file name of the path passed as a parameter.</returns>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.LongPath.Combine(System.String,System.String)">
            <summary>
            Convenience method which calls <see cref="M:System.IO.Path.Combine(System.String,System.String)"/>
            </summary>
            <param name="path1">The first path to combine. </param>
            <param name="path2">The second path to combine. </param>
            <returns>
            The combined paths. If one of the specified paths is a zero-length string, this method
            returns the other path. If <paramref name="path2"/> contains an absolute path, this
            method returns <paramref name="path2"/>.
            </returns>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.LongPath.Combine(System.String[])">
            <summary>
            Convenience method which calls <see cref="M:System.IO.Path.Combine(System.String[])"/>.
            </summary>
            <param name="paths">An array of parts of the path.</param>
            <returns>The combined paths.</returns>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.LongPath.GetFileNameWithoutExtension(System.String)">
            <summary>
            Convenience method that calls <see cref="M:System.IO.Path.GetFileNameWithoutExtension(System.String)"/>
            </summary>
            <param name="path">The path of the file. </param>
            <returns>
            The string returned by <see cref="M:NationalInstruments.TestStand.Utility.LongPath.GetFileName(System.String)"/>, minus the last period (.) and all
            characters following it.
            </returns>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.LongPath.GetExtension(System.String)">
            <summary>
            Convenience method that calls <see cref="M:System.IO.Path.GetExtension(System.String)"/>
            </summary>
            <param name="path">The path of the file. </param>
            <returns>
            The extension of the specified path (including the period "."), or null, or
            String.Empty. If <paramref name="path"/> is null, GetExtension returns null. If
            <paramref name="path"/> does not have extension information, GetExtension returns
            <see cref="F:System.String.Empty"/>.
            </returns>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.LongPath.GetInvalidFileNameChars">
            <summary>
            Convenience method that calls <see cref="M:System.IO.Path.GetInvalidFileNameChars"/>
            </summary>
            <returns>An array containing the characters that are not allowed in file names.</returns>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.LongPath.GetInvalidPathChars">
            <summary>
            Convenience method that calls <see cref="M:System.IO.Path.GetInvalidPathChars"/>
            </summary>
            <returns>An array containing the characters that are not allowed in path names.</returns>
        </member>
        <member name="T:NationalInstruments.TestStand.Utility.LongFileInfo">
            <summary>
            This is a utility class to help work with path names greater than MAX_PATH
            </summary>
        </member>
        <member name="P:NationalInstruments.TestStand.Utility.LongFileInfo.FullName">
            <summary>
            The full path of the file
            </summary>
        </member>
        <member name="P:NationalInstruments.TestStand.Utility.LongFileInfo.Initialized">
            <summary>
            Whether the values have been initialized.
            </summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.LongFileInfo.Refresh">
            <summary>
            Refreshes the information in the long file info structure.
            </summary>
        </member>
        <member name="P:NationalInstruments.TestStand.Utility.LongFileInfo.Length">
            <summary>
            Gets the size, in bytes, of the current file.
            </summary>
            <returns>The size of the current file in bytes.</returns>
        </member>
        <member name="P:NationalInstruments.TestStand.Utility.LongFileInfo.CreationTime">
            <summary>
            The creation time of the file. Note that this value is initialized the first time it
            is read and it will not be refreshed unless you manually call refresh.
            </summary>
        </member>
        <member name="P:NationalInstruments.TestStand.Utility.LongFileInfo.LastAccessTime">
            <summary>
            The last time the file was accessed. Note that this value is initialized the first time
            it is read and it will not be refreshed unless you manually call refresh.
            </summary>
        </member>
        <member name="P:NationalInstruments.TestStand.Utility.LongFileInfo.LastWriteTime">
            <summary>
            The modification time of the file. Note that this value is initialized the first time
            it is read and it will not be refreshed unless you manually call refresh.
            </summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.LongFileInfo.#ctor(System.String)">
            <summary>
            Creates a new instance of LongFileInfo with the file specified by <paramref name="fileName"/>
            </summary>
            <param name="fileName">The path of the file</param>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.LongFileInfo.#ctor(System.String,NationalInstruments.TestStand.Utility.Win32.WIN32_FIND_DATAW)">
            <summary>
            Creates a new instance of LongFileInfo using the information contained in
            <paramref name="fileData"/> to get the date information.
            </summary>
            <param name="fullName">The path of the file</param>
            <param name="fileData">The data structure which contains the dates for the files</param>
        </member>
        <member name="T:NationalInstruments.TestStand.Utility.LongFile">
            <summary>This is a utilitiy class to help work with path names
            greater than MAX_PATH.</summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.LongFile.Exists(System.String)">
            <summary> This function mimics the behavior of
            <see cref="M:System.IO.File.Exists(System.String)"/>
            but works on paths longer than MAX_PATH.
            Note that paths longer than MAX_PATH cannot be relative,
            so we cannot duplicate the behavior of
            File.Exists() exactly.  This Exists() method requires
            an absolute path (even for short paths).
            Note:  This method will escape any path you give it with "\\?\"
            (or "\\?\UNC\" if appropriate). You should not prepend the
            "\\?\" to the path yourself.</summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.LongFile.Move(System.String,System.String)">
            <summary> This function mimics the behavior of
            <see cref="M:System.IO.File.Move(System.String,System.String)"/>
            but works on paths longer than MAX_PATH.  Note that paths longer
            than MAX_PATH cannot be relative, so we cannot duplicate
            the behavior of File.Move() exactly.  This Move() method requires
            an absolute path (even for short paths).  Also, the exception
            behavior is not identical to that specified in File.Move().
            You may get different types of
            <see cref="T:System.IO.IOException"/> than specified.  You may
            also get <see cref="T:System.ComponentModel.Win32Exception"/>.
            Note:  This method will escape any path you give it with "\\?\"
            (or "\\?\UNC\" if appropriate). You should not prepend the
            "\\?\" to the paths yourself.</summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.LongFile.Copy(System.String,System.String)">
             <summary> This function mimics the behavior of
             <see cref="M:System.IO.File.Copy(System.String,System.String)"/>
             but works on paths longer than MAX_PATH.  Note that paths longer
             than MAX_PATH cannot be relative, so we cannot duplicate
             the behavior of File.Copy() exactly.  This Copy() method requires
             an absolute path (even for short paths).  Also, the exception
             behavior is not identical to that specified in File.Copy().
             You may get different types of
             <see cref="T:System.IO.IOException"/> than specified.  You may
             also get <see cref="T:System.ComponentModel.Win32Exception"/>.
             Note:  This method will escape any path you give it with "\\?\"
             (or "\\?\UNC\" if appropriate). You should not prepend the
             "\\?\" to the paths yourself.</summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.LongFile.Copy(System.String,System.String,System.Boolean)">
             <summary> This function mimics the behavior of
             <see cref="M:System.IO.File.Copy(System.String,System.String,System.Boolean)"/>
             but works on paths longer than MAX_PATH.  Note that paths longer
             than MAX_PATH cannot be relative, so we cannot duplicate
             the behavior of File.Copy() exactly.  This Copy() method requires
             an absolute path (even for short paths).  Also, the exception
             behavior is not identical to that specified in File.Copy().
             You may get different types of
             <see cref="T:System.IO.IOException"/> than specified.  You may
             also get <see cref="T:System.ComponentModel.Win32Exception"/>.
             Note:  This method will escape any path you give it with "\\?\"
             (or "\\?\UNC\" if appropriate). You should not prepend the
             "\\?\" to the paths yourself.</summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.LongFile.Delete(System.String)">
             <summary> This function mimics the behavior of
             <see cref="M:System.IO.File.Delete(System.String)"/>
             but works on paths longer than MAX_PATH.  Note that paths longer
             than MAX_PATH cannot be relative, so we cannot duplicate
             the behavior of File.Delete() exactly.  This Delete() method
             requires an absolute path (even for short paths).  Also, the
             exception behavior is not identical to that specified in
             File.Delete().  You may get different types of
             <see cref="T:System.IO.IOException"/> than specified.  You may
             also get <see cref="T:System.ComponentModel.Win32Exception"/>.
             Note:  This method will escape any path you give it with "\\?\"
             (or "\\?\UNC\" if appropriate). You should not prepend the
             "\\?\" to the path yourself.</summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.LongFile.GetAttributes(System.String)">
            <summary>
            Gets the FileAttributes of the file on the <paramref name="path"/>.
            </summary>
            <param name="path">The path to the file.</param>
            <returns>The FileAttributes of the file on the path.</returns>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.LongFile.SetAttributes(System.String,NationalInstruments.TestStand.Utility.Win32.FileAttributes)">
            <summary>
            Sets the specified <paramref name="fileAttributes"/> of the file on the specified
            <paramref name="path"/>.
            </summary>
            <param name="path">The path to the file.</param>
            <param name="fileAttributes">A bitwise combination of the enumeration values.</param>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.LongFile.WriteAllText(System.String,System.String)">
            <summary>
            Creates a new file, writes the specified string to the file, and then closes the file.
            If the target file already exists, it is overwritten.
            </summary>
            <param name="path">The file to write to.</param>
            <param name="contents">The string to write to the file.</param>
        </member>
        <member name="T:NationalInstruments.TestStand.Utility.LongDirectory">
            <summary>
            This is a utilitiy class to help work with path names greater than
            MAX_PATH.
            </summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.LongDirectory.Exists(System.String)">
            <summary>
            This function mimics the behavior of
            <see cref="M:System.IO.Directory.Exists(System.String)"/>
            but works on paths longer than MAX_PATH.
            Note that paths longer than MAX_PATH cannot be relative,
            so we cannot duplicate the behavior of
            Directory.Exists() exactly.  This Exists() method requires
            an absolute path (even for short paths).
            Note:  This method will escape any path you give it with "\\?\"
            (or "\\?\UNC\" if appropriate). You should not prepend the
            "\\?\" to the paths yourself.</summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.LongDirectory.Delete(System.String,System.Boolean)">
            <summary>
            This function mimics the behavior of
            <see cref="M:System.IO.Directory.Delete(System.String,System.Boolean)"/>
            but works on paths longer than MAX_PATH.
            Note that paths longer than MAX_PATH cannot be relative,
            so we cannot duplicate the behavior of
            Directory.Delete() exactly.  This Delete() method requires
            an absolute path (even for short paths).
            Note:  This method will escape any path you give it with "\\?\"
            (or "\\?\UNC\" if appropriate). You should not prepend the
            "\\?\" to the paths yourself.</summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.LongDirectory.CreateDirectory(System.String)">
            <summary>This function mimics the behavior of
            <see cref="M:System.IO.Directory.CreateDirectory(System.String)"/>
            but works on paths longer than MAX_PATH.
            Note that paths longer than MAX_PATH cannot be relative,
            so we cannot duplicate the behavior of
            Directory.CreateDirectory() exactly.  This method requires
            an absolute path (even for short paths).
            Note:  This method will escape any path you give it with "\\?\"
            (or "\\?\UNC\" if appropriate). You should not prepend the
            "\\?\" to the paths yourself.
            </summary>
            <param name="path">The directory path to create.</param>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.LongDirectory.GetFiles(System.String)">
            <summary>This function mimics the behavior of
            <see cref="M:System.IO.Directory.GetFiles(System.String)"/>
            but works on paths longer than MAX_PATH.
            Note that paths longer than MAX_PATH cannot be relative,
            so we cannot duplicate the behavior of
            Directory.GetFiles() exactly.  This method requires
            an absolute path (even for short paths).
            Note:  This method will escape any path you give it with "\\?\"
            (or "\\?\UNC\" if appropriate). You should not prepend the
            "\\?\" to the paths yourself.
            </summary>
            <param name="path">The full path name of the directory to get
            files from.</param>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.LongDirectory.GetDirectories(System.String)">
            <summary>This function mimics the behavior of
            <see cref="M:System.IO.Directory.GetDirectories(System.String)"/>
            but works on paths longer than MAX_PATH.
            Note that paths longer than MAX_PATH cannot be relative,
            so we cannot duplicate the behavior of
            Directory.GetDirectories() exactly.  This method requires
            an absolute path (even for short paths).
            Note:  This method will escape any path you give it with "\\?\"
            (or "\\?\UNC\" if appropriate). You should not prepend the
            "\\?\" to the paths yourself.
            </summary>
            <param name="path">The full path name of the directory to get
            directories from.</param>
        </member>
    </members>
</doc>
Libs/HslCommunication.dll
Binary files differ
Libs/NationalInstruments.TestStand.Interop.API.dll
Binary files differ
Libs/NationalInstruments.TestStand.Interop.API.xml
New file
Diff too large
Libs/NationalInstruments.TestStand.Interop.AdapterAPI.dll
Binary files differ
Libs/NationalInstruments.TestStand.Interop.AdapterAPI.xml
New file
Diff too large
Libs/NationalInstruments.TestStand.Interop.SequenceAnalyzer.dll
Binary files differ
Libs/NationalInstruments.TestStand.Interop.SequenceAnalyzer.xml
New file
@@ -0,0 +1,744 @@
<?xml version="1.0"?><doc><members>
    <member name="T:NationalInstruments.TestStand.Interop.SequenceAnalyzer.ValidatePathOptions">
      <summary>Use this enumeration with the AnalysisUtilities.ValidatePath method.</summary>
      <seealso cref="AnalysisUtilities.ValidatePath" />
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.ValidatePathOptions.ValidatePathOption_NotRequiredForExecution">
      <summary>(Value: 0x4) Use this option to indicate that a file is not required for execution. If you use this option, the <c>AnalysisUtilities.ValidatePath</c> method generates a warning instead of an error if the file you specified is missing.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.ValidatePathOptions.ValidatePathOption_IsCommand">
      <summary>(Value: 0x8) Specifies that the path is an executable command. When you use this option and the path has no file extension, the <c>AnalysisUtilities.ValidatePath</c> method searches for files with the same basename that end in the <c>.exe</c>, <c>.com</c>, and <c>.bat</c> common command extensions.</summary>
      <seealso cref="AnalysisUtilities.ValidatePath" />
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.ValidatePathOptions.ValidatePathOption_NoOptions">
      <summary>(Value: 0x0) No options.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.ValidatePathOptions.ValidatePathOption_IgnoreAbsolutePath">
      <summary>(Value: 0x1) Specifies that the validation does not generate messages from the <c>NI_AbsolutePaths</c> rule. Pass this flag when you pass an absolute path to the AnalysisUtilities.ValidatePath method and do not want the validation to generate a message.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.ValidatePathOptions.ValidatePathOption_DoNotCheckIfExists">
      <summary>(Value: 0x2) Specifies that a path does not have to exist. You typically use this option when a path refers to a directory or the location of a file to create at run time.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.ValidatePathOptions.ValidatePathOption_DoNotAllowEmpty">
      <summary>(Value: 0x20) Specifies that empty paths are not allowed.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.ValidatePathOptions.ValidatePathOption_IsDirectory">
      <summary>(Value: 0x10) Specifies that the path is a directory.</summary>
    </member>
    <member name="T:NationalInstruments.TestStand.Interop.SequenceAnalyzer.RuleAnalysisDataScope">
      <summary>Use this enumeration with the AnalysisContext.GetRuleAnalysisData method.</summary>
      <seealso cref="AnalysisContext.GetRuleAnalysisData" />
      <seealso cref="AnalysisTransition" />
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.RuleAnalysisDataScope.RuleAnalysisDataScope_Global">
      <summary>(Value: 0) Specifies the rule analysis data that is global to the analysis session. The sequence analyzer creates the global data before the analysis begins and destroys it after the analysis completes.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.RuleAnalysisDataScope.RuleAnalysisDataScope_File">
      <summary>(Value: 1) Specifies the rule analysis data that is specific to the file being analyzed. The TestStand Sequence Analyzer creates the file data the first time you call the AnalysisContext.GetRuleAnalysisData method while analyzing the file and destroys it after the analysis of the file completes and after calling analysis modules for the after file transition. Do not use this option for the AnalysisTransition_BeforeSystem and AnalysisTransition_AfterSystem transitions.</summary>
    </member>
    <member name="T:NationalInstruments.TestStand.Interop.SequenceAnalyzer.ModuleAdapter">
      <summary></summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.ModuleAdapter.ModuleAdapter_DLL">
      <summary></summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.ModuleAdapter.ModuleAdapter_LabVIEW">
      <summary></summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.ModuleAdapter.ModuleAdapter_DotNet">
      <summary></summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.ModuleAdapter.ModuleAdapter_LabVIEWNXG">
      <summary></summary>
    </member>
    <member name="T:NationalInstruments.TestStand.Interop.SequenceAnalyzer.ModuleType">
      <summary></summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.ModuleType.ModuleType_RuleAnalysisModule">
      <summary></summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.ModuleType.ModuleType_RuleConfigurationModule">
      <summary></summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.ModuleType.ModuleType_RuleActionModule">
      <summary></summary>
    </member>
    <member name="T:NationalInstruments.TestStand.Interop.SequenceAnalyzer.MessageStatus">
      <summary></summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.MessageStatus.MessageStatus_Active">
      <summary></summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.MessageStatus.MessageStatus_Fixed">
      <summary></summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.MessageStatus.MessageStatus_Ignored">
      <summary></summary>
    </member>
    <member name="T:NationalInstruments.TestStand.Interop.SequenceAnalyzer.RuleSettingType">
      <summary></summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.RuleSettingType.RuleSettingType_Number">
      <summary></summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.RuleSettingType.RuleSettingType_String">
      <summary></summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.RuleSettingType.RuleSettingType_Boolean">
      <summary></summary>
    </member>
    <member name="T:NationalInstruments.TestStand.Interop.SequenceAnalyzer.ObjectKinds">
      <summary></summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.ObjectKinds.ObjectKind_Step">
      <summary></summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.ObjectKinds.ObjectKind_Sequence">
      <summary></summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.ObjectKinds.ObjectKind_SequenceLocal">
      <summary></summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.ObjectKinds.ObjectKind_SequenceParameter">
      <summary></summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.ObjectKinds.ObjectKind_SequenceFileGlobal">
      <summary></summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.ObjectKinds.ObjectKind_StationGlobal">
      <summary></summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.ObjectKinds.ObjectKind_TemplateItem">
      <summary></summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.ObjectKinds.ObjectKind_User">
      <summary></summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.ObjectKinds.ObjectKind_UserGroup">
      <summary></summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.ObjectKinds.ObjectKind_WorkspaceObject">
      <summary></summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.ObjectKinds.ObjectKind_SequenceFile">
      <summary></summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.ObjectKinds.ObjectKind_WorkspaceFile">
      <summary></summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.ObjectKinds.ObjectKind_ProjectFile">
      <summary></summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.ObjectKinds.ObjectKind_TypePalette">
      <summary></summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.ObjectKinds.ObjectKind_UsersFile">
      <summary></summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.ObjectKinds.ObjectKind_StationGlobalsFile">
      <summary></summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.ObjectKinds.ObjectKind_TemplatesFile">
      <summary></summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.ObjectKinds.ObjectKind_StepType">
      <summary></summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.ObjectKinds.ObjectKind_CustomDataType">
      <summary></summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.ObjectKinds.ObjectKind_BuiltinDataType">
      <summary></summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.ObjectKinds.ObjectKind_SubProperty">
      <summary></summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.ObjectKinds.ObjectKind_SkippedStep">
      <summary></summary>
    </member>
    <member name="T:NationalInstruments.TestStand.Interop.SequenceAnalyzer.RuleIds">
      <summary></summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.RuleIds.NI_InvalidPropertyValue">
      <summary></summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.RuleIds.NI_DynamicPropertyDoesNotExist">
      <summary></summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.RuleIds.NI_TypeVersionInvalid">
      <summary></summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.RuleIds.NI_ExpressionEvaluationError">
      <summary></summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.RuleIds.NI_FileNotFound">
      <summary></summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.RuleIds.NI_FileNotFoundWarning">
      <summary></summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.RuleIds.NI_ModuleLoadable">
      <summary></summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.RuleIds.NI_PrototypeCompatible">
      <summary></summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.RuleIds.NI_RemoteHostExists">
      <summary></summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.RuleIds.NI_BlockErrors">
      <summary></summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.RuleIds.NI_UnusedVariables">
      <summary></summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.RuleIds.NI_UnusedSequence">
      <summary></summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.RuleIds.NI_NormalRunMode">
      <summary></summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.RuleIds.NI_SequencePrototypeMatch">
      <summary></summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.RuleIds.NI_StepCount">
      <summary></summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.RuleIds.NI_SequenceCount">
      <summary></summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.RuleIds.NI_SequenceFileCount">
      <summary></summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.RuleIds.NI_FileByExpression">
      <summary></summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.RuleIds.NI_WatchExpressionsEnabled">
      <summary></summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.RuleIds.NI_AbsolutePaths">
      <summary></summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.RuleIds.NI_ValidPath">
      <summary></summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.RuleIds.NI_EscapeSequenceValid">
      <summary></summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.RuleIds.NI_RunStatePropertyDoesNotExist">
      <summary></summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.RuleIds.NI_InvalidEnumerationValue">
      <summary></summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.RuleIds.NI_CodeModuleOutOfDateWarning">
      <summary></summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.RuleIds.NI_ModuleLoadWarnings">
      <summary></summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.RuleIds.NI_LVChecksumInvalid">
      <summary></summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.RuleIds.NI_SuppressedEvaluationErrors">
      <summary></summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.RuleIds.NI_ModelSequenceCallResultsEnabled">
      <summary></summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.RuleIds.NI_PartialOutputArrayLogged">
      <summary></summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.RuleIds.NI_NotSupportedFeature">
      <summary></summary>
    </member>
    <member name="T:NationalInstruments.TestStand.Interop.SequenceAnalyzer.AnalysisUtilities">
      <summary>Use the objects of the <c>AnalysisUtilities</c> class in an analysis module to perform common analysis functions. Use the AnalysisContext.Utilities property to obtain an instance of this class.</summary>
      <seealso cref="AnalysisContext.Utilities" />
      <seealso cref="&quot;Creating Analysis Modules&quot;javascript:RefLink('/InfoTopics/SA_Creating_Analysis_Modules.htm')" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.SequenceAnalyzer.AnalysisUtilities.ValidateExpression(System.String,NationalInstruments.TestStand.Interop.API.PropertyObject,NationalInstruments.TestStand.Interop.API.APILocations,NationalInstruments.TestStand.Interop.API.EvaluationTypes,System.Int32,System.Object[],System.Int32)">
      <summary>Use this method in an analysis module to validate an expression. An analysis module can call this method to perform expression validation on any property that is not an instance of the Expression data type or to perform custom expression validation beyond syntax errors, such as type checking.
If the analysis module calls this method on expression properties within a step, the analysis module must set the AnalysisUtilities.AutomaticPropertyCheckingEnabled property to <c>False</c> to ensure that the sequence analyzer does not report duplicate messages, and the analysis module must perform all path and expression property checking for the step.
If the rules are enabled, this method reports analysis messages for the <c>NI_ExpressionEvaluationError</c>, <c>NI_DynamicPropertyDoesNotExist</c>, and <c>NI_EscapeSequenceValid</c> rules. This method also finds variables in the expression to determine which variables are used for the <c>NI_UnusedVariables</c> rule.
If you set the <c>AnalysisUtilities.AutomaticPropertyCheckingEnabled</c> property to <c>True</c>, the built-in analysis modules call this method with the evaluationFlags parameter set to ValidateExpressionOption_NoOptions for all properties of type Expression.</summary>
      <param name="expression">Pass the expression to validate.</param>
      <param name="baseLocation">Pass the base object to use with the apiLocation parameter as the location associated with any analysis messages this method reports.</param>
      <param name="apiLocation">Pass the APILocations enumeration to use as the location associated with any analysis messages this method reports. To use the baseLocation as the location, pass <c>APILocation_None</c>.</param>
      <param name="validTypes">Pass the type or types to which you expect the expression to evaluate.</param>
      <param name="evaluationOptions">Pass any combination of the EvaluationOptions constants. You do not need to pass the <c>EvalOption_DoNotAlterValues</c> constant because this method never changes values.</param>
      <param name="additionalConstants">Pass additional variables the expression might contain that are not part of the context. This parameter is useful if the expression contains a constant from an enumeration, such as a parameter value of a module call when the parameter type is an enumeration. You can pass <c>NULL</c> for this parameter if no additional constants you want to use exist when evaluating the expression.</param>
      <param name="evaluationFlags">Pass a combination of the ValidateExpressionOptions constants.</param>
      <seealso cref="&quot;ActiveXParameter.GetEnumValues&quot;javascript:APILink('/RefTopics/ActiveXParameter_GetEnumValues_M.htm')" />
      <seealso cref="&quot;ActiveXParameter.ValidEvaluationTypes&quot;javascript:APILink('/RefTopics/ActiveXParameter_ValidEvaluationTypes_P.htm')" />
      <seealso cref="AnalysisUtilities.AutomaticPropertyCheckingEnabled" />
      <seealso cref="&quot;APILocations&quot;javascript:APILink('/RefTopics/APILocations.htm')" />
      <seealso cref="&quot;CommonCParameter.GetEnumValues&quot;javascript:APILink('/RefTopics/CommonCParameter_GetEnumValues_M.htm')" />
      <seealso cref="&quot;CommonCParameter.ValidEvaluationTypes&quot;javascript:APILink('/RefTopics/CommonCParameter_ValidEvaluationTypes_P.htm')" />
      <seealso cref="&quot;DotNetParameter.GetEnumValues&quot;javascript:APILink('/RefTopics/DotNetParameter_GetEnumValues_M.htm')" />
      <seealso cref="&quot;DotNetParameter.ValidEvaluationTypes&quot;javascript:APILink('/RefTopics/DotNetParameter_ValidEvaluationTypes_P.htm')" />
      <seealso cref="&quot;EvaluationOptions&quot;javascript:APILink('/RefTopics/EvaluationOptions.htm')" />
      <seealso cref="&quot;LabVIEWParameter.GetEnumValues&quot;javascript:APILink('/RefTopics/LabVIEWParameter_GetEnumValues_M.htm')" />
      <seealso cref="&quot;LabVIEWParameter.ValidEvaluationTypes&quot;javascript:APILink('/RefTopics/LabVIEWParameter_ValidEvaluationTypes_P.htm')" />
      <seealso cref="&quot;LabVIEWParameterElement.GetEnumValues&quot;javascript:APILink('/RefTopics/LabVIEWParameterElement_GetEnumValues_M.htm')" />
      <seealso cref="&quot;LabVIEWParameterElement.ValidEvaluationTypes&quot;javascript:APILink('/RefTopics/LabVIEWParameterElement_ValidEvaluationTypes_P.htm')" />
      <seealso cref="&quot;SequenceCallParameter.ValidEvaluationTypes&quot;javascript:APILink('/RefTopics/SequenceCallParameter_ValidEvaluationTypes_P.htm')" />
      <seealso cref="ValidateExpressionOptions" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.SequenceAnalyzer.AnalysisUtilities.ValidatePath(System.String,NationalInstruments.TestStand.Interop.API.PropertyObject,NationalInstruments.TestStand.Interop.API.APILocations,System.Int32)">
      <summary>Use this method in an analysis module to validate a path. An analysis module can call this method to perform path validation on any property that is not an instance of the Path data type or to validate a path with a different validation option than the built-in analysis modules.
If the analysis module calls this method on path properties within a step, the analysis module must set the AnalysisUtilities.AutomaticPropertyCheckingEnabled property to <c>False</c> to ensure that the sequence analyzer does not report duplicate messages, and the analysis module must perform all path and expression property checking for the step
If the rules are enabled, this method reports analysis messages for the <c>NI_ValidPath</c> rule, the <c>NI_FileNotFoundWarning</c> rule, and the <c>NI_FileNotFound</c> rule.
If you set the <c>AnalysisUtilities.AutomaticPropertyCheckingEnabled</c> property to <c>True</c>, the built-in analysis modules call this method with the validationOptions parameter set to ValidatePathOption_DoNotCheckIfExists for all properties that use the Path type.
For path expression properties, analysis modules must instead call the AnalysisUtilities.ValidateExpression method and pass <c>ValidateExpressionOption_Path</c> for the evaluationFlags parameter.</summary>
      <param name="Path">Pass the path to validate. This path can be a relative or absolute path.</param>
      <param name="baseLocation">Pass the base object to use with the apiLocation parameter as the location associated with any analysis messages this method reports.</param>
      <param name="apiLocation">Pass the APILocations enumeration to use as the location associated with any analysis messages this method reports. To use the baseLocation as the location, pass <c>APILocation_None</c>.</param>
      <param name="validationOptions">Pass any of the ValidatePathOptions constants.</param>
      <seealso cref="AnalysisUtilities.AutomaticPropertyCheckingEnabled" />
      <seealso cref="AnalysisUtilities.ValidateExpression" />
      <seealso cref="&quot;APILocations&quot;javascript:APILink('/RefTopics/APILocations.htm')" />
      <seealso cref="ValidatePathOptions" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.SequenceAnalyzer.AnalysisUtilities.ValidateRemoteHost(System.String,NationalInstruments.TestStand.Interop.API.PropertyObject,NationalInstruments.TestStand.Interop.API.APILocations)">
      <summary>Use this method in an analysis module to validate whether a remote host can be located on the network. This method reports analysis messages for the <c>NI_RemoteHostExists</c> rule if the rule is enabled.</summary>
      <param name="remoteHost">Pass the name of the remote host to validate.</param>
      <param name="baseLocation">Pass the base object to use with the apiLocation parameter as the location associated with any analysis messages this method reports.</param>
      <param name="apiLocation">Pass the APILocations enumeration to use as the location associated with any analysis messages this method reports. To use the baseLocation as the location, pass <c>APILocation_None</c>.</param>
      <seealso cref="&quot;APILocations&quot;javascript:APILink('/RefTopics/APILocations.htm')" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.SequenceAnalyzer.AnalysisUtilities.AutomaticPropertyCheckingEnabled">
      <summary>Set this property to <c>False</c> in an analysis module to prevent the sequence analyzer built-in analysis modules from performing automatic checks on step properties that are instances of the Path and Expression data types. An analysis module typically sets this property to <c>False</c> when analyzing a step instance for a custom step type. The analysis module must perform all expression and path property checking for the step when you disable this property. The analysis module can perform more specific expression checking than the built-in analysis modules, including type validation, and can selectively analyze properties based on other property values.
The sequence analyzer automatically resets this property to <c>True</c> before analyzing each step. The sequence analyzer always checks all built-in expression and path properties, such as pre-expressions and preconditions, even if an analysis module sets this property to <c>False</c>.</summary>
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.SequenceAnalyzer.AnalysisUtilities.ValidateCodeModuleUpToDate(System.String,System.String,System.Boolean@,NationalInstruments.TestStand.Interop.API.APILocations,System.Int32)">
      <summary></summary>
      <param name="codeModulePath"></param>
      <param name="sourcePath"></param>
      <param name="baseLocation"></param>
      <param name="apiLocation"></param>
      <param name="reserved"></param>
    </member>
    <member name="T:NationalInstruments.TestStand.Interop.SequenceAnalyzer.AnalysisContext">
      <summary>Use the AnalysisContext class in an analysis module to access information about the current object being analyzed or about the current analysis transition. The TestStand Sequence Analyzer passes an instance of this class as a parameter to the analysis module.</summary>
      <seealso cref="&quot;Creating Analysis Modules&quot;javascript:RefLink('/InfoTopics/SA_Creating_Analysis_Modules.htm')" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.SequenceAnalyzer.AnalysisContext.Engine">
      <summary>Use this property in an analysis module to access methods and properties in the TestStand Engine class.</summary>
      <seealso cref="AnalysisContext.EditContext" />
      <seealso cref="&quot;TestStand Engine&quot;javascript:APILink('/RefTopics/Engine.htm')" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.SequenceAnalyzer.AnalysisContext.GetRuleConfiguration(System.String)">
      <summary>Use this method in an analysis module to obtain a rule configuration. A rule configuration contains the enabled state, severity, description, and other information for a specific rule.</summary>
      <remarks>The analysis project stores the rule configurations. Analysis modules must not modify rule configurations. Only rule configuration modules and the TestStand Sequence Analyzer should modify rule configurations.
To improve analysis performance, configure analysis modules to check the enabled state of the rule before performing checks or reporting messages for the rule.
This method returns <c>NULL</c> if the RuleId parameter is not a valid rule ID.</remarks>
      <param name="RuleId">Pass the unique rule ID of the rule.</param>
      <seealso cref="RuleConfigurationContext.RuleConfiguration" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.SequenceAnalyzer.AnalysisContext.GetRuleAnalysisData(System.String,NationalInstruments.TestStand.Interop.SequenceAnalyzer.RuleAnalysisDataScope,System.Int32)">
      <summary>Use this method in an analysis module to store and retrieve data to share among multiple calls to analysis modules.</summary>
      <remarks>The TestStand Sequence Analyzer creates empty PropertyObject containers for each rule to store data that analysis modules generate during analysis. Analysis modules use this method to obtain references to these containers. An analysis module can use the container to store and retrieve data associated with the rule, such as cumulative item counts. </remarks>
      <param name="RuleId">Pass the unique rule ID of the rule.</param>
      <param name="RuleAnalysisDataScope">Pass the scope of the data to access. Use file scope to access data associated with the file currently under analysis. The sequence analyzer destroys the file data when it completes the analysis of the file and after it calls the analysis modules for the After file transition. Use global scope to access data associated with the current analysis session. The sequence analyzer destroys the global data when analysis of the project completes.</param>
      <param name="options">Use one of the GetRuleAnalysisDataOptions. You must use the <c>GetRuleAnalysisDataOption_Lock</c> option if the analysis module modifies the rule analysis data.</param>
      <seealso cref="GetRuleAnalysisDataOptions" />
      <seealso cref="&quot;PropertyObject&quot;javascript:APILink('/RefTopics/PropertyObject.htm')" />
      <seealso cref="&quot;Relationships among AnalysisContext Transition, File, and Object Properties&quot;javascript:TSAnalyzer('/InfoTopics/TransitionRelationships.htm')" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.SequenceAnalyzer.AnalysisContext.NewMessage(System.String,System.String,NationalInstruments.TestStand.Interop.API.PropertyObject)">
      <summary>Use this method in an analysis module to create a new analysis message to report during analysis.</summary>
      <remarks>After you create the message you can modify the message properties. You must call the AnalysisContext.ReportMessage method after calling this method to report the message to the TestStand Sequence Analyzer, which adds the message to the analyzer project.</remarks>
      <param name="RuleId">Pass the unique rule ID of the rule to which the message corresponds.</param>
      <param name="messageText">Pass the message text. The sequence analyzer displays this text on the Analyzer Messages tab of the Analysis Results pane.</param>
      <param name="locationObject">Pass the object associated with the message. The sequence analyzer uses this object to initialize the AnalysisMessage.Locations property, which specifies the location that the sequence analyzer uses when you go to the location associated with a message. Pass <c>NULL</c> if no specific object exists.</param>
      <seealso cref="AnalysisMessage.Locations" />
      <seealso cref="&quot;Analysis Results&quot;javascript:RefLink('/InfoTopics/Pane_Analysis_Results.htm')" />
      <seealso cref="AnalysisContext.ReportMessage" />
      <seealso cref="&quot;Analyzer Messages tab&quot;javascript:RefLink('/InfoTopics/Pane_Analysis_Results_Msgs_Tab.htm')" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.SequenceAnalyzer.AnalysisContext.ReportMessage(NationalInstruments.TestStand.Interop.SequenceAnalyzer.AnalysisMessage)">
      <summary>Use this method in an analysis module to report and add an analysis message to the list of messages in the project.</summary>
      <remarks>Use the AnalysisContext.NewMessage method to create a message. Do not call this method more than once for a message. Do not change message properties after calling this method. Because this method makes a copy of the message you pass to the method, all changes to the message after calling this method do not affect the reported message.
The TestStand Sequence Analyzer discards the message if you disable the rule that corresponds to the message.</remarks>
      <param name="message">Pass the message to report.</param>
      <seealso cref="AnalysisContext.NewMessage" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.SequenceAnalyzer.AnalysisContext.Object">
      <summary>Use this property in an analysis module to access the object the TestStand Sequence Analyzer is currently analyzing.</summary>
      <remarks>This property is <c>NULL</c> when the sequence analyzer calls an analysis module for certain analysis transitions. Analysis modules must not hold a reference to the object this property returns because the sequence analyzer unloads each file from memory after analysis completes.</remarks>
      <seealso cref="AnalysisContext.Transition" />
      <seealso cref="AnalysisTransition" />
      <seealso cref="&quot;Relationships among AnalysisContext Transition, File, and Object Properties&quot;javascript:TSAnalyzer('/InfoTopics/TransitionRelationships.htm')" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.SequenceAnalyzer.AnalysisContext.File">
      <summary>Use this property in an analysis module to access the file the TestStand Sequence Analyzer is currently analyzing.</summary>
      <remarks>This property is <c>NULL</c> when the sequence analyzer calls an analysis module for the AnalysisTransition_BeforeSystem and AnalysisTransition_AfterSystem analysis transitions.</remarks>
      <seealso cref="AnalysisContext.Transition" />
      <seealso cref="AnalysisTransition" />
      <seealso cref="&quot;Relationships among AnalysisContext Transition, File, and Object Properties&quot;javascript:TSAnalyzer('/InfoTopics/TransitionRelationships.htm')" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.SequenceAnalyzer.AnalysisContext.Transition">
      <summary>Use this property in an analysis module to access the file that the TestStand Sequence Analyzer is currently analyzing.</summary>
      <remarks>This property has the value AnalysisTransition_None when the sequence analyzer calls an analysis module to analyze an object.</remarks>
      <seealso cref="AnalysisTransition" />
      <seealso cref="&quot;Relationships among AnalysisContext Transition, File, and Object Properties&quot;javascript:TSAnalyzer('/InfoTopics/TransitionRelationships.htm')" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.SequenceAnalyzer.AnalysisContext.AnalysisId">
      <summary>Use this property in an analysis module to obtain the unique ID of the current analysis session. </summary>
      <remarks>The TestStand Sequence Analyzer can perform multiple analysis sessions simultaneously. Each session specifies a unique analysis ID. In general, National Instruments recommends that you use the AnalysisContext.GetRuleAnalysisData method to store global data generated during analysis. You can also store data in a global table that you index using the analysis session unique ID. Because the sequence analyzer can use multiple threads to perform analysis, you must implement locks around code that accesses the global table data.</remarks>
      <seealso cref="AnalysisContext.GetRuleAnalysisData" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.SequenceAnalyzer.AnalysisContext.Utilities">
      <summary>Use this property in an analysis module to access utility methods that help you implement a rule.</summary>
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.SequenceAnalyzer.AnalysisContext.StopRequested">
      <summary>Use this property in an analysis module to determine whether the user or another analysis module has requested to stop the current analysis session.</summary>
      <remarks>When the user stops analysis, the TestStand Sequence Analyzer stops calling analysis modules to analyze objects but continues to call analysis modules for the remaining transitions. You can choose not to report messages if analysis stops. </remarks>
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.SequenceAnalyzer.AnalysisContext.EditContext">
      <summary>Use this property in an analysis module to obtain a sequence context that corresponds to the object under analysis. This property is <c>NULL</c> when the TestStand Sequence Analyzer calls an analysis module for analysis transitions.</summary>
      <seealso cref="AnalysisContext.Object" />
      <seealso cref="AnalysisContext.Transition" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.SequenceAnalyzer.AnalysisContext.StopAnalysis">
      <summary>Use this method in an analysis module to stop the current analysis session. After you call this method, the TestStand Sequence Analyzer calls analysis modules for the remaining transitions, closes all files, and stops analyzing.</summary>
    </member>
    <member name="T:NationalInstruments.TestStand.Interop.SequenceAnalyzer.RuleConfigurationContext">
      <summary>Use the objects of the <c>RuleConfigurationContext</c> class in a rule configuration module to access the rule configuration data. The TestStand Sequence Analyzer passes an instance of this class as a parameter to the rule configuration module.</summary>
      <seealso cref="&quot;Creating Rule Configuration Modules&quot;javascript:RefLink('/InfoTopics/SA_Creating_Rule_Config_Modules.htm')" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.SequenceAnalyzer.RuleConfigurationContext.Engine">
      <summary>Use this property in a rule configuration module to access methods and properties on the TestStand Engine class.</summary>
      <seealso cref="&quot;TestStand Engine&quot;javascript:APILink('/RefTopics/Engine.htm')" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.SequenceAnalyzer.RuleConfigurationContext.RuleConfiguration">
      <summary>Use this property in a rule configuration module to access the rule configuration. The rule configuration stores settings specific to a rule.</summary>
      <seealso cref="AnalysisContext.GetRuleConfiguration" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.SequenceAnalyzer.RuleConfigurationContext.IsModified">
      <summary>Set this property in a rule configuration module to <c>True</c> if the module makes a change to the rule configuration. The TestStand Sequence Analyzer uses this property to determine whether the rule configuration module modified the project file.</summary>
    </member>
    <member name="T:NationalInstruments.TestStand.Interop.SequenceAnalyzer.RuleConfiguration">
      <summary>Use the objects of the <c>RuleConfiguration</c> class to access the configuration information of a rule. A rule configuration contains the enabled state, severity, description, and other information for a specific rule. The sequence analyzer stores the configuration information of a rule in an analyzer project.
In a rule configuration module, use the RuleConfigurationContext.RuleConfiguration property to obtain an instance of this class.
In an analysis module, use the AnalysisContext.GetRuleConfiguration method to obtain an instance of this class.</summary>
      <seealso cref="&quot;Accessing Rule Configuration Data in Rule Configuration Modules and &#xD;&#xD;&#xA;Analysis Modules&quot;javascript:RefLink('/InfoTopics/SA_Accessing_Rule_Config_Data.htm')" />
      <seealso cref="AnalysisContext.GetRuleConfiguration" />
      <seealso cref="&quot;Creating Analysis Modules&quot;javascript:RefLink('/InfoTopics/SA_Creating_Analysis_Modules.htm')" />
      <seealso cref="&quot;Creating Rule Configuration Modules&quot;javascript:RefLink('/InfoTopics/SA_Creating_Rule_Config_Modules.htm')" />
      <seealso cref="RuleConfigurationContext.RuleConfiguration" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.SequenceAnalyzer.RuleConfiguration.RuleId">
      <summary>Use this property in an analysis module or rule configuration module to obtain the unique ID of the rule.</summary>
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.SequenceAnalyzer.RuleConfiguration.Enabled">
      <summary>Use this property in an analysis module to determine whether the rule is enabled. Do not set this property. Do not perform any analysis in the analysis module if this property is <c>False</c>.</summary>
      <remarks>The TestStand Sequence Analyzer sets this property when a user enables or disables a rule on the Rules pane of the Current Sequence Analyzer Project window in the TestStand Sequence Editor or on the Rules tab of the stand-alone sequence analyzer application.</remarks>
      <seealso cref="&quot;Rules pane of current sequence analyzer project&quot;javascript:RefLink('/InfoTopics/Current_Seq_Analyzer_Proj_Window_Rules_Pane.htm')" />
      <seealso cref="&quot;Rules tab of stand-alone sequence analyzer application&quot;javascript:RefLink('/InfoTopics/Sequence_Analyzer_Rules_Tab.htm')" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.SequenceAnalyzer.RuleConfiguration.ConfigurationData">
      <summary>In a rule configuration module, use this property to store configuration data for the rule. In an analysis module, use this property to obtain the configuration data stored for the rule.</summary>
      <remarks>Use only rule configuration modules to modify configuration data. Do not make changes to the data in an analysis module.
The TestStand Sequence Analyzer creates an empty container property object for each rule when it creates a new analyzer project. Use a rule configuration module to save rule data in the property object.
When you save configuration data to this property in a rule configuration module, also set the RuleConfiguration.Description property to include a description of the configuration data so that generated reports contain information about the configuration data and so that users can easily view the rule settings by viewing the rule description on the Rules pane of the Current Sequence Analyzer Project window in the TestStand Sequence Editor or on the Rules tab of the stand-alone sequence analyzer application.</remarks>
      <seealso cref="&quot;Creating Analysis Modules&quot;javascript:RefLink('/InfoTopics/SA_Creating_Analysis_Modules.htm')" />
      <seealso cref="&quot;Creating Rule Configuration Modules&quot;javascript:RefLink('/InfoTopics/SA_Creating_Rule_Config_Modules.htm')" />
      <seealso cref="RuleConfiguration.Description" />
      <seealso cref="&quot;Rules pane of current sequence analyzer project&quot;javascript:RefLink('/InfoTopics/Current_Seq_Analyzer_Proj_Window_Rules_Pane.htm')" />
      <seealso cref="&quot;Rules tab of stand-alone sequence analyzer application&quot;javascript:RefLink('/InfoTopics/Sequence_Analyzer_Rules_Tab.htm')" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.SequenceAnalyzer.RuleConfiguration.RuleSettingValues">
      <summary>Use this property in an analysis module to obtain the values for rule settings. Use this property only for rules for which you enable the Use Rule Settings configuration option on the Advanced tab of the Edit Rule dialog box. Do not use this property in a rule configuration module. Rule configuration modules store rule data in the RuleConfiguration.ConfigurationData property.</summary>
      <seealso cref="&quot;Advanced tab of Edit Rule dialog box&quot;javascript:RefLink('/InfoTopics/DB_Edit_Rule_Adv_Tab.htm')" />
      <seealso cref="&quot;Creating Analysis Modules&quot;javascript:RefLink('/InfoTopics/SA_Creating_Analysis_Modules.htm')" />
      <seealso cref="&quot;Creating Rule Configuration Modules&quot;javascript:RefLink('/InfoTopics/SA_Creating_Rule_Config_Modules.htm')" />
      <seealso cref="RuleConfiguration.ConfigurationData" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.SequenceAnalyzer.RuleConfiguration.Severity">
      <summary>Use this property in an analysis module or rule configuration module to obtain the rule severity. Do not set this property.</summary>
      <remarks>The TestStand Sequence Analyzer sets this property when a user changes the setting in the Severity column for a rule on the Rules pane of the Current Sequence Analyzer Project window in the TestStand Sequence Editor or on the Rules tab of the stand-alone sequence analyzer application.</remarks>
      <seealso cref="&quot;Rules pane of current sequence analyzer project&quot;javascript:RefLink('/InfoTopics/Current_Seq_Analyzer_Proj_Window_Rules_Pane.htm')" />
      <seealso cref="&quot;Rules tab of stand-alone sequence analyzer application&quot;javascript:RefLink('/InfoTopics/Sequence_Analyzer_Rules_Tab.htm')" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.SequenceAnalyzer.RuleConfiguration.Description">
      <summary>Use this property in an analysis module to obtain the rule description. Use this property in a rule configuration module to save a custom rule description.</summary>
      <remarks>When you save configuration data to the RuleConfiguration.ConfigurationData property in a rule configuration module, also set this property to include a description of the configuration data so that generated reports contain information about the configuration data and so that users can easily view the rule settings by viewing the rule description on the Rules pane of the Current Sequence Analyzer Project window in the TestStand Sequence Editor or on the Rules tab of the stand-alone sequence analyzer application.</remarks>
      <seealso cref="RuleConfiguration.ConfigurationData" />
      <seealso cref="&quot;Rules pane of current sequence analyzer project&quot;javascript:RefLink('/InfoTopics/Current_Seq_Analyzer_Proj_Window_Rules_Pane.htm')" />
      <seealso cref="&quot;Rules tab of stand-alone sequence analyzer application&quot;javascript:RefLink('/InfoTopics/Sequence_Analyzer_Rules_Tab.htm')" />
    </member>
    <member name="T:NationalInstruments.TestStand.Interop.SequenceAnalyzer.AnalysisMessage">
      <summary>An object of the <c>AnalysisMessage</c> class represents a message an analysis module creates while performing an analysis. The message displays in the TestStand Sequence Editor or the stand-alone sequence analyzer application and is stored in a TestStand Sequence Analyzer project. Use the AnalysisContext.NewMessage method in an analysis module to create a new instance of this class.</summary>
      <seealso cref="AnalysisContext.NewMessage" />
      <seealso cref="&quot;Creating Analysis Modules&quot;javascript:RefLink('/InfoTopics/SA_Creating_Analysis_Modules.htm')" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.SequenceAnalyzer.AnalysisMessage.RuleId">
      <summary>Use this property in an analysis module to obtain or specify the unique rule ID associated with the message.</summary>
      <remarks>Do not set this property after calling the AnalysisContext.ReportMessage method because the <c>AnalysisContext.ReportMessage</c> method makes a copy of the message you pass to the method. Changes to this property after calling the <c>AnalysisContext.ReportMessage</c> method do not affect the reported message.</remarks>
      <seealso cref="AnalysisContext.ReportMessage" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.SequenceAnalyzer.AnalysisMessage.Text">
      <summary>Use this property in an analysis module to obtain or specify the message text.</summary>
      <remarks>Do not set this property after calling the AnalysisContext.ReportMessage method because the <c>AnalysisContext.ReportMessage</c> method makes a copy of the message you pass to the method. Changes to this property after calling the <c>AnalysisContext.ReportMessage</c> method do not affect the reported message.</remarks>
      <seealso cref="AnalysisContext.ReportMessage" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.SequenceAnalyzer.AnalysisMessage.Locations">
      <summary>Use this property in an analysis module to obtain the location associated with the message. You can call methods on this property to specify the location the TestStand Sequence Analyzer uses when you go to the location associated with a message.</summary>
      <remarks>Do not set this property after calling the AnalysisContext.ReportMessage method because the <c>AnalysisContext.ReportMessage</c> method makes a copy of the message you pass to the method. Changes to this property after calling the <c>AnalysisContext.ReportMessage</c> method do not affect the reported message.
The sequence analyzer recognizes only the first location this property contains.</remarks>
      <seealso cref="AnalysisContext.NewMessage" />
      <seealso cref="AnalysisContext.ReportMessage" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.SequenceAnalyzer.AnalysisMessage.JustificationForIgnore">
      <summary></summary>
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.SequenceAnalyzer.AnalysisMessage.Severity">
      <summary></summary>
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.SequenceAnalyzer.AnalysisMessage.IsCurrent">
      <summary></summary>
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.SequenceAnalyzer.AnalysisMessage.Status">
      <summary></summary>
    </member>
    <member name="T:NationalInstruments.TestStand.Interop.SequenceAnalyzer.RuleSettingValues">
      <summary>Use objects of the <c>RuleSettingValues</c> class to obtain rule setting values. Use the RuleConfiguration.RuleSettingValues property to obtain an instance of the <c>RuleSettingValues</c> class. Use this class only for rules for which you enable the Use Rule Settings configuration option on the Advanced tab of the Edit Rule dialog box.</summary>
      <seealso cref="&quot;Accessing Rule Settings in Analysis Modules&quot;javascript:RefLink('/InfoTopics/SA_Accessing_Rule_Settings.htm')" />
      <seealso cref="&quot;Advanced tab of Edit Rule dialog box&quot;javascript:RefLink('/InfoTopics/DB_Edit_Rule_Adv_Tab.htm')" />
      <seealso cref="&quot;Creating Analysis Modules&quot;javascript:RefLink('/InfoTopics/SA_Creating_Analysis_Modules.htm')" />
      <seealso cref="&quot;Creating Rule Configuration Modules&quot;javascript:RefLink('/InfoTopics/SA_Creating_Rule_Config_Modules.htm')" />
      <seealso cref="RuleConfiguration.RuleSettingValues" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.SequenceAnalyzer.RuleSettingValues.Item(System.Object)">
      <summary>Returns a reference to an item at the specified index in the collection.</summary>
      <param name="indexOrName">  </param>
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.SequenceAnalyzer.RuleSettingValues.Count">
      <summary>Returns the number of items in the collection.</summary>
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.SequenceAnalyzer.RuleSettingValues._NewEnum">
      <summary>  </summary>
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.SequenceAnalyzer.RuleSettingValues.GetBooleanValue(System.String)">
      <summary>Use this method in an analysis module to obtain the value for a Boolean rule setting.</summary>
      <param name="settingName">Pass the name of the rule setting.</param>
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.SequenceAnalyzer.RuleSettingValues.GetStringValue(System.String)">
      <summary>Use this method in an analysis module to obtain the value for a string rule setting.</summary>
      <param name="settingName">Pass the name of the rule setting.</param>
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.SequenceAnalyzer.RuleSettingValues.GetNumberValue(System.String)">
      <summary>Use this method in an analysis module to obtain the value for a number or enumeration rule setting.</summary>
      <param name="settingName">Pass the name of the rule setting.</param>
    </member>
    <member name="T:NationalInstruments.TestStand.Interop.SequenceAnalyzer.Analyzer">
      <summary></summary>
    </member>
    <member name="T:NationalInstruments.TestStand.Interop.SequenceAnalyzer.IAnalyzer">
      <summary></summary>
    </member>
    <member name="T:NationalInstruments.TestStand.Interop.SequenceAnalyzer.AnalyzerClass">
      <summary></summary>
    </member>
    <member name="T:NationalInstruments.TestStand.Interop.SequenceAnalyzer.RuleSeverity">
      <summary>Use these constants with the RuleConfiguration.Severity property.</summary>
      <seealso cref="RuleConfiguration.Severity" />
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.RuleSeverity.RuleSeverity_Error">
      <summary>(Value: 0) Indicates that the analysis message reflects an error.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.RuleSeverity.RuleSeverity_Warning">
      <summary>(Value: 1) Indicates that the analysis message reflects a warning.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.RuleSeverity.RuleSeverity_Information">
      <summary>(Value: 2) Indicates that the analysis message contains information that is neither a warning nor an error.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.RuleSeverity.RuleSeverity_Default">
      <summary>(Value: 3) Specifies the default severity the rule defines. </summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.RuleSeverity.RuleSeverity_Unknown">
      <summary>(Value: 4) Do not use this value.</summary>
    </member>
    <member name="T:NationalInstruments.TestStand.Interop.SequenceAnalyzer.AnalysisTransition">
      <summary>Use this enumeration with the AnalysisContext.Transition property to determine the current analysis transition of the TestStand Sequence Analyzer.
</summary>
      <seealso cref="AnalysisContext.File" />
      <seealso cref="AnalysisContext.Object" />
      <seealso cref="AnalysisContext.Transition" />
      <seealso cref="&quot;Insertion Palette&quot;javascript:RefLink('/InfoTopics/Insertion_Pane.htm')" />
      <seealso cref="&quot;Relationships among AnalysisContext Transition, File, and Object Properties&quot;javascript:TSAnalyzer('/InfoTopics/TransitionRelationships.htm')" />
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.AnalysisTransition.AnalysisTransition_None">
      <summary>(Value: 0) Indicates that the sequence analyzer is not in a transition.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.AnalysisTransition.AnalysisTransition_BeforeSystem">
      <summary>(Value: 1) Indicates that the sequence analyzer is preparing to start analyzing.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.AnalysisTransition.AnalysisTransition_BeforeTypePalettes">
      <summary>(Value: 2) Indicates that the sequence analyzer is preparing to analyze type palette files.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.AnalysisTransition.AnalysisTransition_BeforeTypePalette">
      <summary>(Value: 3) Indicates that the sequence analyzer is preparing to analyze a specific type palette file. Use the <c>AnalysisContext.File</c> property to obtain a reference to the type palette file. The <c>AnalysisContext.Object</c> property also contains a reference to the file.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.AnalysisTransition.AnalysisTransition_BeforeUsersFile">
      <summary>(Value: 6) Indicates that the sequence analyzer is preparing to analyze the users file. Use the <c>AnalysisContext.File</c> property to obtain a reference to the users file. The <c>AnalysisContext.Object</c> property also contains a reference to the file.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.AnalysisTransition.AnalysisTransition_BeforeUsers">
      <summary>(Value: 7) Indicates that the sequence analyzer is preparing to analyze the users in the users file.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.AnalysisTransition.AnalysisTransition_BeforeUserGroups">
      <summary>(Value: 9) Indicates that the sequence analyzer is preparing to analyze the user groups in the users file.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.AnalysisTransition.AnalysisTransition_BeforeStationGlobalsFile">
      <summary>(Value: 12) Indicates that the sequence analyzer is preparing to analyze the station global variables file. Use the <c>AnalysisContext.File</c> property to obtain a reference to the station global variables file. The <c>AnalysisContext.Object</c> property also contains a reference to the file.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.AnalysisTransition.AnalysisTransition_BeforeStationGlobals">
      <summary>(Value: 13) Indicates that the sequence analyzer is preparing to analyze the global variables in the station global variables file.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.AnalysisTransition.AnalysisTransition_BeforeTemplatesFile">
      <summary>(Value: 16) Indicates that the sequence analyzer is preparing to analyze the templates file. The templates file contains the configuration settings for the Templates list. Use the <c>AnalysisContext.File</c> property to obtain a reference to the templates file. The <c>AnalysisContext.Object</c> property also contains a reference to the file.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.AnalysisTransition.AnalysisTransition_BeforeSequenceFile">
      <summary>(Value: 22) Indicates that the sequence analyzer is preparing to analyze a sequence file. Use the <c>AnalysisContext.File</c> property to obtain a reference to the sequence file. The <c>AnalysisContext.Object</c> property also contains a reference to the file.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.AnalysisTransition.AnalysisTransition_BeforeSequenceFileGlobals">
      <summary>(Value: 23) Indicates that the sequence analyzer is preparing to analyze the global variables in a sequence file.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.AnalysisTransition.AnalysisTransition_BeforeSequences">
      <summary>(Value: 25) Indicates that the sequence analyzer is preparing to analyze the sequences in a sequence file.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.AnalysisTransition.AnalysisTransition_BeforeSequence">
      <summary>(Value: 26) Indicates that the sequence analyzer is preparing to analyze one sequence in a sequence file. Use the <c>AnalysisContext.Object</c> property to obtain a reference to the sequence.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.AnalysisTransition.AnalysisTransition_BeforeSequenceVariables">
      <summary>(Value: 27) Indicates that the sequence analyzer is preparing to analyze the variables in a sequence. Use the <c>AnalysisContext.Object</c> property to obtain a reference to the sequence.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.AnalysisTransition.AnalysisTransition_BeforeSequenceLocals">
      <summary>(Value: 28) Indicates that the sequence analyzer is preparing to analyze the local variables in a sequence. Use the <c>AnalysisContext.Object</c> property to obtain a reference to the sequence.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.AnalysisTransition.AnalysisTransition_BeforeSequenceParameters">
      <summary>(Value: 30) Indicates that the sequence analyzer is preparing to analyze the parameters in a sequence. Use the <c>AnalysisContext.Object</c> property to obtain a reference to the sequence.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.AnalysisTransition.AnalysisTransition_BeforeSteps">
      <summary>(Value: 33) Indicates that the sequence analyzer is preparing to analyze the steps in a sequence. Use the <c>AnalysisContext.Object</c> property to obtain a reference to the sequence.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.AnalysisTransition.AnalysisTransition_BeforeSetupStepGroup">
      <summary>(Value: 34) Indicates that the sequence analyzer is preparing to analyze the Setup step group in a sequence. Use the <c>AnalysisContext.Object</c> property to obtain a reference to the sequence.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.AnalysisTransition.AnalysisTransition_BeforeMainStepGroup">
      <summary>(Value: 36) Indicates that the sequence analyzer is preparing to analyze the Main step group in a sequence. Use the <c>AnalysisContext.Object</c> property to obtain a reference to the sequence.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.AnalysisTransition.AnalysisTransition_BeforeCleanupStepGroup">
      <summary>(Value: 38) Indicates that the sequence analyzer is preparing to analyze the Cleanup step group in a sequence. Use the <c>AnalysisContext.Object</c> property to obtain a reference to the sequence.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.AnalysisTransition.AnalysisTransition_BeforeStep">
      <summary>(Value: 45) Indicates that the sequence analyzer is preparing to analyze a step. Use the <c>AnalysisContext.Object</c> property to obtain a reference to the step.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.AnalysisTransition.AnalysisTransition_BeforeFileTypes">
      <summary>(Value: 47) Indicates that the sequence analyzer is preparing to analyze the types defined in a TestStand file, including type palette files, sequence files, and workspace files. Use the <c>AnalysisContext.File</c> property to obtain a reference to the file.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.AnalysisTransition.AnalysisTransition_AfterSystem">
      <summary>(Value: 44) Indicates that the sequence analyzer finished analyzing all files.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.AnalysisTransition.AnalysisTransition_AfterTypePalettes">
      <summary>(Value: 5) Indicates that the sequence analyzer finished analyzing the type palette files.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.AnalysisTransition.AnalysisTransition_AfterTypePalette">
      <summary>(Value: 4) Indicates that the sequence analyzer finished analyzing a specific type palette file. Use the <c>AnalysisContext.File</c> property to obtain a reference to the type palette file that was analyzed. The <c>AnalysisContext.Object</c> property also contains a reference to the file.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.AnalysisTransition.AnalysisTransition_AfterUsersFile">
      <summary>(Value: 11) Indicates that the sequence analyzer finished analyzing the users file. Use the <c>AnalysisContext.File</c> property to obtain a reference to the users file. The <c>AnalysisContext.Object</c> property also contains a reference to the file.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.AnalysisTransition.AnalysisTransition_BeforeTemplates">
      <summary>(Value: 17) Indicates that the sequence analyzer is preparing to analyze the templates in the templates file.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.AnalysisTransition.AnalysisTransition_BeforeWorkspaceFile">
      <summary>(Value: 20) Indicates that the sequence analyzer is preparing to analyze the workspace file. Use the <c>AnalysisContext.File</c> property to obtain a reference to the workspace file. The <c>AnalysisContext.Object</c> property also contains a reference to the file.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.AnalysisTransition.AnalysisTransition_AfterUsers">
      <summary>(Value: 8) Indicates that the sequence analyzer finished analyzing the users in the users file. Use the <c>AnalysisContext.File</c> property to obtain a reference to the users file.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.AnalysisTransition.AnalysisTransition_AfterUserGroups">
      <summary>(Value: 10) Indicates that the sequence analyzer finished analyzing the user groups in the users file.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.AnalysisTransition.AnalysisTransition_AfterStationGlobalsFile">
      <summary>(Value: 15) Indicates that the sequence analyzer finished analyzing the station global variables file. Use the <c>AnalysisContext.File</c> property to obtain a reference to the station global variables file. The <c>AnalysisContext.Object</c> property also contains a reference to the file.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.AnalysisTransition.AnalysisTransition_AfterStationGlobals">
      <summary>(Value: 14) Indicates that the sequence analyzer finished analyzing the global variables in the station global variables file. Use the <c>AnalysisContext.File</c> property to obtain a reference to the station global variables file.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.AnalysisTransition.AnalysisTransition_AfterTemplatesFile">
      <summary>(Value: 19) Indicates that the sequence analyzer finished analyzing the templates file. The templates file contains the configuration settings for the Templates list on the Insertion Palette. Use the <c>AnalysisContext.File</c> property to obtain a reference to the templates file. The <c>AnalysisContext.Object</c> property also contains a reference to the file.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.AnalysisTransition.AnalysisTransition_AfterTemplates">
      <summary>(Value: 18) Indicates that the sequence analyzer finished analyzing the templates in the templates file.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.AnalysisTransition.AnalysisTransition_AfterWorkspaceFile">
      <summary>(Value: 21) Indicates that the sequence analyzer finished analyzing the workspace file. Use the <c>AnalysisContext.File</c> property to obtain a reference to the workspace file. The <c>AnalysisContext.Object</c> property also contains a reference to the file.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.AnalysisTransition.AnalysisTransition_AfterSequenceFile">
      <summary>(Value: 43) Indicates that the sequence analyzer finished analyzing a sequence file. Use the <c>AnalysisContext.File</c> property to obtain a reference to the sequence file. The <c>AnalysisContext.Object</c> property also contains a reference to the file.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.AnalysisTransition.AnalysisTransition_AfterSequenceFileGlobals">
      <summary>(Value: 24) Indicates that the sequence analyzer finished analyzing the global variables in a sequence file.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.AnalysisTransition.AnalysisTransition_AfterSequences">
      <summary>(Value: 42) Indicates that the sequence analyzer finished analyzing the sequences in a sequence file.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.AnalysisTransition.AnalysisTransition_AfterSequence">
      <summary>(Value: 41) Indicates that the sequence analyzer finished analyzing one sequence in a sequence file. Use the <c>AnalysisContext.Object</c> property to obtain a reference to the sequence.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.AnalysisTransition.AnalysisTransition_AfterSequenceVariables">
      <summary>(Value: 32) Indicates that the sequence analyzer finished analyzing the variables in a sequence. Use the <c>AnalysisContext.Object</c> property to obtain a reference to the sequence.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.AnalysisTransition.AnalysisTransition_AfterSequenceLocals">
      <summary>(Value: 29) Indicates that the sequence analyzer finished analyzing the local variables in a sequence. Use the <c>AnalysisContext.Object</c> property to obtain a reference to the sequence.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.AnalysisTransition.AnalysisTransition_AfterSequenceParameters">
      <summary>(Value: 31) Indicates that the sequence analyzer finished analyzing the parameters in a sequence. Use the <c>AnalysisContext.Object</c> property to obtain a reference to the sequence.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.AnalysisTransition.AnalysisTransition_AfterSteps">
      <summary>(Value: 40) Indicates that the sequence analyzer finished analyzing the steps in a sequence. Use the <c>AnalysisContext.Object</c> property to obtain a reference to the sequence.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.AnalysisTransition.AnalysisTransition_AfterSetupStepGroup">
      <summary>(Value: 35) Indicates that the sequence analyzer finished analyzing the Setup step group in a sequence. Use the <c>AnalysisContext.Object</c> property to obtain a reference to the sequence.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.AnalysisTransition.AnalysisTransition_AfterMainStepGroup">
      <summary>(Value: 37) Indicates that the sequence analyzer finished analyzing the Main step group in a sequence. Use the <c>AnalysisContext.Object</c> property to obtain a reference to the sequence.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.AnalysisTransition.AnalysisTransition_AfterCleanupStepGroup">
      <summary>(Value: 39) Indicates that the sequence analyzer finished analyzing the Cleanup step group in a sequence. Use the AnalysisContext.Object property to obtain a reference to the sequence.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.AnalysisTransition.AnalysisTransition_AfterStep">
      <summary>(Value: 46) Indicates that the sequence analyzer finished analyzing a step. Use the <c>AnalysisContext.Object</c> property to obtain a reference to the step.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.AnalysisTransition.AnalysisTransition_AfterFileTypes">
      <summary>(Value: 48) Indicates that the sequence analyzer finished analyzing the types defined in a TestStand file, including type palette files, sequence files, and workspace files. Use the AnalysisContext.File property to obtain a reference to the file.</summary>
    </member>
    <member name="T:NationalInstruments.TestStand.Interop.SequenceAnalyzer.GetRuleAnalysisDataOptions">
      <summary>Use this enumeration with the AnalysisContext.GetRuleAnalysisData method.</summary>
      <seealso cref="AnalysisContext.GetRuleAnalysisData" />
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.GetRuleAnalysisDataOptions.GetRuleAnalysisDataOption_NoOptions">
      <summary>(Value: 0x0) No options.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.GetRuleAnalysisDataOptions.GetRuleAnalysisDataOption_Lock">
      <summary>(Value: 0x1) Locks the data and prevents other threads from accessing the data. You must use this option if you change any of the rule analysis data. The TestStand Sequence Analyzer unlocks the data after the call to the analysis module completes.</summary>
    </member>
    <member name="T:NationalInstruments.TestStand.Interop.SequenceAnalyzer.ValidateExpressionOptions">
      <summary>Use this enumeration with the AnalysisUtilities.ValidateExpression method.</summary>
      <seealso cref="AnalysisUtilities.ValidateExpression" />
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.ValidateExpressionOptions.ValidateExpressionOption_NoOptions">
      <summary>(Value: 0x0) No options.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.ValidateExpressionOptions.ValidateExpressionOption_Path">
      <summary>(Value: 0x1) Specifies to expect a path in the expression the TestStand Sequence Analyzer validates.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.SequenceAnalyzer.ValidateExpressionOptions.ValidateExpressionOption_MustEvaluateToProperty">
      <summary>(Value: 0x2) Specifies that an expression must evaluate to a property location.</summary>
    </member>
  </members>
</doc>
Libs/NationalInstruments.TestStand.Interop.UI.AxControls.dll
Binary files differ
Libs/NationalInstruments.TestStand.Interop.UI.Support.dll
Binary files differ
Libs/NationalInstruments.TestStand.Interop.UI.Support.xml
New file
@@ -0,0 +1,1277 @@
<?xml version="1.0"?><doc><members>
    <member name="T:NationalInstruments.TestStand.Interop.UI.Support.MRUFiles">
      <summary>A collection of the most recently used (MRU) files. Each item in the collection is a filename.</summary>
      <seealso cref="&quot;ApplicationMgr.MRUFiles&quot;ApplicationMgr_MRUFiles_P.htm" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.MRUFiles.Item(System.Int32)">
      <summary>Returns a reference to an item at the specified index in the collection.</summary>
      <returns>Filename of the most recently used file at the specified index.</returns>
      <param name="itemIndex">Specifies the index of the item to retrieve.</param>
      <seealso cref="MRUFiles.Count" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.MRUFiles.Count">
      <summary>Returns the number of items in the collection.</summary>
      <seealso cref="MRUFiles.Max" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.MRUFiles.Max">
      <summary>Specifies the maximum size of the collection.</summary>
      <remarks>The MRUFiles collection cannot become larger than the size this property specifies. When the collection reaches the maximum size, new items you add to the beginning of the collection replace the oldest items at the end of the collection. The Application Manager control persists the value this property specifies.</remarks>
      <seealso cref="&quot;Application Manager&quot;ApplicationMgr.htm" />
      <seealso cref="MRUFiles.Add" />
      <seealso cref="MRUFiles.Count" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.MRUFiles.Clear">
      <summary>Removes all items from the collection.</summary>
      <seealso cref="MRUFiles.Remove" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.MRUFiles.Remove(System.String)">
      <summary>Removes the specified item from this collection, if it exists.</summary>
      <returns>Returns <c>True</c> when the item is removed from the collection. Returns <c>False</c> when the item is not found.</returns>
      <param name="fileNameVal">Specifies the filename to remove from the collection.</param>
      <seealso cref="MRUFiles.Add" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.MRUFiles.GetDisplayName(System.Int32,System.Int32)">
      <summary>Returns a string that you can display in a menu used for opening the most recently used files.</summary>
      <returns>The display name of the filename at the index.</returns>
      <param name="itemIndex">Specifies the index of an item.</param>
      <param name="maxWidth">Specifies the maximum width, in pixels, of the display name string. The width of the string is measured using the system menu font.</param>
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.MRUFiles.Add(System.String)">
      <summary>Adds a filename to the beginning of the collection.</summary>
      <param name="fileNameVal">Specifies the filename to add to the collection.</param>
      <seealso cref="MRUFiles.Max" />
      <seealso cref="MRUFiles.Remove" />
    </member>
    <member name="T:NationalInstruments.TestStand.Interop.UI.Support.SelectedSteps">
      <summary>A collection of selected steps. You can obtain a reference to the collection from the SequenceFileViewMgr.SelectedSteps and ExecutionViewMgr.SelectedSteps properties.</summary>
      <seealso cref="&quot;ExecutionViewMgr.SelectedSteps&quot;ExecutionViewMgr_SelectedSteps_P.htm" />
      <seealso cref="&quot;SequenceFileViewMgr.SelectedSteps&quot;SequenceFileViewMgr_SelectedSteps_P.htm" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.SelectedSteps.Item(System.Int32)">
      <summary>Returns a reference to an item at the specified index in the collection.</summary>
      <returns>The step at the specified index in the collection.    </returns>
      <param name="itemIndex">Specifies the index of the item to retrieve.</param>
      <seealso cref="&quot;Step&quot;javascript:APILink('/RefTopics/Step.htm')" />
      <seealso cref="SelectedSteps.Count" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.SelectedSteps.Count">
      <summary>Returns the number of items in the collection.</summary>
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.SelectedSteps.Clear">
      <summary>Removes all items from the collection.</summary>
      <seealso cref="SelectedSteps.AddStep" />
      <seealso cref="SelectedSteps.AddStepIndex" />
      <seealso cref="SelectedSteps.AddSteps" />
      <seealso cref="SelectedSteps.EndSelected" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.SelectedSteps.AddStepIndex(System.Int32)">
      <summary>Adds a step to the collection.</summary>
      <remarks>When the SequenceFileViewMgr.StepGroupMode property is <c>StepGroupMode_AllGroups</c>, call the SelectedSteps.AddStep method instead of this method.</remarks>
      <param name="stepIndex">Specifies the index in the current step group of the step to add.</param>
      <seealso cref="SelectedSteps.AddStep" />
      <seealso cref="SelectedSteps.EndSelected" />
      <seealso cref="SequenceFileViewMgr.StepGroup" />
      <seealso cref="SequenceFileViewMgr.StepGroupMode" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.SelectedSteps.EndSelected">
      <summary>Specifies whether the End step is selected.</summary>
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.SelectedSteps.GetStepIndex(System.Int32)">
      <summary>Retrieves the step index within a step group of a selected step.</summary>
      <returns>The step index of the step in the collection.</returns>
      <param name="nthSelectedStep">Specifies the index of a step in the collection.</param>
      <seealso cref="SelectedSteps.EndSelected" />
      <seealso cref="SelectedSteps.GetStepGroup" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.SelectedSteps.GetStepGroup(System.Int32)">
      <summary>Returns the step group of the specified step in the collection.</summary>
      <param name="nthSelectedStep">Specifies the index of a step in the collection.</param>
      <seealso cref="SelectedSteps.GetStepIndex" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.SelectedSteps.AddStep(NationalInstruments.TestStand.Interop.API.Step)">
      <summary>Adds a step to the collection.</summary>
      <param name="val">Specifies the step to add.</param>
      <seealso cref="SelectedSteps.AddStepIndex" />
      <seealso cref="SelectedSteps.AddSteps" />
      <seealso cref="SelectedSteps.Clear" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.SelectedSteps.AddSteps(System.Object[])">
      <summary>Adds an array of steps to the collection.</summary>
      <param name="val">Specifies the steps to add.</param>
      <seealso cref="SelectedSteps.AddStepIndex" />
      <seealso cref="SelectedSteps.AddSteps" />
      <seealso cref="SelectedSteps.Clear" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.SelectedSteps.SelectionFlags">
      <summary>When the SequenceFileViewMgr.StepGroupMode property is <c>StepGroupMode_AllGroups</c>, this property indicates whether the selection includes the step group start and end markers. The property also indicates whether each step group is expanded or collapsed. The value of this property is a bitwise-OR combination of the SelectionFlags constants.</summary>
      <seealso cref="SelectionFlags" />
      <seealso cref="SequenceFileViewMgr.StepGroupMode" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.SelectedSteps.BeginUpdate">
      <summary>Call this method before making multiple changes to the SelectedSteps collection. When you finish changing the collection, call the SelectedSteps.EndUpdate method to update the TestStand User Interface (UI) Controls according to the changes.</summary>
      <remarks>Use this method to minimize redrawing in the TestStand UI Controls when you programmatically change the selection.</remarks>
      <seealso cref="SelectedSteps.EndUpdate" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.SelectedSteps.EndUpdate">
      <summary>Updates the user interface according to all changes to the SelectedSteps collection you made after the previous call to the SelectedSteps.BeginUpdate method.</summary>
      <seealso cref="SelectedSteps.BeginUpdate" />
    </member>
    <member name="T:NationalInstruments.TestStand.Interop.UI.Support.Strings">
      <summary>A collection of strings. You can obtain a reference to the collection from the ApplicationMgr.CommandLineArguments property, the ExpressionEdit.GetValidEvaluationTypes, and ExpressionEdit.SetValidEvaluationTypes methods, and the ApplicationMgr.ProcessUserCommandLineArguments event.</summary>
      <seealso cref="&quot;ApplicationMgr.CommandLineArguments&quot;ApplicationMgr_CommandLineArguments_P.htm" />
      <seealso cref="&quot;ApplicationMgr.ProcessUserCommandLineArguments&quot;ApplicationMgr_ProcessUserCommandLineArguments_E.htm" />
      <seealso cref="&quot;EvaluationTypes.AllowedArrayRepresentations&quot;javascript:APILink('/RefTopics/EvaluationTypes_AllowedArrayRepresentations_P.htm')" />
      <seealso cref="&quot;EvaluationTypes.AllowedRepresentations&quot;javascript:APILink('/RefTopics/EvaluationTypes_AllowedRepresentations_P.htm')" />
      <seealso cref="&quot;ExpressionEdit.GetValidEvaluationTypes&quot;ExpressionEdit_GetValidEvaluationTypes_M.htm" />
      <seealso cref="&quot;ExpressionEdit.SetValidEvaluationTypes&quot;ExpressionEdit_SetValidEvaluationTypes_M.htm" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.Strings.Item(System.Int32)">
      <summary>Returns a reference to an item at the specified index in the collection.</summary>
      <returns>The item at the specified index.</returns>
      <param name="itemIndex">Specifies the index of the item to retrieve.</param>
      <seealso cref="Strings.Count" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.Strings.Count">
      <summary>Returns the number of items in the collection.</summary>
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.Strings.Clear">
      <summary>Removes all items from the collection.</summary>
      <seealso cref="Strings.Remove" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.Strings.Add(System.String)">
      <summary>Adds a string to the end of the collection.</summary>
      <param name="val">Specifies the string to be added.</param>
      <seealso cref="Strings.Insert" />
      <seealso cref="Strings.Remove" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.Strings.Insert(System.Int32,System.String)">
      <summary>Adds a new item to the collection at the specified index.</summary>
      <param name="itemIndex">Specifies the index of the item to insert.</param>
      <param name="val">Specifies the string to be added.</param>
      <seealso cref="Strings.Add" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.Strings.Remove(System.Int32)">
      <summary>Removes the specified item from this collection, if it exists.</summary>
      <param name="itemIndex">Specifies the index of the item to remove.</param>
      <seealso cref="Strings.Add" />
    </member>
    <member name="T:NationalInstruments.TestStand.Interop.UI.Support.NumericConnection">
      <summary>Represents a connection to a numeric source.</summary>
      <seealso cref="NumericConnections" />
      <seealso cref="&quot;NumericSources&quot;NumericSources.htm" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.NumericConnection.Source">
      <summary>NumericSource of the connection.</summary>
      <seealso cref="ExecutionViewMgr" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.NumericConnection.Refresh">
      <summary>Refreshes the connected control with the current value of the NumericSource.</summary>
    </member>
    <member name="T:NationalInstruments.TestStand.Interop.UI.Support.NumericConnections">
      <summary>A collection of NumericConnection objects.</summary>
      <seealso cref="&quot;ExecutionViewMgr.ConnectNumeric&quot;ExecutionViewMgr_ConnectNumeric_M.htm" />
      <seealso cref="NumericConnection" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.NumericConnections.Item(System.Int32)">
      <summary>Returns a reference to an item at the specified index in the collection.</summary>
      <returns>Item located at the specified index.</returns>
      <param name="itemIndex">Specifies the index of the item to retrieve.</param>
      <seealso cref="NumericConnection" />
      <seealso cref="NumericConnections.Count" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.NumericConnections.Count">
      <summary>Returns the number of items in the collection.</summary>
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.NumericConnections.Add(System.Object)">
      <summary>Creates and adds a new NumericConnection to the collection.</summary>
      <returns>New NumericConnection.</returns>
      <param name="uiObj">Specifies the user interface object to connect.</param>
      <seealso cref="&quot;ExecutionViewMgr.ConnectNumeric&quot;ExecutionViewMgr_ConnectNumeric_M.htm" />
      <seealso cref="NumericConnections.Remove" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.NumericConnections.Remove(System.Object)">
      <summary>Removes the specified item from this collection, if it exists.</summary>
      <returns>Returns <c>True</c> when the NumericConnection is removed. Returns <c>False</c> when the NumericConnection is not found.</returns>
      <param name="uiObj">Specifies the user interface object to disconnect.</param>
      <seealso cref="NumericConnections.Add" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.NumericConnections.Clear">
      <summary>Removes all items from the collection.</summary>
      <seealso cref="NumericConnections.Remove" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.NumericConnections.FromControl(System.Object)">
      <summary>Returns the NumericConnection connected to the uiObj parameter.</summary>
      <returns>NumericConnection connected to the uiObj parameter. When no NumericConnection exists for this control, this method returns <c>NULL</c>.</returns>
      <param name="uiObj">Specifies the connected user interface object.</param>
    </member>
    <member name="T:NationalInstruments.TestStand.Interop.UI.Support.ImageConnection">
      <summary>Represents a connection to an image source.</summary>
      <seealso cref="ImageConnections" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.ImageConnection.Source">
      <summary>Specifies the type of ImageConnection to obtain an image from.</summary>
      <seealso cref="ExecutionViewMgr" />
      <seealso cref="SequenceFileViewMgr" />
    </member>
    <member name="T:NationalInstruments.TestStand.Interop.UI.Support.ImageConnections">
      <summary>A collection of ImageConnection objects.</summary>
      <seealso cref="&quot;ExecutionViewMgr.ConnectImage&quot;ExecutionViewMgr_ConnectImage_M.htm" />
      <seealso cref="ImageConnection" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.ImageConnections.Item(System.Int32)">
      <summary>Returns a reference to an item at the specified index in the collection.</summary>
      <returns>Item located at the specified index.</returns>
      <param name="itemIndex">Specifies the index of the item to retrieve.</param>
      <seealso cref="ImageConnection" />
      <seealso cref="ImageConnections.Count" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.ImageConnections.Count">
      <summary>Returns the number of items in the collection.</summary>
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.ImageConnections.Add(System.Object)">
      <summary>Creates and adds a new ImageConnection to the collection.</summary>
      <returns>New ImageConnection.</returns>
      <param name="uiObj">Specifies the user interface object to connect.</param>
      <seealso cref="&quot;ExecutionViewMgr.ConnectImage&quot;ExecutionViewMgr_ConnectImage_M.htm" />
      <seealso cref="ImageConnections.Remove" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.ImageConnections.Remove(System.Object)">
      <summary>Removes the specified item from this collection, if it exists.</summary>
      <returns>Returns <c>True</c> when the ImageConnection is removed. Returns <c>False</c> when the ImageConnection is not found.</returns>
      <param name="uiObj">Specifies the user interface object to disconnect.</param>
      <seealso cref="ImageConnections.Add" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.ImageConnections.Clear">
      <summary>Removes all items from the collection.</summary>
      <seealso cref="ImageConnections.Remove" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.ImageConnections.FromControl(System.Object)">
      <summary>Returns the ImageConnection connected to the uiObj parameter.</summary>
      <returns>ImageConnection connected to the uiObj parameter. When no ImageConnection exists for this control, this method returns <c>NULL</c>.</returns>
      <param name="uiObj">Specifies the connected user interface object.</param>
    </member>
    <member name="T:NationalInstruments.TestStand.Interop.UI.Support.CaptionConnection">
      <summary>Represents a connection to a caption source.</summary>
      <seealso cref="CaptionConnections" />
      <seealso cref="&quot;CaptionSources&quot;CaptionSources.htm" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.CaptionConnection.Source">
      <summary>Specifies the type of caption source to obtain the text from.</summary>
      <seealso cref="&quot;CaptionSources&quot;CaptionSources.htm" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.CaptionConnection.LongName">
      <summary>For certain caption sources, this property specifies whether to return a long or short version of the caption text. Refer to the CaptionSources enumeration for more information about determining when this option affects the text and for more information about the long and short versions of the text.</summary>
      <seealso cref="&quot;CaptionSources&quot;CaptionSources.htm" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.CaptionConnection.FormatExpression">
      <summary>Specifies a format expression to evaluate when generating the caption text.</summary>
      <remarks>For CaptionSource_MacroExpression, specify a format expression that evaluates to a string value that contains macros that specify other caption sources. For all other caption sources, specify a format expression that evaluates to a string value that contains the characters <c>%1</c>. This method replaces the <c>%1</c> characters with the text from the caption source. Pass an empty string to use the default format for the caption source.</remarks>
      <seealso cref="&quot;CaptionSource_MacroExpression&quot;CaptionSources.htm" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.CaptionConnection.Refresh">
      <summary>Refreshes the user interface control connected to this CaptionConnection with the most recent text from the CaptionSource.</summary>
    </member>
    <member name="T:NationalInstruments.TestStand.Interop.UI.Support.CaptionConnections">
      <summary>A collection of CaptionConnection objects.</summary>
      <seealso cref="CaptionConnection" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.CaptionConnections.Item(System.Int32)">
      <summary>Returns a reference to an item at the specified index in the collection.</summary>
      <returns>Item located at the specified index.</returns>
      <param name="itemIndex">Specifies the index of the item to retrieve.</param>
      <seealso cref="CaptionConnection" />
      <seealso cref="CaptionConnections.Count" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.CaptionConnections.Count">
      <summary>Returns the number of items in the collection.</summary>
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.CaptionConnections.Add(System.Object)">
      <summary>Creates and adds a new CaptionConnection to the collection.</summary>
      <returns>New CaptionConnection.</returns>
      <param name="uiObj">Specifies the user interface object to connect.</param>
      <seealso cref="&quot;ApplicationMgr.ConnectCaption&quot;ApplicationMgr_ConnectCaption_M.htm" />
      <seealso cref="CaptionConnections.Remove" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.CaptionConnections.Remove(System.Object)">
      <summary>Removes the specified item from this collection, if it exists.</summary>
      <returns>Returns <c>True</c> when the CaptionConnection is removed. Returns <c>False</c> when the CaptionConnection is not found.</returns>
      <param name="uiObj">Specifies the user interface object to disconnect.</param>
      <seealso cref="CaptionConnections.Add" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.CaptionConnections.Clear">
      <summary>Removes all items from the collection.</summary>
      <seealso cref="CaptionConnections.Remove" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.CaptionConnections.FromControl(System.Object)">
      <summary>Returns the CaptionConnection connected to the uiObj parameter.</summary>
      <returns>CaptionConnection connected to the uiObj parameter. When no CaptionConnection exists for this control, this method returns <c>NULL</c>.</returns>
      <param name="uiObj">Specifies the connected user interface object.</param>
    </member>
    <member name="T:NationalInstruments.TestStand.Interop.UI.Support.CommandConnection">
      <summary>Represents a connection to a CommandKind.</summary>
      <seealso cref="&quot;CommandConnectionOptions&quot;CommandConnectionOptions.htm" />
      <seealso cref="CommandConnections" />
      <seealso cref="&quot;CommandKinds&quot;CommandKinds.htm" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.CommandConnection.Kind">
      <summary>Specifies the type of Command to which this CommandConnection connects.</summary>
      <seealso cref="&quot;CommandKinds&quot;CommandKinds.htm" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.CommandConnection.Index">
      <summary>Specifies which command in the set of commands to use.</summary>
      <remarks><para>Note: Use this on sets of commands. Refer to the CommandKinds enumeration for more information about supported command sets.</para></remarks>
      <seealso cref="&quot;CommandKinds&quot;CommandKinds.htm" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.CommandConnection.Options">
      <summary>Specifies the behavior of the CommandConnection.</summary>
      <remarks>The value of this property is a bitwise-OR combination of the CommandConnectionOptions constants.</remarks>
      <seealso cref="&quot;CommandConnectionOptions&quot;CommandConnectionOptions.htm" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.CommandConnection.Refresh">
      <summary>Refreshes the state of the user interface control connected to the CommandConnection.</summary>
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.CommandConnection.FreezeRefresh(System.Boolean)">
      <summary>Specifies to freeze the CommandConnection when setting the properties to avoid flicker on the connected control.</summary>
      <remarks><c>FreezeRefresh</c> calls must be balanced. For example, each time you call this method with a value of <c>True</c>, you must also call it with a value of <c>False</c>.</remarks>
      <param name="frz">When this parameter is <c>True</c>, the CommandConnection does not refresh the control. When this parameter is <c>False</c>, the CommandConnection refreshes the control.</param>
    </member>
    <member name="T:NationalInstruments.TestStand.Interop.UI.Support.CommandConnections">
      <summary>A collection of CommandConnection objects.</summary>
      <seealso cref="CommandConnection" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.CommandConnections.Item(System.Int32)">
      <summary>Returns a reference to an item at the specified index in the collection.</summary>
      <returns>Item located at the specified index.</returns>
      <param name="itemIndex">Specifies the index of the item to retrieve.</param>
      <seealso cref="CommandConnection" />
      <seealso cref="CommandConnections.Count" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.CommandConnections.Count">
      <summary>Returns the number of items in the collection.</summary>
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.CommandConnections.Add(System.Object)">
      <summary>Creates and adds a new CommandConnection to the collection.</summary>
      <returns>New CommandConnection.</returns>
      <param name="uiObj">Specifies the user interface object to connect.</param>
      <seealso cref="&quot;ApplicationMgr.ConnectCommand&quot;ApplicationMgr_ConnectCommand_M.htm" />
      <seealso cref="CommandConnections.Remove" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.CommandConnections.Remove(System.Object)">
      <summary>Removes the specified item from this collection, if it exists.</summary>
      <returns>Returns <c>True</c> when the CommandConnection is removed. Returns <c>False</c> when the CommandConnection is not found.</returns>
      <param name="uiObj">Specifies the user interface object to disconnect.</param>
      <seealso cref="CommandConnections.Add" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.CommandConnections.Clear">
      <summary>Removes all items from the collection.</summary>
      <seealso cref="CommandConnections.Remove" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.CommandConnections.FromControl(System.Object)">
      <summary>Returns the CommandConnection connected to the uiObj parameter.</summary>
      <returns>CommandConnection connected to the uiObj parameter. When no CommandConnection exists for this control, this method returns <c>NULL</c>.</returns>
      <param name="uiObj">Specifies the connected user interface object.</param>
    </member>
    <member name="T:NationalInstruments.TestStand.Interop.UI.Support.SequenceViewConnection">
      <summary>Represents a connection from a SequenceFileView Manager control to a SequenceView control. The SequenceView control shows the contents of the current sequence in the SequenceFileView Manager control. Use the SequenceFileViewMgr.Connections property to obtain a collection of SequenceViewConnection objects.</summary>
      <seealso cref="&quot;SequenceFileView Manager&quot;SequenceFileViewMgr.htm" />
      <seealso cref="&quot;SequenceFileViewMgr.Connections&quot;SequenceFileViewMgr_Connections_P.htm" />
      <seealso cref="&quot;SequenceView&quot;SequenceView.htm" />
      <seealso cref="SequenceViewConnections" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.SequenceViewConnection.UIControl">
      <summary>Returns the user interface control the connection connects to a SequenceFileView Manager control.</summary>
      <seealso cref="&quot;SequenceFileView Manager&quot;SequenceFileViewMgr.htm" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.SequenceViewConnection.DoubleClickEditsStepProperties">
      <summary>Specifies whether the connected SequenceView control displays the Step Properties dialog box when editing is enabled and the user double-clicks a step. This property defaults to <c>True</c>. Set the property to <c>False</c> if you implement an alternate behavior for double-clicking a step in a sequence file.</summary>
      <seealso cref="&quot;SequenceView&quot;SequenceView.htm" />
      <seealso cref="&quot;Step Properties dialog box&quot;javascript:RefLink('/InfoTopics/DB_Step_Prop.htm')" />
    </member>
    <member name="T:NationalInstruments.TestStand.Interop.UI.Support.SequenceViewConnections">
      <summary>A collection of SequenceViewConnection objects you obtain by calling  the SequenceFileViewMgr.Connections property.</summary>
      <seealso cref="&quot;SequenceFileViewMgr.ConnectSequenceView&quot;SequenceFileViewMgr_ConnectSequenceView_M.htm" />
      <seealso cref="&quot;SequenceFileViewMgr.Connections&quot;SequenceFileViewMgr_Connections_P.htm" />
      <seealso cref="SequenceViewConnection" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.SequenceViewConnections.Item(System.Int32)">
      <summary>Returns a reference to an item at the specified index in the collection.</summary>
      <returns>Item located at the specified index.</returns>
      <param name="itemIndex">Specifies the index of the item to retrieve.</param>
      <seealso cref="SequenceViewConnection" />
      <seealso cref="SequenceViewConnections.Count" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.SequenceViewConnections.Count">
      <summary>Returns the number of items in the collection.</summary>
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.SequenceViewConnections.Add(System.Object)">
      <summary>Creates and adds a new SequenceViewConnection to the collection.</summary>
      <returns>New SequenceViewConnection.</returns>
      <param name="uiObj">Specifies the user interface object to connect.</param>
      <seealso cref="&quot;SequenceFileViewMgr.ConnectSequenceView&quot;SequenceFileViewMgr_ConnectSequenceView_M.htm" />
      <seealso cref="SequenceViewConnections.Remove" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.SequenceViewConnections.Remove(System.Object)">
      <summary>Removes the specified item from this collection, if it exists.</summary>
      <returns>Returns <c>True</c> when the SequenceViewConnection is removed. Returns <c>False</c> when the SequenceViewConnection is not found.</returns>
      <param name="uiObj">Specifies the user interface object to disconnect.</param>
      <seealso cref="SequenceViewConnections.Add" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.SequenceViewConnections.Clear">
      <summary>Removes all items from the collection.</summary>
      <seealso cref="SequenceViewConnections.Remove" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.SequenceViewConnections.FromControl(System.Object)">
      <summary>Returns the SequenceViewConnection connected to the uiObj parameter.</summary>
      <returns>SequenceViewConnection connected to the uiObj parameter. When no SequenceViewConnection exists for this control, this method returns <c>NULL</c>.</returns>
      <param name="uiObj">Specifies the connected user interface object.</param>
    </member>
    <member name="T:NationalInstruments.TestStand.Interop.UI.Support.SequenceFileListConnection">
      <summary>Represents a connection from a SequenceFileView Manager control to a control that displays a list of open sequence files. Use the connected control to select a sequence file to open in the SequenceFileView Manager control from the list of sequence files.</summary>
      <seealso cref="SequenceFileListConnections" />
      <seealso cref="&#xD;&#xA;&quot;SequenceFileView Manager&quot;SequenceFileViewMgr.htm" />
      <seealso cref="&#xD;&#xA;&quot;SequenceFileViewMgr.ConnectSequenceFileList&quot;SequenceFileViewMgr_ConnectSequenceFileList_M.htm" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.SequenceFileListConnection.ShowFullPath">
      <summary>When this property is <c>True</c>, the connected control displays the full path for all sequence files. Otherwise, the connected control displays only filenames.</summary>
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.SequenceFileListConnection.ShowCommentInTip">
      <summary>Specifies whether the item tooltip includes the sequence file comment in controls you connect to display the list of loaded sequence files.</summary>
    </member>
    <member name="T:NationalInstruments.TestStand.Interop.UI.Support.SequenceFileListConnections">
      <summary>A collection of SequenceFileListConnection objects.</summary>
      <seealso cref="SequenceFileListConnection" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.SequenceFileListConnections.Item(System.Int32)">
      <summary>Returns a reference to an item at the specified index in the collection.</summary>
      <returns>Item located at the specified index.</returns>
      <param name="itemIndex">Specifies the index of the item to retrieve.</param>
      <seealso cref="SequenceFileListConnection" />
      <seealso cref="SequenceFileListConnections.Count" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.SequenceFileListConnections.Count">
      <summary>Returns the number of items in the collection.</summary>
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.SequenceFileListConnections.Add(System.Object)">
      <summary>Creates and adds a new SequenceFileListConnection to the collection.</summary>
      <returns>New SequenceFileListConnection.</returns>
      <param name="uiObj">Specifies the user interface object to connect.</param>
      <seealso cref="SequenceFileListConnections.Remove" />
      <seealso cref="&quot;SequenceFileViewMgr.ConnectSequenceFileList&quot;SequenceFileViewMgr_ConnectSequenceFileList_M.htm" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.SequenceFileListConnections.Remove(System.Object)">
      <summary>Removes the specified item from this collection, if it exists.</summary>
      <returns>Returns <c>True</c> when the SequenceFileListConnection is removed. Returns <c>False</c> when the SequenceFileListConnection is not found.</returns>
      <param name="uiObj">Specifies the user interface object to disconnect.</param>
      <seealso cref="SequenceFileListConnections.Add" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.SequenceFileListConnections.Clear">
      <summary>Removes all items from the collection.</summary>
      <seealso cref="SequenceFileListConnections.Remove" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.SequenceFileListConnections.FromControl(System.Object)">
      <summary>Returns the SequenceFileListConnection connected to the uiObj parameter.</summary>
      <returns>SequenceFileListConnection connected to the uiObj parameter. When no SequenceFileListConnection exists for this control, this method returns <c>NULL</c>.</returns>
      <param name="uiObj">Specifies the connected user interface object.</param>
    </member>
    <member name="T:NationalInstruments.TestStand.Interop.UI.Support.SequenceListConnection">
      <summary>Represents a connection from a SequenceFileView Manager control to a control that displays a list of sequences for the current sequence file. Use the connected control to select the sequence to display.</summary>
      <seealso cref="SequenceListConnections" />
      <seealso cref="&quot;SequenceFileView Manager&quot;SequenceFileViewMgr.htm" />
      <seealso cref="&quot;SequenceFileViewMgr.ConnectSequenceList&quot;SequenceFileViewMgr_ConnectSequenceList_M.htm" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.SequenceListConnection.UIControl">
      <summary>Returns the user interface control the connection connects to a SequenceFileView Manager control.</summary>
      <seealso cref="&quot;SequenceFileView Manager&quot;SequenceFileViewMgr.htm" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.SequenceListConnection.GetColumnVisible(NationalInstruments.TestStand.Interop.UI.Support.SeqListConnectionColumns)">
      <summary>Returns a Boolean value that indicates whether the column is visible.</summary>
      <param name="column">Specifies the column to select.</param>
      <seealso cref="SequenceListConnection.SetColumnVisible" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.SequenceListConnection.SetColumnVisible(NationalInstruments.TestStand.Interop.UI.Support.SeqListConnectionColumns,System.Boolean)">
      <summary>Specifies whether the column is visible.</summary>
      <remarks>You cannot hide the <c>SeqListConnectionColumn_Label</c> column.</remarks>
      <param name="column">Specifies the column to select.</param>
      <param name="val">Pass <c>False</c> to hide the column. Otherwise, the column is visible. </param>
      <seealso cref="SequenceListConnection.GetColumnVisible" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.SequenceListConnection.ShowCommentInTip">
      <summary>Specifies whether the item tooltip includes the sequence comment in controls you connect to display the list of sequences in the selected sequence file.</summary>
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.SequenceListConnection.GetColumnIndex(NationalInstruments.TestStand.Interop.UI.Support.SeqListConnectionColumns)">
      <summary>When the specified column is visible, this method returns the index of the column within the ListBoxColumns collection. Otherwise, this method returns <c>-1</c>.</summary>
      <remarks>Use this index in the ListBoxColumns.Item property to return the ListBoxColumn for a specific column.</remarks>
      <param name="column">Specifies the column to select.</param>
      <seealso cref="&quot;ListBox.ColumnSet&quot;ListBox_ColumnSet_P.htm" />
      <seealso cref="&quot;ListBoxColumn&quot;ListBoxColumn.htm" />
      <seealso cref="&quot;ListBoxColumns&quot;ListBoxColumns.htm" />
      <seealso cref="&quot;ListBoxColumns.Item&quot;ListBoxColumns_Item_P.htm" />
      <seealso cref="SequenceListConnection.GetColumnVisible" />
    </member>
    <member name="T:NationalInstruments.TestStand.Interop.UI.Support.SequenceListConnections">
      <summary>A collection of SequenceListConnection objects.</summary>
      <seealso cref="&quot;SequenceFileViewMgr.ConnectSequenceList&quot;SequenceFileViewMgr_ConnectSequenceList_M.htm" />
      <seealso cref="SequenceListConnection" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.SequenceListConnections.Item(System.Int32)">
      <summary>Returns a reference to an item at the specified index in the collection.</summary>
      <returns>Item located at the specified index.</returns>
      <param name="itemIndex">Specifies the index of the item to retrieve.</param>
      <seealso cref="SequenceListConnection" />
      <seealso cref="SequenceListConnections.Count" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.SequenceListConnections.Count">
      <summary>Returns the number of items in the collection.</summary>
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.SequenceListConnections.Add(System.Object)">
      <summary>Creates and adds a new SequenceListConnection to the collection.</summary>
      <returns>New SequenceListConnection.</returns>
      <param name="uiObj">Specifies the user interface object to connect.</param>
      <seealso cref="&quot;SequenceFileViewMgr.ConnectSequenceList&quot;SequenceFileViewMgr_ConnectSequenceList_M.htm" />
      <seealso cref="SequenceListConnections.Remove" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.SequenceListConnections.Remove(System.Object)">
      <summary>Removes the specified item from this collection, if it exists.</summary>
      <returns>Returns <c>True</c> when the SequenceListConnection is removed. Returns <c>False</c> when the SequenceListConnection is not found.</returns>
      <param name="uiObj">Specifies the user interface object to disconnect.</param>
      <seealso cref="SequenceListConnections.Add" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.SequenceListConnections.Clear">
      <summary>Removes all items from the collection.</summary>
      <seealso cref="SequenceListConnections.Remove" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.SequenceListConnections.FromControl(System.Object)">
      <summary>Returns the SequenceListConnection connected to the uiObj parameter.</summary>
      <returns>SequenceListConnection connected to the uiObj parameter. When no SequenceListConnection exists for this control, this method returns <c>NULL</c>.</returns>
      <param name="uiObj">Specifies the connected user interface object.</param>
    </member>
    <member name="T:NationalInstruments.TestStand.Interop.UI.Support.StepGroupListConnection">
      <summary>Represents a connection from a SequenceFileView Manager control to a control that displays the list of step groups. Use the connected control to select the step group for the current sequence.
<para>Note: This class currently contains no properties or methods. Properties or methods might be added to this class in future versions of TestStand.</para></summary>
      <seealso cref="&quot;SequenceFileView Manager&quot;SequenceFileViewMgr.htm" />
      <seealso cref="StepGroupListConnections" />
    </member>
    <member name="T:NationalInstruments.TestStand.Interop.UI.Support.StepGroupListConnections">
      <summary>A collection of StepGroupListConnection objects.</summary>
      <seealso cref="&quot;SequenceFileViewMgr.ConnectStepGroupList&quot;SequenceFileViewMgr_ConnectStepGroupList_M.htm" />
      <seealso cref="StepGroupListConnection" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.StepGroupListConnections.Item(System.Int32)">
      <summary>Returns a reference to an item at the specified index in the collection.</summary>
      <returns>Item located at the specified index.</returns>
      <param name="itemIndex">Specifies the index of the item to retrieve.</param>
      <seealso cref="StepGroupListConnection" />
      <seealso cref="StepGroupListConnections.Count" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.StepGroupListConnections.Count">
      <summary>Returns the number of items in the collection.</summary>
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.StepGroupListConnections.Add(System.Object)">
      <summary>Creates and adds a new StepGroupListConnection to the collection.</summary>
      <returns>New StepGroupListConnection.</returns>
      <param name="uiObj">Specifies the user interface object to connect.</param>
      <seealso cref="&quot;SequenceFileViewMgr.ConnectStepGroupList&quot;SequenceFileViewMgr_ConnectStepGroupList_M.htm" />
      <seealso cref="StepGroupListConnections.Remove" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.StepGroupListConnections.Remove(System.Object)">
      <summary>Removes the specified item from this collection, if it exists.</summary>
      <returns>Returns <c>True</c> when the StepGroupListConnection is removed. Returns <c>False</c> when the StepGroupListConnection is not found.</returns>
      <param name="uiObj">Specifies the user interface object to disconnect.</param>
      <seealso cref="StepGroupListConnections.Add" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.StepGroupListConnections.Clear">
      <summary>Removes all items from the collection.</summary>
      <seealso cref="StepGroupListConnections.Remove" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.StepGroupListConnections.FromControl(System.Object)">
      <summary>Returns the StepGroupListConnection connected to the uiObj parameter.</summary>
      <returns>StepGroupListConnection connected to the uiObj parameter. When no StepGroupListConnection exists for this control, this method returns <c>NULL</c>.</returns>
      <param name="uiObj">Specifies the connected user interface object.</param>
    </member>
    <member name="T:NationalInstruments.TestStand.Interop.UI.Support.SequenceFileViewMgrConnections">
      <summary>Contains the connections for the SequenceFileView Manager control.</summary>
      <seealso cref="ApplicationMgrConnections" />
      <seealso cref="ExecutionViewMgrConnections" />
      <seealso cref="&quot;SequenceFileView Manager&quot;SequenceFileViewMgr.htm" />
      <seealso cref="&quot;SequenceFileViewMgr.Connections&quot;SequenceFileViewMgr_Connections_P.htm" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.SequenceFileViewMgrConnections.Variables">
      <summary>Collection of VariablesConnection objects.</summary>
      <seealso cref="SequenceFileViewMgr.ConnectVariables" />
      <seealso cref="VariablesConnection" />
      <seealso cref="VariablesConnections" />
      <seealso cref="&#xD;&#xA;" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.SequenceFileViewMgrConnections.SequenceFileList">
      <summary>Collection of SequenceFileListConnection objects.</summary>
      <seealso cref="SequenceFileListConnection" />
      <seealso cref="SequenceFileListConnections" />
      <seealso cref="&quot;SequenceFileViewMgr.ConnectSequenceFileList&quot;SequenceFileViewMgr_ConnectSequenceFileList_M.htm" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.SequenceFileViewMgrConnections.SequenceList">
      <summary>Collection of SequenceListConnection objects.</summary>
      <seealso cref="&quot;SequenceFileViewMgr.ConnectSequenceList&quot;SequenceFileViewMgr_ConnectSequenceList_M.htm" />
      <seealso cref="SequenceListConnection" />
      <seealso cref="SequenceListConnections" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.SequenceFileViewMgrConnections.StepGroupList">
      <summary>Collection of StepGroupListConnection objects.</summary>
      <seealso cref="&quot;SequenceFileViewMgr.ConnectStepGroupList&quot;SequenceFileViewMgr_ConnectStepGroupList_M.htm" />
      <seealso cref="StepGroupListConnection" />
      <seealso cref="StepGroupListConnections" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.SequenceFileViewMgrConnections.SequenceView">
      <summary>Collection of SequenceViewConnection objects.</summary>
      <seealso cref="&quot;SequenceFileViewMgr.ConnectSequenceView&quot;SequenceFileViewMgr_ConnectSequenceView_M.htm" />
      <seealso cref="SequenceViewConnection" />
      <seealso cref="SequenceViewConnections" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.SequenceFileViewMgrConnections.Command">
      <summary>Collection of CommandConnection objects.</summary>
      <seealso cref="CommandConnection" />
      <seealso cref="CommandConnections" />
      <seealso cref="&quot;SequenceFileViewMgr.ConnectCommand&quot;SequenceFileViewMgr_ConnectCommand_M.htm" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.SequenceFileViewMgrConnections.Caption">
      <summary>Collection of CaptionConnection objects.</summary>
      <seealso cref="CaptionConnection" />
      <seealso cref="CaptionConnections" />
      <seealso cref="&quot;SequenceFileViewMgr.ConnectCaption&quot;SequenceFileViewMgr_ConnectCaption_M.htm" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.SequenceFileViewMgrConnections.Image">
      <summary>Collection of ImageConnection objects.</summary>
      <seealso cref="ImageConnection" />
      <seealso cref="ImageConnections" />
      <seealso cref="&quot;SequenceFileViewMgr.ConnectImage&quot;SequenceFileViewMgr_ConnectImage_M.htm" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.SequenceFileViewMgrConnections.InsertionPalettes">
      <summary>Collection of InsertionPaletteConnection objects.</summary>
      <seealso cref="InsertionPaletteConnection" />
      <seealso cref="InsertionPaletteConnections" />
      <seealso cref="SequenceFileViewMgr.ConnectInsertionPalette" />
      <seealso cref="&#xD;&#xA;" />
    </member>
    <member name="T:NationalInstruments.TestStand.Interop.UI.Support.ExecutionViewConnection">
      <summary>Represents a connection from an ExecutionView Manager control to an ExecutionViewMgrConnections.ExecutionView property. When tracing is enabled, the connected control shows the steps of the execution as they are executing. Use the ExecutionViewMgr.Connections property to obtain a collection of ExecutionViewConnection objects.</summary>
      <seealso cref="&quot;ExecutionViewMgrConnections.ExecutionView&quot;ExecutionViewMgrConnections_ExecutionView_P.htm" />
      <seealso cref="&quot;ExecutionView Manager&quot;ExecutionViewMgr.htm" />
      <seealso cref="ExecutionViewConnections" />
      <seealso cref="&quot;ExecutionViewMgr.Connections&quot;ExecutionViewMgr_Connections_P.htm" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.ExecutionViewConnection.ColorRunning">
      <summary>Specifies the background color of the control when the execution in the ExecutionView Manager control is running. This setting is ignored when the value of the ExecutionViewConnection.Options property is <c>ExecutionViewConnection_IgnoreColors</c>.</summary>
      <seealso cref="ExecutionViewConnection.Options" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.ExecutionViewConnection.ColorPaused">
      <summary>Specifies the background color of the control when the execution in the ExecutionView Manager control is paused. This setting is ignored when the value of the ExecutionViewConnection.Options property is <c>ExecutionViewConnection_IgnoreColors</c>.</summary>
      <seealso cref="ExecutionViewConnection.Options" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.ExecutionViewConnection.ColorStopped">
      <summary>Specifies the background color of the control when the execution in the ExecutionView Manager control is stopped. This setting is ignored when the value of the ExecutionViewConnection.Options property is <c>ExecutionViewConnection_IgnoreColors</c>.</summary>
      <seealso cref="ExecutionViewConnection.Options" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.ExecutionViewConnection.Options">
      <summary>Specifies the behavior of the ExecutionViewConnection. The value of this property is a bitwise-OR combination of the ExecutionViewOptions constants.</summary>
      <seealso cref="&quot;ExecutionViewOptions&quot;ExecutionViewOptions.htm" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.ExecutionViewConnection.UIControl">
      <summary>Returns the user interface control the connection connects to an ExecutionView Manager control.</summary>
      <seealso cref="&quot;ExecutionView Manager&quot;ExecutionViewMgr.htm" />
    </member>
    <member name="T:NationalInstruments.TestStand.Interop.UI.Support.ExecutionViewConnections">
      <summary>A collection of ExecutionViewConnection objects you obtain by calling the ExecutionViewMgr.Connections property.</summary>
      <seealso cref="ExecutionViewConnection" />
      <seealso cref="&quot;ExecutionViewMgr.Connections&quot;ExecutionViewMgr_Connections_P.htm" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.ExecutionViewConnections.Item(System.Int32)">
      <summary>Returns a reference to an item at the specified index in the collection.</summary>
      <returns>Item located at the specified index.</returns>
      <param name="itemIndex">Specifies the index of the item to retrieve.</param>
      <seealso cref="ExecutionViewConnection" />
      <seealso cref="ExecutionViewConnections.Count" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.ExecutionViewConnections.Count">
      <summary>Returns the number of items in the collection.</summary>
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.ExecutionViewConnections.Add(System.Object)">
      <summary>Creates and adds a new ExecutionViewConnection to the collection.</summary>
      <returns>New ExecutionViewConnection.</returns>
      <param name="uiObj">Specifies the user interface object to connect.</param>
      <seealso cref="ExecutionViewConnections.Remove" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.ExecutionViewConnections.Remove(System.Object)">
      <summary>Removes the specified item from this collection, if it exists.</summary>
      <returns>Returns <c>True</c> when the ExecutionViewConnection is removed. Returns <c>False</c> when the ExecutionViewConnection is not found.</returns>
      <param name="uiObj">Specifies the user interface object to disconnect.</param>
      <seealso cref="ExecutionViewConnections.Add" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.ExecutionViewConnections.Clear">
      <summary>Removes all items from the collection.</summary>
      <seealso cref="ExecutionViewConnections.Remove" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.ExecutionViewConnections.FromControl(System.Object)">
      <summary>Returns the ExecutionViewConnection that is connected to the uiObj parameter.</summary>
      <returns>ExecutionViewConnection connected to the uiObj parameter. When no ExecutionViewConnection exists for this control, this method returns <c>NULL</c>.</returns>
      <param name="uiObj">Specifies the connected user interface object.</param>
    </member>
    <member name="T:NationalInstruments.TestStand.Interop.UI.Support.CallStackConnection">
      <summary>Represents a connection from the ExecutionView Manager control to a control that displays the callstack. You can use the connected control to change the selected sequence context when the execution is paused.
<para>Note: This class currently contains no properties or methods. Properties or methods might be added to this class in future versions of TestStand.</para></summary>
      <seealso cref="CallStackConnections" />
      <seealso cref="&#xD;&#xA;&quot;ExecutionView Manager&quot;ExecutionViewMgr.htm" />
    </member>
    <member name="T:NationalInstruments.TestStand.Interop.UI.Support.CallStackConnections">
      <summary>A collection of CallStackConnection objects.</summary>
      <seealso cref="CallStackConnection" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.CallStackConnections.Item(System.Int32)">
      <summary>Returns a reference to an item at the specified index in the collection.</summary>
      <returns>Item located at the specified index.</returns>
      <param name="itemIndex">Specifies the index of the item to retrieve.</param>
      <seealso cref="CallStackConnection" />
      <seealso cref="CallStackConnections.Count" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.CallStackConnections.Count">
      <summary>Returns the number of items in the collection.</summary>
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.CallStackConnections.Add(System.Object)">
      <summary>Creates and adds a new CallStackConnection to the collection.</summary>
      <returns>New CallStackConnection.</returns>
      <param name="uiObj">Specifies the user interface object to connect.</param>
      <seealso cref="CallStackConnections.Remove" />
      <seealso cref="&quot;ExecutionViewMgr.ConnectCallStack&quot;ExecutionViewMgr_ConnectCallStack_M.htm" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.CallStackConnections.Remove(System.Object)">
      <summary>Removes the specified item from this collection, if it exists.</summary>
      <returns>Returns <c>True</c> when the CallStackConnection is removed. Returns <c>False</c> when the CallStackConnection is not found.</returns>
      <param name="uiObj">Specifies the user interface object to disconnect.</param>
      <seealso cref="CallStackConnection" />
      <seealso cref="CallStackConnections.Add" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.CallStackConnections.Clear">
      <summary>Removes all items from the collection.</summary>
      <seealso cref="CallStackConnections.Remove" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.CallStackConnections.FromControl(System.Object)">
      <summary>Returns the CallStackConnection connected to the UI object.</summary>
      <returns>CallStackConnection connected to this user interface object. When no CallStackConnection exists for this control, this method returns <c>NULL</c>.</returns>
      <param name="uiObj">Specifies the connected user interface object.</param>
    </member>
    <member name="T:NationalInstruments.TestStand.Interop.UI.Support.ThreadListConnection">
      <summary>Represents a connection from the ExecutionView Manager control to a control that displays the list of threads in the execution. You can use the connected control to display the foreground thread and to change the foreground thread when the execution is paused.
<para>Note: This class currently contains no properties or methods. Properties or methods might be added to this class in future versions of TestStand.</para></summary>
      <seealso cref="&quot;ExecutionView Manager&quot;ExecutionViewMgr.htm" />
      <seealso cref="ThreadListConnections" />
    </member>
    <member name="T:NationalInstruments.TestStand.Interop.UI.Support.ThreadListConnections">
      <summary>A collection of ThreadListConnection objects.</summary>
      <seealso cref="&quot;ExecutionViewMgr.ConnectThreadList&quot;ExecutionViewMgr_ConnectThreadList_M.htm" />
      <seealso cref="ThreadListConnection" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.ThreadListConnections.Item(System.Int32)">
      <summary>Returns a reference to an item at the specified index in the collection.</summary>
      <returns>Item located at the specified index.</returns>
      <param name="itemIndex">Specifies the index of the item to retrieve.</param>
      <seealso cref="ThreadListConnection" />
      <seealso cref="ThreadListConnections.Count" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.ThreadListConnections.Count">
      <summary>Returns the number of items in the collection.</summary>
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.ThreadListConnections.Add(System.Object)">
      <summary>Creates and adds a new ThreadListConnection to the collection.</summary>
      <returns>New ThreadListConnection.</returns>
      <param name="uiObj">Specifies the user interface object to connect.</param>
      <seealso cref="&quot;ExecutionViewMgr.ConnectThreadList&quot;ExecutionViewMgr_ConnectThreadList_M.htm" />
      <seealso cref="ThreadListConnections.Remove" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.ThreadListConnections.Remove(System.Object)">
      <summary>Removes the specified item from this collection, if it exists.</summary>
      <returns>Returns <c>True</c> when the ThreadListConnection is removed. Returns <c>False</c> when the ThreadListConnection is not found.</returns>
      <param name="uiObj">Specifies the user interface object to disconnect.</param>
      <seealso cref="ThreadListConnections.Add" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.ThreadListConnections.Clear">
      <summary>Removes all items from the collection.</summary>
      <seealso cref="ThreadListConnections.Remove" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.ThreadListConnections.FromControl(System.Object)">
      <summary>Returns the ThreadListConnection connected to the uiObj parameter.</summary>
      <returns>ThreadListConnection connected to the uiObj parameter. When no ThreadListConnection exists for this control, this method returns <c>NULL</c>.</returns>
      <param name="uiObj">Specifies the connected user interface object.</param>
    </member>
    <member name="T:NationalInstruments.TestStand.Interop.UI.Support.ExecutionListConnection">
      <summary>Represents a connection from the ExecutionView Manager control to a control that displays the list of currently running executions. You can use the connected control to select an execution from the list of executions.</summary>
      <seealso cref="ExecutionListConnections" />
      <seealso cref="&#xD;&#xA;&quot;ExecutionView Manager&quot;ExecutionViewMgr.htm" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.ExecutionListConnection.ShowHiddenExecutions">
      <summary>When this property is <c>True</c>, the execution list shows executions created with the <c>ExecTypeMask_InitiallyHidden</c> flag.</summary>
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.ExecutionListConnection.DisplayExpression">
      <summary>Specifies how to display executions in the execution list using a format expression. By default, the value of this property is <c>&quot;%CurrentExecution%&quot;</c>. Refer to the CaptionSource_MacroExpression enumeration value for more information about types of caption sources.</summary>
      <seealso cref="&quot;CaptionSource_MacroExpression&quot;CaptionSources.htm" />
    </member>
    <member name="T:NationalInstruments.TestStand.Interop.UI.Support.ExecutionListConnections">
      <summary>A collection of ExecutionListConnection objects.</summary>
      <seealso cref="ExecutionListConnection" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.ExecutionListConnections.Item(System.Int32)">
      <summary>Returns a reference to an item at the specified index in the collection.</summary>
      <returns>Item located at the specified index.</returns>
      <param name="itemIndex">Specifies the index of the item to retrieve.</param>
      <seealso cref="ExecutionListConnection" />
      <seealso cref="ExecutionListConnections.Count" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.ExecutionListConnections.Count">
      <summary>Returns the number of items in the collection.</summary>
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.ExecutionListConnections.Add(System.Object)">
      <summary>Creates and adds a new ExecutionListConnection to the collection.</summary>
      <returns>New ExecutionListConnection.</returns>
      <param name="uiObj">Specifies the user interface object to connect.</param>
      <seealso cref="ExecutionListConnections.Remove" />
      <seealso cref="&quot;ExecutionViewMgr.ConnectExecutionList&quot;ExecutionViewMgr_ConnectExecutionList_M.htm" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.ExecutionListConnections.Remove(System.Object)">
      <summary>Removes the specified item from this collection, if it exists.</summary>
      <returns>Returns <c>True</c> when the ExecutionListConnection is removed. Returns <c>False</c> when the <c>ExecutionListConnection</c> is not found.</returns>
      <param name="uiObj">Specifies the user interface object to disconnect.</param>
      <seealso cref="ExecutionListConnection" />
      <seealso cref="ExecutionListConnections.Add" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.ExecutionListConnections.Clear">
      <summary>Removes all items from the collection.</summary>
      <seealso cref="ExecutionListConnections.Remove" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.ExecutionListConnections.FromControl(System.Object)">
      <summary>Returns the ExecutionListConnection connected to the uiObj parameter.</summary>
      <returns>ExecutionListConnection connected to the uiObj parameter. When no ExecutionListConnection exists for this control, this method returns <c>NULL</c>.</returns>
      <param name="uiObj">Specifies the connected user interface object.</param>
    </member>
    <member name="T:NationalInstruments.TestStand.Interop.UI.Support.ReportViewConnection">
      <summary>Represents a connection from the ExecutionView Manager control to a control that displays a report associated with an execution.
<para>Note: This class currently contains no properties or methods. Properties or methods might be added to this class in future versions of TestStand.</para></summary>
      <seealso cref="&quot;ExecutionView Manager&quot;ExecutionViewMgr.htm" />
      <seealso cref="ReportViewConnections" />
    </member>
    <member name="T:NationalInstruments.TestStand.Interop.UI.Support.ReportViewConnections">
      <summary>A collection of ReportViewConnection objects.</summary>
      <seealso cref="ReportViewConnection" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.ReportViewConnections.Item(System.Int32)">
      <summary>Returns a reference to an item at the specified index in the collection.</summary>
      <returns>Item located at the specified index.</returns>
      <param name="itemIndex">Specifies the index of the item to retrieve.</param>
      <seealso cref="ReportViewConnection" />
      <seealso cref="ReportViewConnections.Count" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.ReportViewConnections.Count">
      <summary>Returns the number of items in the collection.</summary>
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.ReportViewConnections.Add(System.Object)">
      <summary>Creates and adds a new ReportViewConnection to the collection.</summary>
      <returns>New ReportViewConnection.</returns>
      <param name="uiObj">Specifies the user interface object to connect.</param>
      <seealso cref="&quot;ExecutionViewMgr.ConnectReportView&quot;ExecutionViewMgr_ConnectReportView_M.htm" />
      <seealso cref="ReportViewConnections.Remove" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.ReportViewConnections.Remove(System.Object)">
      <summary>Removes the specified item from this collection, if it exists.</summary>
      <returns>Returns <c>True</c> when the ReportViewConnection is removed. Returns <c>False</c> when the ReportViewConnection is not found.</returns>
      <param name="uiObj">Specifies the user interface object to disconnect.</param>
      <seealso cref="ReportViewConnections.Add" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.ReportViewConnections.Clear">
      <summary>Removes all items from the collection.</summary>
      <seealso cref="ReportViewConnections.Remove" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.ReportViewConnections.FromControl(System.Object)">
      <summary>Returns the ReportViewConnection connected to the uiObj parameter.</summary>
      <returns>ReportViewConnection connected to the uiObj parameter. When no ReportViewConnection exists for this control, this method returns <c>NULL</c>.</returns>
      <param name="uiObj">Specifies the connected user interface object.</param>
    </member>
    <member name="T:NationalInstruments.TestStand.Interop.UI.Support.ExecutionViewMgrConnections">
      <summary>Contains the connections for an ExecutionView Manager control.</summary>
      <seealso cref="ApplicationMgrConnections" />
      <seealso cref="&#xD;&#xA;&quot;ExecutionView Manager&quot;ExecutionViewMgr.htm" />
      <seealso cref="SequenceFileViewMgrConnections" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.ExecutionViewMgrConnections.Variables">
      <summary>Collection of VariablesConnection objects.</summary>
      <seealso cref="ExecutionViewMgr.ConnectVariables" />
      <seealso cref="VariablesConnection" />
      <seealso cref="VariablesConnections" />
      <seealso cref="&#xD;&#xA;&#xD;&#xA;" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.ExecutionViewMgrConnections.ExecutionView">
      <summary>Collection of ExecutionViewConnection objects.</summary>
      <seealso cref="ExecutionViewConnection" />
      <seealso cref="ExecutionViewConnections" />
      <seealso cref="&quot;ExecutionViewMgr.ConnectExecutionView&quot;ExecutionViewMgr_ConnectExecutionView_M.htm" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.ExecutionViewMgrConnections.ReportView">
      <summary>Collection of ReportViewConnection objects.</summary>
      <seealso cref="&quot;ExecutionViewMgr.ConnectReportView&quot;ExecutionViewMgr_ConnectReportView_M.htm" />
      <seealso cref="ReportViewConnection" />
      <seealso cref="ReportViewConnections" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.ExecutionViewMgrConnections.ExecutionList">
      <summary>Collection of ExecutionListConnection objects.</summary>
      <seealso cref="ExecutionListConnection" />
      <seealso cref="ExecutionListConnections" />
      <seealso cref="&quot;ExecutionViewMgr.ConnectExecutionList&quot;ExecutionViewMgr_ConnectExecutionList_M.htm" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.ExecutionViewMgrConnections.Command">
      <summary>Collection of CommandConnection objects.</summary>
      <seealso cref="CommandConnection" />
      <seealso cref="CommandConnections" />
      <seealso cref="&quot;ExecutionViewMgr.ConnectCommand&quot;ExecutionViewMgr_ConnectCommand_M.htm" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.ExecutionViewMgrConnections.Caption">
      <summary>Collection of CaptionConnection objects.</summary>
      <seealso cref="CaptionConnection" />
      <seealso cref="CaptionConnections" />
      <seealso cref="&quot;ExecutionViewMgr.ConnectCaption&quot;ExecutionViewMgr_ConnectCaption_M.htm" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.ExecutionViewMgrConnections.CallStack">
      <summary>Collection of CallStackConnection objects.</summary>
      <seealso cref="CallStackConnection" />
      <seealso cref="CallStackConnections" />
      <seealso cref="&quot;ExecutionViewMgr.ConnectCallStack&quot;ExecutionViewMgr_ConnectCallStack_M.htm" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.ExecutionViewMgrConnections.ThreadList">
      <summary>Collection of ThreadListConnection objects.</summary>
      <seealso cref="&quot;ExecutionViewMgr.ConnectThreadList&quot;ExecutionViewMgr_ConnectThreadList_M.htm" />
      <seealso cref="ThreadListConnection" />
      <seealso cref="ThreadListConnections" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.ExecutionViewMgrConnections.Image">
      <summary>Collection of ImageConnection objects.</summary>
      <seealso cref="&quot;ExecutionViewMgr.ConnectImage&quot;ExecutionViewMgr_ConnectImage_M.htm" />
      <seealso cref="ImageConnection" />
      <seealso cref="ImageConnections" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.ExecutionViewMgrConnections.Numeric">
      <summary>Collection of NumericConnection objects.</summary>
      <seealso cref="&quot;ExecutionViewMgr.ConnectNumeric&quot;ExecutionViewMgr_ConnectNumeric_M.htm" />
      <seealso cref="NumericConnection" />
      <seealso cref="NumericConnections" />
    </member>
    <member name="T:NationalInstruments.TestStand.Interop.UI.Support.ApplicationMgrConnections">
      <summary>Contains the connections for an Application Manager control. Use the ApplicationMgr.Connections property to obtain a collection of ApplicationMgrConnections objects.</summary>
      <seealso cref="&quot;Application Manager&quot;ApplicationMgr.htm" />
      <seealso cref="&quot;ApplicationMgr.Connections&quot;ApplicationMgr_Connections_P.htm" />
      <seealso cref="ExecutionViewMgrConnections" />
      <seealso cref="SequenceFileViewMgrConnections" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.ApplicationMgrConnections.Command">
      <summary>Collection of CommandConnection objects.</summary>
      <seealso cref="&quot;ApplicationMgr.ConnectCommand&quot;ApplicationMgr_ConnectCommand_M.htm" />
      <seealso cref="CommandConnection" />
      <seealso cref="CommandConnections" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.ApplicationMgrConnections.Caption">
      <summary>Collection of CaptionConnection objects.</summary>
      <seealso cref="&quot;ApplicationMgr.ConnectCaption&quot;ApplicationMgr_ConnectCaption_M.htm" />
      <seealso cref="CaptionConnection" />
      <seealso cref="CaptionConnections" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.ApplicationMgrConnections.AdapterList">
      <summary>Collection of AdapterListConnection objects.</summary>
      <seealso cref="AdapterListConnection" />
      <seealso cref="AdapterListConnections" />
      <seealso cref="ApplicationMgr.ConnectAdapterList" />
    </member>
    <member name="T:NationalInstruments.TestStand.Interop.UI.Support.AdapterListConnection">
      <summary>Represents a connection from an Application Manager control to a control that displays the list of adapters. Use the connected control to select an adapter to which to set the Engine.DefaultAdapter property.
<para>Note: This class currently contains no properties or methods. Properties or methods might be added to this class in future versions of TestStand.</para></summary>
      <seealso cref="&quot;Application Manager&quot;ApplicationMgr.htm" />
      <seealso cref="AdapterListConnections" />
      <seealso cref="&quot;Engine.DefaultAdapter&quot;javascript:APILink('/RefTopics/Engine_DefaultAdapter_P.htm')" />
    </member>
    <member name="T:NationalInstruments.TestStand.Interop.UI.Support.AdapterListConnections">
      <summary>A collection of AdapterListConnection objects.</summary>
      <seealso cref="AdapterListConnection" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.AdapterListConnections.Item(System.Int32)">
      <summary>Returns a reference to an item at the specified index in the collection.</summary>
      <param name="itemIndex">Specifies the zero-based index of the item to retrieve.</param>
      <seealso cref="AdapterListConnection" />
      <seealso cref="AdapterListConnections.Count" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.AdapterListConnections.Count">
      <summary>Returns the number of items in the collection.</summary>
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.AdapterListConnections.Add(System.Object)">
      <summary>Creates and adds a new AdapterListConnection to the collection.</summary>
      <returns>The AdapterListConnection this method creates.</returns>
      <param name="uiObj">Specifies the user interface object to connect.</param>
      <seealso cref="AdapterListConnection" />
      <seealso cref="AdapterListConnections.Remove" />
      <seealso cref="ApplicationMgr.ConnectAdapterList" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.AdapterListConnections.Remove(System.Object)">
      <summary>Removes the specified item from this collection, if it exists.</summary>
      <returns>Returns <c>True</c> when the AdapterListConnection is removed. Returns <c>False</c> when the AdapterListConnection is not found.</returns>
      <param name="uiObj">Specifies the user interface object to disconnect.</param>
      <seealso cref="AdapterListConnection" />
      <seealso cref="AdapterListConnections.Add" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.AdapterListConnections.Clear">
      <summary>Removes all items from the collection.</summary>
      <seealso cref="AdapterListConnections.Remove" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.AdapterListConnections.FromControl(System.Object)">
      <summary>Returns the AdapterListConnection connected to the uiObj parameter. When no AdapterListConnection is connected to the user interface object the parameter specifies, this method returns <c>NULL</c>.</summary>
      <param name="uiObj">Specifies a connected user interface object.</param>
      <seealso cref="AdapterListConnection" />
    </member>
    <member name="T:NationalInstruments.TestStand.Interop.UI.Support.VariablesConnection">
      <summary>Represents a connection from a SequenceFileView Manager or ExecutionView Manager control to a VariablesView control.</summary>
      <seealso cref="&quot;ExecutionView Manager&quot;ExecutionViewMgr.htm" />
      <seealso cref="&quot;SequenceFileView Manager&quot;SequenceFileViewMgr.htm" />
      <seealso cref="&quot;VariablesView&quot;VariablesView.htm" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.VariablesConnection.UIControl">
      <summary>Returns the user interface control that the connection connects to a SequenceFileView Manager or ExecutionView Manager control.</summary>
      <seealso cref="ExecutionViewMgr" />
      <seealso cref="SequenceFileViewMgr" />
    </member>
    <member name="T:NationalInstruments.TestStand.Interop.UI.Support.VariablesConnections">
      <summary>A collection of VariablesConnection objects.</summary>
      <seealso cref="ExecutionViewMgr.ConnectVariables" />
      <seealso cref="SequenceFileViewMgr.ConnectVariables" />
      <seealso cref="VariablesConnection" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.VariablesConnections.Item(System.Int32)">
      <summary>Returns a reference to an item at the specified index in the collection.</summary>
      <returns>Item located at the specified index.</returns>
      <param name="itemIndex">Specifies a zero-based index of the item to retrieve.</param>
      <seealso cref="VariablesConnection" />
      <seealso cref="VariablesConnections.Count" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.VariablesConnections.Count">
      <summary>Returns the number of items in the collection.</summary>
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.VariablesConnections.Add(System.Object)">
      <summary>Creates and adds a new VariablesConnection to the collection.</summary>
      <returns>New VariablesConnection object.</returns>
      <param name="uiObj">Specifies the user interface object to connect.</param>
      <seealso cref="ExecutionViewMgr.ConnectVariables" />
      <seealso cref="SequenceFileViewMgr.ConnectVariables" />
      <seealso cref="VariablesConnections.Remove" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.VariablesConnections.Remove(System.Object)">
      <summary>Removes the specified item from this collection, if it exists.</summary>
      <returns>Returns <c>True</c> when the VariablesConnection is removed. Returns <c>False</c> when the VariablesConnection is not found.</returns>
      <param name="uiObj">Specifies the user interface object to disconnect.</param>
      <seealso cref="VariablesConnection" />
      <seealso cref="VariablesConnections.Add" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.VariablesConnections.Clear">
      <summary>Removes all items from the collection.</summary>
      <seealso cref="VariablesConnections.Remove" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.VariablesConnections.FromControl(System.Object)">
      <summary>Returns the VariablesConnection connected to the uiObj parameter.</summary>
      <returns>VariablesConnection connected to the uiObj parameter. When no VariablesConnection exists for this control, this method returns <c>NULL</c>.</returns>
      <param name="uiObj">Specifies the connected user interface object.</param>
    </member>
    <member name="T:NationalInstruments.TestStand.Interop.UI.Support.SelectedSequences">
      <summary>A collection of selected sequences. You can obtain a reference to the collection from the SequenceFileViewMgr.SelectedSequences property.</summary>
      <seealso cref="&quot;SequenceFileViewMgr.SelectedSequences&quot;SequenceFileViewMgr_SelectedSequences_P.htm" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.SelectedSequences.Item(System.Int32)">
      <summary>Returns a reference to an item at the specified index in the collection.</summary>
      <returns>The sequence at the specified index in the collection.</returns>
      <param name="itemIndex">Specifies the index of the item to retrieve.</param>
      <seealso cref="&quot;Sequence&quot;javascript:APILink('/RefTopics/Sequence.htm')" />
      <seealso cref="SelectedSequences.Count" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.SelectedSequences.Count">
      <summary>Returns the number of items in the collection.</summary>
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.SelectedSequences.Clear">
      <summary>Removes all items from the collection.</summary>
      <seealso cref="SelectedSequences.AddSequence" />
      <seealso cref="SelectedSequences.AddSequences" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.SelectedSequences.AddSequence(NationalInstruments.TestStand.Interop.API.Sequence)">
      <summary>Adds a sequence to the SelectedSequences collection.</summary>
      <param name="val">Specifies the sequence to add.</param>
      <seealso cref="SelectedSequences.AddSequences" />
      <seealso cref="SelectedSequences.Clear" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.SelectedSequences.AddSequences(System.Object[])">
      <summary>Adds an array of sequences to the SelectedSequences collection.</summary>
      <param name="val">Specifies the array of sequences to add.</param>
      <seealso cref="SelectedSequences.AddSequence" />
      <seealso cref="SelectedSequences.Clear" />
      <seealso cref="&#xD;&#xA;" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.SelectedSequences.BeginUpdate">
      <summary>Call this method before making multiple changes to the SelectedSequences collection. When you finish changing the collection, call the SelectedSequences.EndUpdate method to update the TestStand User Interface (UI) Controls according to the changes.</summary>
      <remarks>Use this method to minimize redrawing in the TestStand UI Controls when you programmatically change the selection.</remarks>
      <seealso cref="SelectedSequences.EndUpdate" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.SelectedSequences.EndUpdate">
      <summary>Updates the user interface according to all changes to the SelectedSequences collection you make after a previous call to the SelectedSequences.BeginUpdate method.</summary>
      <seealso cref="SelectedSequences.BeginUpdate" />
    </member>
    <member name="T:NationalInstruments.TestStand.Interop.UI.Support.InsertionPaletteConnection">
      <summary>Represents a connection from a SequenceFileView Manager control to an InsertionPalette control. The InsertionPalette control displays a list of step types and a list of user defined template steps, sequences, and variables. Use the connected control to insert a step, sequence, or variable into a sequence file.</summary>
      <seealso cref="&quot;InsertionPalette&quot;InsertionPalette.htm" />
      <seealso cref="&quot;SequenceFileView Manager&quot;SequenceFileViewMgr.htm" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.InsertionPaletteConnection.UIControl">
      <summary>Returns the user interface control the connection connects to a SequenceFileView Manager control.</summary>
      <seealso cref="SequenceFileViewMgr" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.InsertionPaletteConnection.StepTypesPage">
      <summary>Specifies the index of the Step Types page in the InsertionPalettePages collection.</summary>
      <seealso cref="InsertionPaletteConnection.TemplatesPage" />
      <seealso cref="&quot;InsertionPalettePage&quot;InsertionPalettePage.htm" />
      <seealso cref="&quot;InsertionPalettePages&quot;InsertionPalettePages.htm" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.InsertionPaletteConnection.TemplatesPage">
      <summary>Specifies the index of the Templates page in the InsertionPalettePages collection.</summary>
      <seealso cref="InsertionPaletteConnection.StepTypesPage" />
      <seealso cref="&quot;InsertionPalettePage&quot;InsertionPalettePage.htm" />
      <seealso cref="&quot;InsertionPalettePages&quot;InsertionPalettePages.htm" />
    </member>
    <member name="T:NationalInstruments.TestStand.Interop.UI.Support.InsertionPaletteConnections">
      <summary>A collection of InsertionPaletteConnection objects.</summary>
      <seealso cref="InsertionPaletteConnection" />
      <seealso cref="&quot;SequenceFileViewMgr.ConnectInsertionPalette&quot;SequenceFileViewMgr_ConnectInsertionPalette_M.htm" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.InsertionPaletteConnections.Item(System.Int32)">
      <summary>Returns a reference to an item at the specified index in the collection.</summary>
      <returns>Item located at the specified index.</returns>
      <param name="itemIndex">Specifies the zero-based index of the item to retrieve.</param>
      <seealso cref="InsertionPaletteConnection" />
      <seealso cref="InsertionPaletteConnections.Count" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.InsertionPaletteConnections.Count">
      <summary>Returns the number of items in the collection.</summary>
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.InsertionPaletteConnections.Add(System.Object)">
      <summary>Creates and adds a new InsertionPaletteConnection to the collection.</summary>
      <returns>New InsertionPaletteConnection object.</returns>
      <param name="uiObj">Specifies the user interface object to connect.</param>
      <seealso cref="ExecutionViewMgr.ConnectVariables" />
      <seealso cref="InsertionPaletteConnections.Remove" />
      <seealso cref="SequenceFileViewMgr.ConnectVariables" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.InsertionPaletteConnections.Remove(System.Object)">
      <summary>Removes the specified item from this collection, if it exists.</summary>
      <returns>Returns <c>True</c> when the InsertionPaletteConnection is removed. Returns <c>False</c> when the InsertionPaletteConnection is not found.</returns>
      <param name="uiObj">Specifies the user interface object to disconnect.</param>
      <seealso cref="InsertionPaletteConnections.Add" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.InsertionPaletteConnections.Clear">
      <summary>Removes all items from the collection.</summary>
      <seealso cref="InsertionPaletteConnections.Remove" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.InsertionPaletteConnections.FromControl(System.Object)">
      <summary>Returns the InsertionPaletteConnection connected to the uiObj parameter.</summary>
      <returns>InsertionPaletteConnection connected to this user interface object. When no InsertionPaletteConnection exists for this control, this method returns <c>NULL</c>.</returns>
      <param name="uiObj">Specifies the connected user interface object.</param>
    </member>
    <member name="T:NationalInstruments.TestStand.Interop.UI.Support.SelectedPropertyObjects">
      <summary>A collection of selected property objects. Controls connected to the SequenceFileView Manager and ExecutionView Manager controls, such as the VariablesView, automatically update the collection while active. You can obtain a reference to the collection from the SequenceFileViewMgr.SelectedPropertyObjects and ExecutionViewMgr.SelectedPropertyObjects properties.</summary>
      <seealso cref="&quot;ExecutionViewMgr&quot;ExecutionViewMgr.htm" />
      <seealso cref="&quot;ExecutionViewMgr.SelectedPropertyObjects&quot;ExecutionViewMgr_SelectedPropertyObjects_P.htm" />
      <seealso cref="&quot;SequenceFileViewMgr&quot;SequenceFileViewMgr.htm" />
      <seealso cref="&quot;SequenceFileViewMgr.SelectedPropertyObjects&quot;SequenceFileViewMgr_SelectedPropertyObjects_P.htm" />
      <seealso cref="&quot;VariablesView&quot;VariablesView.htm" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.SelectedPropertyObjects.Item(System.Int32)">
      <summary>Returns a reference to an item at the specified index in the collection.</summary>
      <param name="itemIndex">Specifies a zero-based index of the item to retrieve.</param>
      <seealso cref="&quot;PropertyObject&quot;javascript:APILink('/RefTopics/PropertyObject.htm')" />
      <seealso cref="SelectedPropertyObjects.Count" />
    </member>
    <member name="P:NationalInstruments.TestStand.Interop.UI.Support.SelectedPropertyObjects.Count">
      <summary>Returns the number of items in the collection.</summary>
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.SelectedPropertyObjects.Clear">
      <summary>Removes all items from the collection.</summary>
      <seealso cref="SelectedPropertyObjects.AddPropertyObject" />
      <seealso cref="SelectedPropertyObjects.AddPropertyObjects" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.SelectedPropertyObjects.AddPropertyObject(NationalInstruments.TestStand.Interop.API.PropertyObject)">
      <summary>Adds a property object to the collection.</summary>
      <param name="val">Specifies the property object to add.</param>
      <seealso cref="SelectedPropertyObjects.Clear" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.SelectedPropertyObjects.AddPropertyObjects(System.Object[])">
      <summary>Adds an array of property objects to the collection.</summary>
      <param name="val">Specifies the property objects to add.</param>
      <seealso cref="SelectedPropertyObjects.Clear" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.SelectedPropertyObjects.BeginUpdate">
      <summary>Call this method before you make multiple changes to the SelectedPropertyObjects collection. When you finish changing the collection, call the SelectedPropertyObjects.EndUpdate method to update the TestStand User Interface (UI) Controls according to the changes.</summary>
      <remarks>Use this method to minimize redrawing in the TestStand UI Controls when you programmatically change the selection.</remarks>
      <seealso cref="SelectedPropertyObjects.EndUpdate" />
    </member>
    <member name="M:NationalInstruments.TestStand.Interop.UI.Support.SelectedPropertyObjects.EndUpdate">
      <summary>Updates the TestStand User Interface Controls according to the SelectedPropertyObjects collection changes you make after you call the SelectedPropertyObjects.BeginUpdate method.</summary>
      <seealso cref="SelectedPropertyObjects.BeginUpdate" />
    </member>
    <member name="T:NationalInstruments.TestStand.Interop.UI.Support.SeqListConnectionColumns">
      <summary>These constants represent the column type you can use with the column parameter of the  SequenceListConnection.SetColumnVisible and SequenceListConnection.GetColumnVisible methods.</summary>
      <seealso cref="SequenceListConnection.GetColumnVisible" />
      <seealso cref="SequenceListConnection.SetColumnVisible" />
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.SeqListConnectionColumns.SeqListConnectionColumn_Label">
      <summary>(Value: 0) Specifies the column that contains the name of the sequence.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.SeqListConnectionColumns.SeqListConnectionColumn_Comments">
      <summary>(Value: 1) Specifies the column that contains the comment of the sequence.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.SeqListConnectionColumns.SeqListConnectionColumn_Requirements">
      <summary>(Value: 2) Specifies the column that contains the requirements of the sequence.</summary>
    </member>
    <member name="T:NationalInstruments.TestStand.Interop.UI.Support.SelectionFlags">
      <summary>Use these constants to select step group start or end markers and to expand or collapse step groups. These constants apply only when the application displays more than one step group at a time.
You cannot select step group start and end markers when steps are selected. You cannot select steps and step group end markers in collapsed step groups.
</summary>
      <seealso cref="ExecutionViewMgr.SelectedSteps" />
      <seealso cref="ExecutionViewMgr.StepGroupMode" />
      <seealso cref="SelectedSteps.SelectionFlags" />
      <seealso cref="SequenceFileViewMgr.SelectedSteps" />
      <seealso cref="SequenceFileViewMgr.StepGroupMode" />
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.SelectionFlags.SelectionFlag_NoFlags">
      <summary>(Value: 0) No collapsed step group and no selected step group markers.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.SelectionFlags.SelectionFlag_SetupStartSelected">
      <summary>(Value: 1) Selects the start marker for the Setup step group.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.SelectionFlags.SelectionFlag_MainStartSelected">
      <summary>(Value: 2) Selects the start marker for the Main step group.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.SelectionFlags.SelectionFlag_CleanupStartSelected">
      <summary>(Value: 4) Selects the start marker for the Cleanup step group.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.SelectionFlags.SelectionFlag_SetupEndSelected">
      <summary>(Value: 8) Selects the end marker for the Setup step group.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.SelectionFlags.SelectionFlag_MainEndSelected">
      <summary>(Value: 16) Selects the end marker for the Main step group.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.SelectionFlags.SelectionFlag_CleanupEndSelected">
      <summary>(Value: 32) Selects the end marker for the Cleanup step group.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.SelectionFlags.SelectionFlag_SetupCollapsed">
      <summary>(Value: 64) Collapses the Setup step group.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.SelectionFlags.SelectionFlag_MainCollapsed">
      <summary>(Value: 128) Collapses the Main step group.</summary>
    </member>
    <member name="F:NationalInstruments.TestStand.Interop.UI.Support.SelectionFlags.SelectionFlag_CleanupCollapsed">
      <summary>(Value: 256) Collapses the Cleanup step group.</summary>
    </member>
  </members>
</doc>
Libs/NationalInstruments.TestStand.Interop.UI.dll
Binary files differ
Libs/NationalInstruments.TestStand.Interop.UI.xml
New file
Diff too large
Libs/NationalInstruments.TestStand.Utility.dll
Binary files differ
Libs/NationalInstruments.TestStand.Utility.xml
New file
@@ -0,0 +1,2303 @@
<?xml version="1.0"?>
<doc>
    <assembly>
        <name>NationalInstruments.TestStand.Utility</name>
    </assembly>
    <members>
        <member name="T:NationalInstruments.TestStand.Utility.TSHelper">
            <summary>
            This class contains various methods that can be useful when you use the TestStand API or the TestStand UI Controls API from a .NET language
            </summary>
            <lastupdated>9/29/2011 1:54:18 PM</lastupdated>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.TSHelper.GetTestStandSplashImage">
            <summary>
            Returns  the standard image used as the background TestStand splash screens.
            </summary>
            <returns>The splash screen image.</returns>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.TSHelper.GetTestStandAnimatedSplashImage">
            <summary>
            Returns  the standard animated image used as the background TestStand splash screens.
            </summary>
            <returns>The animated splash screen image.</returns>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.TSHelper.DoSynchronousGCForCOMObjectDestruction">
            <summary>
            This method ensures than any COM objects pending for garbage collection are released before it returns.
            </summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.TSHelper.MakePath(System.String,System.String,System.String)">
            <summary>
            Creates a path with the <paramref name="directory"/>, <paramref name="fileName"/> and
            <paramref name="extension"/> specified by combining the three.
            </summary>
            <param name="directory">The directory part of the path</param>
            <param name="fileName">The file name part of the path</param>
            <param name="extension">
            The extension part of the path. The extension can be passed with or without the dot.
            </param>
            <returns>
            The combined path <paramref name="directory"/>\<paramref name="fileName"/>.<paramref name="extension"/>
            </returns>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.TSHelper.NumericSuffixStartingIndex(System.String)">
            <summary>
            Returns the index of the underscore in the numeric suffix at the end of
            <paramref name="fileName"/>. The numeric suffix is defined as an underscore followed by
            one or more digits.
            </summary>
            <param name="fileName">The file name to get a numeric index from.</param>
            <returns>The index of the underscore in the numeric suffix.</returns>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.TSHelper.GetFileNameWithCountSuffix(System.String,System.Int32)">
            <summary>
            Creates a new file name from the base <paramref name="fileName"/> with a numeric suffix
            with an integer part <paramref name="count"/>
            </summary>
            <example>
            GetFileNameWithCountSuffix("abc", 3) --> "abc_3"
            </example>
            <param name="fileName">The base part of the file name to generate</param>
            <param name="count">The integer part of the suffix of th file name to generate</param>
            <returns>A string with the file name generated from the base and count specified</returns>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.TSHelper.LongCreateUniqueFile(System.String,System.String,System.String)">
            <summary>
            Returns the path of a unique file name in <paramref name="directory"/> with the base
            <paramref name="fileName"/> specified and <paramref name="extension"/>. The method will
            return the result of calling <see cref="M:System.IO.Path.Combine(System.String,System.String)"/> with
            <paramref name="directory"/> and <paramref name="fileName"/> if no file with that name
            already exists in <paramref name="directory"/> or it will create a new unique file name
            with a numeric suffix.
            </summary>
            <param name="directory">The directory where the unique file name will be created</param>
            <param name="fileName">The base part of the file name which will be generated</param>
            <param name="extension">The extension to add to the file name</param>
            <returns>A path guaranteed to be unique in the directory specified.</returns>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.TSHelper.CreateUniqueFile(System.String,System.String,System.String)">
            <summary>
            Returns the path of a unique file name in <paramref name="directory"/> with the base
            <paramref name="fileName"/> specified and <paramref name="extension"/>. The method will
            return the result of calling <see cref="M:System.IO.Path.Combine(System.String,System.String)"/> with
            <paramref name="directory"/> and <paramref name="fileName"/> if no file with that name
            already exists in <paramref name="directory"/> or it will create a new unique file name
            with a numeric suffix.
            </summary>
            <param name="directory">The directory where the unique file name will be created</param>
            <param name="fileName">The base part of the file name which will be generated</param>
            <param name="extension">The extension to add to the file name</param>
            <returns>A path guaranteed to be unique in the directory specified.</returns>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.TSHelper.CreateUniqueFileInternal(System.String,System.String,System.String,System.Boolean)">
            <summary>
            <see cref="M:NationalInstruments.TestStand.Utility.TSHelper.CreateUniqueFile(System.String,System.String,System.String)"/>
            </summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.TSHelper.ParseEnvironmentPathFromArgs(System.String[]@,System.Boolean,System.String)">
             <summary>This is a helper function that command line applications that accept an engine
             environment argument on the command line can use to parse out the environment argument.  The
             environment must be passed with the syntax:
             /env {PATH}
             or, for example,
             /env d:\MyEnv.tsenv
             The argument can appear anywhere on the command line.
             If found, the path is returned and the environment argument is removed from the array.  If no
             environment argument is present, <paramref name="defaultEnvironment"/> is returned and args is left unchanged.
             If multiple environments are specified, only the first is removed from the list and returned.  It is up
             to the command line parsing logic of the application to ignore or error if additional /env arguments
             are present.</summary>
             <param name="args">The command line arguments.  If an environment is found, it will be removed from the
             array.</param>
             <param name="allowExceptions">Pass true to allow this function to generate an exception if the arguments
             are invalid.  Pass false if you are handling command line exceptions elsewhere.  If you use the
             TestStand Application Manager in your application, pass false.</param>
             <param name="defaultEnvironment">if no environment is found, the method returns this value.</param>
             <returns>The environment path if one was passed, null otherwise.</returns>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.TSHelper.MakeEnvironmentArg(System.String)">
            <summary>Create a command line argument to specify the TestStand environment to an application that uses
            the /env "{PATH}" syntax.</summary>
            <param name="path">The path to the environment.</param>
            <returns>An empty string if path is null or empty.  Otherwise, returns
                 /env + "{PATH}"
            enclosed in quotes and preceded by a space.  This is to fascilitate construction of a command
            line.</returns>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.TSHelper.TE_ROOT_KEY">
            <summary>The path to TestStand related keys in the registry relative to HKEY_LOCAL_MACHINE.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.TSHelper.HKLM_TE_ROOT_KEY">
            <summary>The path to TestStand related keys in the registry including HKEY_LOCAL_MACHINE.</summary>
        </member>
        <member name="T:NationalInstruments.TestStand.Utility.Menus">
            <summary>
            This class contains various methods that can be useful when you use the TestStand API or the TestStand UI Controls API from a .NET language
            </summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Menus.TranslateShortcutKeyToDotNet(NationalInstruments.TestStand.Interop.UI.ShortcutKeys,System.Int32)">
            <summary>
                <para>This method converts a ShortcutKeys and ShortcutModifiers into a .NET Shortcut key value. If no equivalent .NET Shortcut value exists, the method returns Shortcut.None.</para>
                <para>Typically, you call a higher level method, such as TSUtil.InsertCommandsInMenu, to create .NET menu items that execute TestStand commands.  In that case, the higher level method calls this method for you to determine the correct menu shortcut values.</para>
            </summary>
            <param name="key">a ShortcutKeys value
            </param>
            <param name="modifier">a ShortcutModifiers value
            </param>
            <returns>the .NET Shortcut value that corresponds to the key and modifier value you specify
            </returns>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Menus.InsertCommandObjectInMenu(NationalInstruments.TestStand.Interop.UI.Command,System.Windows.Forms.Menu,System.Windows.Forms.MenuItem,System.Boolean)">
            <summary>
            Typically, you call InsertCommandsInMenu instead of this method. However, if you have a TestStand.Interop.UI.Command object for which you want to create a menu item, you can call this method directly.
            </summary>
            <param name="command">
            Pass the TestStand.Interop.UI.Command object that represent the action the menu item takes when the user selects it.
            </param>
            <param name="parentMenu">
            Pass the menu into which to insert the menu item.
            </param>
            <param name="menuItemToInsertBefore">
            The MenuItem before which the method inserts the new menu item.  To insert at the end of the menu, pass Nothing (VB) or null (C#)
            </param>
            <param name="useShortCutKeys">
            Pass false to prevent menu items from having shortcut keys.
            </param>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Menus.InsertCommandsInMenu(System.Collections.IList,System.Windows.Forms.Menu,System.Windows.Forms.MenuItem,System.Object,System.Boolean)">
            <summary>
                <para>Use this overload of InsertCommandsInMenu when you do not need to know the actual number of menu items the method inserts.<br></br></para>
                <para>Refer to the other overload of this method for more information.</para>
            </summary>
            <param name="commandTypes">A list in which each element is a TestStand.Interop.UI.CommandKinds value. For each element in the list, the method inserts the corresponding menu item(s) into the menu.
            </param>
            <param name="parentMenu">The menu into which the method inserts the menu items
            </param>
            <param name="menuItemToInsertBefore">
            The MenuItem before which the method inserts the new menu items.  To insert at the end of the menu, pass Nothing (VB) or null (C#)
            </param>
            <param name="managerControl">Pass the TestStand.Interop.UI.SequenceFileViewMgr or TestStand.Interop.UI.ExecutionViewMgr control, if any, to which the new menu item(s) apply. If the commands do not apply to a view manager control, pass the TestStand.Interop.UI.ApplicationMgr control that you placed on one of your application forms.
            </param>
            <param name="useShortCutKeys">
            Pass false to prevent menu items from having shortcut keys.
            </param>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Menus.RemoveInvalidShortcutKeys(NationalInstruments.TestStand.Interop.UI.Commands)">
            <summary>
            .NET does not support certain keys as menu shortcuts. Call this method to remove shortcuts that .NET does not support
            from a Commands collection before calling Commands.InsertIntoWin32Menu
            </summary>
            <param name="commands">
            Pass the TestStand.Interop.UI.Commands object that represent the actions that populate a context menu.
            </param>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Menus.InsertCommandsInMenu(System.Collections.IList,System.Windows.Forms.Menu,System.Windows.Forms.MenuItem,System.Object,System.Int32@,System.Boolean)">
            <summary>
                <para>As an alternative to manually writing menu handler code for common TestStand commands, you can use this method to create new menu items that execute the commands you specify without requiring any additional code.</para>
                <para>To create the menu items, you specify a list of TestStand.Interop.UI.CommandKinds elements. Each element specifies a menu item or group of menu items to insert. To each menu item this method inserts, it attaches a TestStand.Interop.UI.Command object that represents the action the menu item takes.  The method installs an event handler for the menu item that automatically invokes the associated command object when the user selects the menu item.</para>
                <para>Typically, you call this method in response to the MenuStart event to populate the menu with the commands that apply to the current state of the application.  Before you call this method, you can call RemoveMenuCommands to remove any menu items you previously inserted.</para>
            </summary>
            <param name="commandTypes">A list in which each element is a TestStand.Interop.UI.CommandKinds value. For each element in the list, the method inserts the corresponding menu item(s) into the menu.
            </param>
            <param name="parentMenu">The menu into which the method inserts the menu items
            </param>
            <param name="menuItemToInsertBefore">
            The MenuItem before which the method inserts the new menu items.  To insert at the end of the menu, pass Nothing (VB) or null (C#)
            </param>
            <param name="managerControl">Pass the TestStand.Interop.UI.SequenceFileViewMgr or TestStand.Interop.UI.ExecutionViewMgr control, if any, to which the new menu item(s) apply. If the commands do not apply to a view manager control, pass the TestStand.Interop.UI.ApplicationMgr control that you placed on one of your application forms.
            </param>
            <param name="numInserted">This out parameter returns the number of menu items the method inserts.  The number of menu items does not necessarily equal the number of TestStand.Interop.UI.CommandKinds elements you specify because, depending on the CommandType and the state of the application, a single CommandType element might create several menu items or none at all. The parameter counts only items the method adds to the menu you pass. The parameter does not count items the method inserts into submenus the method creates.
            </param>
            <param name="useShortCutKeys">
            Pass false to prevent menu items from having shortcut keys.
            </param>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Menus.InsertCommandCollectionInMenu(NationalInstruments.TestStand.Interop.UI.Commands,System.Windows.Forms.Menu,System.Windows.Forms.MenuItem,System.Boolean)">
            <summary>Typically, you call InsertCommandsInMenu instead of this method. However, if you have a TestStand.Interop.UI.CommandCollection object for which you want to create menu items, you can call this method directly.
            </summary>
            <param name="commandCollection">A TestStand.Interop.UI.CommandCollection that contains the Commands to place in the menu.
            </param>
            <param name="parentMenu">
            The menu into which to insert the menu item.
            </param>
            <param name="menuItemToInsertBefore">
            The MenuItem before which the method inserts the new menu item. To insert at the end of the menu, pass Nothing (VB) or null (C#)
            </param>
            <param name="useShortCutKeys">
            Pass false to prevent menu items from having shortcut keys.
            </param>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Menus.RemoveMenuCommands(System.Windows.Forms.Menu,System.Boolean,System.Boolean)">
            <summary>
                <para>Call this method to remove menus and menu items that you insert with TSUtil methods such as InsertCommandsInMenu. Optionally, you can also remove menu and menu items that you insert by other means.</para>
                <para>Typically, you call this method when handling a MenuStart event in order to clear the menu so that you can then call InsertCommandsInMenu to populate the menu with items that are appropriate for the current state of the application.
            </para>
            </summary>
            <param name="menu">The method removes any menus or menu items that TSUtil methods create under this menu, including the menu itself. To remove items from all menus, pass the Menu that is the menubar.
            </param>
            <param name="removeNonTSMenus">
            Pass true to also remove menus that you did not insert by calling a TSUtil method.
            </param>
            <param name="removeNonTSItems">
            Pass true to also remove menu items that you did not insert by calling a TSUtil method.
            </param>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Menus.BeginUpdate(System.Windows.Forms.Form)">
            <summary>
                <para>This method prevents edits made by the Menus class from affecting the visual state of the form's menu.</para>
                <para>Call this method prior to making changes to a form's menu with the Menu class.</para>
                <para>After edits are made, call EndUpdate to present the modified menu.</para>
            </summary>
            <param name="form">Pass the form which contains the menu being modified.
            </param>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Menus.EndUpdate">
            <summary>
                <para>This method restores a form's modified menu and resumes updates.</para>
                <para>Call this method after making changes to a form's menu using the Menus class.</para>
                <para>Ensure that each call to EndUpdate is preceded by a call to BeginUpdate</para>
                <para>(Note: These calls can not be nested).</para>
            </summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Menus.CleanupMenu(System.Windows.Forms.Menu)">
            <summary>
                <para>This method removes any duplicate menu shortcut keys or redundant menu separator bars.</para>
                <para>If you make multiple calls to InsertCommandsInMenu or if call InsertCommandsInMenu to add to an existing menu, it can be difficult to prevent duplicate shortcut keys and separator bars because the inserted menus item may vary based on the state of the application.  Rather than trying to prevent duplicate shortcuts and separators, it is simpler to remove them with this method after you update the menu bar.</para>
                <para>Typically you call this method on the entire menu bar after you update a menu in response to a MenuStart event.</para>
            </summary>
            <param name="menu">Pass the menu to recursively search for duplicate shortcut keys and separator bars. Typically you pass the menu object that represents the menubar for a form.
            </param>
        </member>
        <member name="T:NationalInstruments.TestStand.Utility.Win32">
            <summary>
            Exposes selected Win32 SDK Functions. Typically, you only uses these functions in .NET code when necessary to implement a work-around for a .NET limitation or bug.
            </summary>
        </member>
        <member name="T:NationalInstruments.TestStand.Utility.Win32.CopyDataStruct">
            <summary>
            Data structure for send message
            </summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32.CopyDataStruct.SetMessage(System.String)">
            <summary>
            Sets the message of this structure and stores it in global memory in order to be able to send
            it to another process. If you are calling this method you will need to call the DisposeMessage()
            method to clean up the used memory.
            </summary>
            <param name="message"></param>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32.CopyDataStruct.GetMessage">
            <summary>
            Converts the message pointer into a string
            </summary>
            <returns>The string in the messages data</returns>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32.CopyDataStruct.DisposeMessage">
            <summary>
            Cleans the global memory used in the message
            </summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32.PostMessage(System.Runtime.InteropServices.HandleRef,System.UInt32,System.IntPtr,System.IntPtr)">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32.SendMessage(System.Runtime.InteropServices.HandleRef,System.UInt32,System.IntPtr,System.IntPtr)">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32.GetMenu(System.Runtime.InteropServices.HandleRef)">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32.GetKeyState(System.Int32)">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32.GetParent(System.Runtime.InteropServices.HandleRef)">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32.GetWindowThreadProcessId(System.Runtime.InteropServices.HandleRef,System.UInt32@)">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32.LockWindowUpdate(System.Runtime.InteropServices.HandleRef)">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32.GetFileTime(System.IntPtr,System.Runtime.InteropServices.ComTypes.FILETIME@,System.Runtime.InteropServices.ComTypes.FILETIME@,System.Runtime.InteropServices.ComTypes.FILETIME@)">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32.GetLongPathNameW(System.String,System.Text.StringBuilder,System.Int32)">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32.GetFileAttributesW(System.String)">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32.SetFileAttributesW(System.String,NationalInstruments.TestStand.Utility.Win32.FileAttributes)">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32.FindFirstFileW(System.String,NationalInstruments.TestStand.Utility.Win32.WIN32_FIND_DATAW@)">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32.FindNextFileW(System.IntPtr,NationalInstruments.TestStand.Utility.Win32.WIN32_FIND_DATAW@)">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32.CreateFileW(System.String,NationalInstruments.TestStand.Utility.Win32.FileAccess,NationalInstruments.TestStand.Utility.Win32.FileShare,System.IntPtr,NationalInstruments.TestStand.Utility.Win32.CreationDisposition,NationalInstruments.TestStand.Utility.Win32.FileAttributes,System.IntPtr)">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32.CreateDirectoryW(System.String,System.IntPtr)">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32.MoveFileExW(System.String,System.String,NationalInstruments.TestStand.Utility.Win32.MoveFileExFlags)">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32.CopyFileW(System.String,System.String,System.Boolean)">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32.DeleteFileW(System.String)">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32.RemoveDirectoryW(System.String)">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32.FindClose(System.IntPtr)">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32.GetFileSize(System.IntPtr,System.UInt32@)">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32.GetFileSizeEx(System.IntPtr,System.Int64@)">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32.WriteFile(System.IntPtr,System.Byte[],System.UInt32,System.UInt32@,System.IntPtr)">
            <summary>Refer to Microsoft Win32 SDK Help.
            We use IntPtr for lpOverLapped here beacuse it is easier to pass null that way.
            </summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32.GlobalAlloc(System.UInt32,System.UIntPtr)">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32.GlobalFree(System.IntPtr)">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32.SendStringMessage(System.Runtime.InteropServices.HandleRef,System.UInt32,System.IntPtr,NationalInstruments.TestStand.Utility.Win32.CopyDataStruct@)">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32.FindWindow(System.IntPtr,System.String)">
             <summary>
             Refer to Microsoft Win32 SDK Help.
             Note:  Pass IntPtr.Zero for the first parameter.
             </summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32.FindWindowEx(System.Runtime.InteropServices.HandleRef,System.Runtime.InteropServices.HandleRef,System.String,System.String)">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32.SetForegroundWindow(System.Runtime.InteropServices.HandleRef)">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32.GetActiveWindow">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32.OpenIcon(System.Runtime.InteropServices.HandleRef)">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32.IsIconic(System.Runtime.InteropServices.HandleRef)">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32.CreateMutex(System.IntPtr,System.Boolean,System.String)">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32.WaitForSingleObject(System.IntPtr,System.UInt32)">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32.ReleaseMutex(System.IntPtr)">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32.CloseHandle(System.IntPtr)">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32.LoadLibrary(System.String)">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32.FreeLibrary(System.IntPtr)">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.INFINITE">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.WAIT_ABANDONED">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.WAIT_OBJECT_0">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.WAIT_TIMEOUT">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.WAIT_FAILED">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.MAX_PATH">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.WM_QUERYENDSESSION">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.WM_COPYDATA">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.WM_SYSKEYDOWN">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.WM_KEYDOWN">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.WM_ENTERMENULOOP">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.WM_INITMENU">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.WM_EXITMENULOOP">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.BCM_SETSHIELD">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.VK_F1">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.VK_F4">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.VK_F24">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.VK_BACK">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.VK_TAB">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.VK_SHIFT">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.VK_CONTROL">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.VK_PAUSE">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.VK_SPACE">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.VK_PRIOR">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.VK_NEXT">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.VK_END">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.VK_HOME">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.VK_LEFT">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.VK_UP">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.VK_RIGHT">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.VK_DOWN">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.VK_INSERT">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.VK_DELETE">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.VK_NUMPAD0">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.VK_NUMPAD1">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.VK_NUMPAD2">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.VK_NUMPAD3">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.VK_NUMPAD4">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.VK_NUMPAD5">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.VK_NUMPAD6">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.VK_NUMPAD7">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.VK_NUMPAD8">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.VK_NUMPAD9">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.VK_MULTIPLY">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.VK_ADD">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.VK_SUBTRACT">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.VK_DECIMAL">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.VK_DIVIDE">
            <summary>
            Refer to Microsoft Win32 SDK Help.
            </summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.ERROR_SUCCESS">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.ERROR_FILE_NOT_FOUND">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.ERROR_PATH_NOT_FOUND">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.ERROR_ACCESS_DENIED">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.ERROR_INVALID_DRIVE">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.ERROR_NO_MORE_FILES">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.ERROR_SHARING_VIOLATION">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.ERROR_FILE_EXISTS">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.ERROR_INVALID_NAME">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.ERROR_DIR_NOT_EMPTY">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.ERROR_ALREADY_EXISTS">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.ERROR_FILENAME_EXCED_RANGE">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.ERROR_OPERATION_ABORTED">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.REGDB_E_CLASSNOTREG">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="P:NationalInstruments.TestStand.Utility.Win32.INVALID_HANDLE_VALUE">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.INVALID_FILE_SIZE">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="T:NationalInstruments.TestStand.Utility.Win32.FileAttributes">
            <summary>Refer to Microsoft Win32 SDK Help for SetFileAttributes()
            and GetFileAttributes() functions.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAttributes.INVALID_FILE_ATTRIBUTES">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAttributes.FILE_ATTRIBUTE_ARCHIVE">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAttributes.FILE_ATTRIBUTE_COMPRESSED">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAttributes.FILE_ATTRIBUTE_DEVICE">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAttributes.FILE_ATTRIBUTE_DIRECTORY">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAttributes.FILE_ATTRIBUTE_ENCRYPTED">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAttributes.FILE_ATTRIBUTE_HIDDEN">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAttributes.FILE_ATTRIBUTE_NORMAL">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAttributes.FILE_ATTRIBUTE_NOT_CONTENT_INDEXED">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAttributes.FILE_ATTRIBUTE_OFFLINE">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAttributes.FILE_ATTRIBUTE_READONLY">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAttributes.FILE_ATTRIBUTE_REPARSE_POINT">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAttributes.FILE_ATTRIBUTE_SPARSE_FILE">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAttributes.FILE_ATTRIBUTE_SYSTEM">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAttributes.FILE_ATTRIBUTE_TEMPORARY">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAttributes.FILE_ATTRIBUTE_VIRTUAL">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAttributes.ReadOnly">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAttributes.Hidden">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAttributes.System">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAttributes.Directory">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAttributes.Archive">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAttributes.Device">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAttributes.Normal">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAttributes.Temporary">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAttributes.SparseFile">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAttributes.ReparsePoint">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAttributes.Compressed">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAttributes.Offline">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAttributes.NotContentIndexed">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAttributes.Encrypted">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="T:NationalInstruments.TestStand.Utility.Win32.FileAccess">
            <summary>Refer to Microsoft Win32 SDK Help for "File Security and
            Access Rights," "Generic Access Rights," "File Access Rights
            Constants," as well as the WinNT.h header file.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAccess.GENERIC_READ">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAccess.GENERIC_WRITE">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAccess.GENERIC_EXECUTE">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAccess.GENERIC_ALL">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAccess.DELETE">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAccess.READ_CONTROL">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAccess.WRITE_DAC">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAccess.WRITE_OWNER">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAccess.SYNCHRONIZE">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAccess.STANDARD_RIGHTS_REQUIRED">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAccess.STANDARD_RIGHTS_READ">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAccess.STANDARD_RIGHTS_WRITE">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAccess.STANDARD_RIGHTS_EXECUTE">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAccess.STANDARD_RIGHTS_ALL">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAccess.SPECIFIC_RIGHTS_ALL">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAccess.FILE_READ_DATA">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAccess.FILE_LIST_DIRECTORY">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAccess.FILE_WRITE_DATA">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAccess.FILE_ADD_FILE">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAccess.FILE_APPEND_DATA">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAccess.FILE_ADD_SUBDIRECTORY">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAccess.FILE_CREATE_PIPE_INSTANCE">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAccess.FILE_READ_EA">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAccess.FILE_WRITE_EA">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAccess.FILE_EXECUTE">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAccess.FILE_TRAVERSE">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAccess.FILE_DELETE_CHILD">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAccess.FILE_READ_ATTRIBUTES">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAccess.FILE_WRITE_ATTRIBUTES">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAccess.FILE_ALL_ACCESS">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAccess.FILE_GENERIC_READ">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAccess.FILE_GENERIC_WRITE">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileAccess.FILE_GENERIC_EXECUTE">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="T:NationalInstruments.TestStand.Utility.Win32.FileShare">
            <summary>Refer to Microsoft Win32 SDK Help for the CreateFile()
            function, "Creating and Opening Files" as well as the WinNT.h
            header file.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileShare.FILE_SHARE_READ">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileShare.FILE_SHARE_WRITE">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.FileShare.FILE_SHARE_DELETE">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="T:NationalInstruments.TestStand.Utility.Win32.CreationDisposition">
            <summary>Refer to Microsoft Win32 SDK Help for the CreateFile()
            function.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.CreationDisposition.CREATE_NEW">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.CreationDisposition.CREATE_ALWAYS">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.CreationDisposition.OPEN_EXISTING">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.CreationDisposition.OPEN_ALWAYS">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.CreationDisposition.TRUNCATE_EXISTING">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="T:NationalInstruments.TestStand.Utility.Win32.MoveFileExFlags">
            <summary>Refer to Microsoft Win32 SDK Help for MoveFileEx()
            function.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.MoveFileExFlags.MOVEFILE_REPLACE_EXISTING">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.MoveFileExFlags.MOVEFILE_COPY_ALLOWED">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.MoveFileExFlags.MOVEFILE_DELAY_UNTIL_REBOOT">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.MoveFileExFlags.MOVEFILE_WRITE_THROUGH">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.MoveFileExFlags.MOVEFILE_CREATE_HARDLINK">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.MoveFileExFlags.MOVEFILE_FAIL_IF_NOT_TRACKABLE">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="T:NationalInstruments.TestStand.Utility.Win32.WIN32_FIND_DATAW">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.WIN32_FIND_DATAW.dwFileAttributes">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.WIN32_FIND_DATAW.ftCreationTime">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.WIN32_FIND_DATAW.ftLastAccessTime">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.WIN32_FIND_DATAW.ftLastWriteTime">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.WIN32_FIND_DATAW.nFileSizeHigh">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.WIN32_FIND_DATAW.nFileSizeLow">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.WIN32_FIND_DATAW.dwReserved0">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.WIN32_FIND_DATAW.dwReserved1">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.WIN32_FIND_DATAW.cFileName">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.WIN32_FIND_DATAW.cAlternateFileName">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="T:NationalInstruments.TestStand.Utility.Win32.AppBarMessage">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.AppBarMessage.ABM_NEW">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.AppBarMessage.ABM_REMOVE">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.AppBarMessage.ABM_QUERYPOS">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.AppBarMessage.ABM_SETPOS">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.AppBarMessage.ABM_GETSTATE">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.AppBarMessage.ABM_GETTASKBARPOS">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.AppBarMessage.ABM_ACTIVATE">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.AppBarMessage.ABM_GETAUTOHIDEBAR">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.AppBarMessage.ABM_SETAUTOHIDEBAR">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.AppBarMessage.ABM_WINDOWPOSCHANGED">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.AppBarMessage.ABM_SETSTATE">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="T:NationalInstruments.TestStand.Utility.Win32.APPBARDATA">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.APPBARDATA.cbSize">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.APPBARDATA.hWnd">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.APPBARDATA.uCallbackMessage">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.APPBARDATA.uEdge">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.APPBARDATA.rc">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32.APPBARDATA.lParam">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32.APPBARDATA.GetNewInstance">
            <summary>
            Create a new instance of <see cref="T:NationalInstruments.TestStand.Utility.Win32.APPBARDATA"/> with <see cref="F:NationalInstruments.TestStand.Utility.Win32.APPBARDATA.cbSize"/>
            correctly set for the size of the type.
            </summary>
            <returns>A new instance of <see cref="T:NationalInstruments.TestStand.Utility.Win32.APPBARDATA"/></returns>
        </member>
        <member name="T:NationalInstruments.TestStand.Utility.Win32.RECT">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="P:NationalInstruments.TestStand.Utility.Win32.RECT.Left">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="P:NationalInstruments.TestStand.Utility.Win32.RECT.Top">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="P:NationalInstruments.TestStand.Utility.Win32.RECT.Right">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="P:NationalInstruments.TestStand.Utility.Win32.RECT.Bottom">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="P:NationalInstruments.TestStand.Utility.Win32.RECT.Width">
            <summary>
            Returns the width of the rectangle
            </summary>
        </member>
        <member name="P:NationalInstruments.TestStand.Utility.Win32.RECT.Height">
            <summary>
            Returns the height of the rectangle
            </summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32.SHAppBarMessage(System.UInt32,NationalInstruments.TestStand.Utility.Win32.APPBARDATA@)">
            <summary>Refer to Microsoft Win32 SDK Help.</summary>
        </member>
        <member name="T:NationalInstruments.TestStand.Utility.Win32Wrap">
            <summary>
            Win32Wrap contains methods that wrap some of the P/Invoke defined
            calls in the Win32 class.  The idea is to shield consumers from
            detail of calling Win32 methods directly.  Win32Wrap methods
            handle things like buffer sizing, translating Win32 error codes
            to appropriate exceptions, etc.
            </summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32Wrap.SendSetShieldMessage(System.Runtime.InteropServices.HandleRef,System.Boolean)">
            <summary>
            Call the SendMessage function with the message type <see cref="F:NationalInstruments.TestStand.Utility.Win32.BCM_SETSHIELD"/>
            to set or unset the UAC shield in the control <paramref name="controlReference"/>
            </summary>
            <param name="controlReference">
            A <see cref="T:System.Runtime.InteropServices.HandleRef"/> to the control which should display the UAC shield.
            </param>
            <param name="setShield">Whether to show or hide the UAC shield.</param>
            <returns></returns>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32Wrap.FindWindow(System.String)">
            <summary>
            Call the FindWindow Win API function. This method will return a pointer with a handle to the window if it was found or
            a null pointer if not found.
            </summary>
            <param name="windowTitle">
            The window title to match, if empty string or not specified then match all. The window name must be localized by the
            caller of this method.
            </param>
            <returns>A pointer to a window handle which matches the values passed in or a null pointer if no window matches.</returns>
            <exception cref="T:System.Runtime.InteropServices.COMException">If the FindWindow method returns an error</exception>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32Wrap.SendStringMessage(System.Runtime.InteropServices.HandleRef,System.UInt32,System.String)">
            <summary>
            Sends the specified message string with the specified code (or WM_USER if not defined) to the window handle specified.
            In order to get a window handle call FindWindow
            </summary>
            <param name="windowHandle">The window handle received from FindWindow</param>
            <param name="messageCode">The message code to send</param>
            <param name="messageString">The message string to send</param>
            <returns>A pointer with information, depends on the message sent</returns>
            <exception cref="T:System.Runtime.InteropServices.COMException">If the SendMessage method returns an error</exception>
            <exception cref="T:System.ArgumentNullException">If window handle is null</exception>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32Wrap.CreateMutex(System.String,System.Boolean)">
            <summary>
            Creates or opens a named or unnamed mutex object.
            </summary>
            <param name="mutexName">The name of the mutex object. The name is limited to MAX_PATH characters. Name comparison is case sensitive.</param>
            <param name="initialOwner">
            If this value is true and the caller created the mutex, the calling thread obtains initial ownership of the mutex object.
            Otherwise, the calling thread does not obtain ownership of the mutex.</param>
            <returns>A handle to a mutex object.</returns>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32Wrap.CreateMutex(System.String,System.Boolean@,System.Boolean)">
            <summary>
            Creates a mutex with the name specified and returns a handle to it.
            </summary>
            <param name="mutexName">The name of the mutex object. The name is case sensitive.</param>
            <param name="initialOwner">If the value is true the calling thread obtains initial ownership of the mutex object.</param>
            <param name="alreadyExists">Returns true if the mutex already existed, false otherwise</param>
            <returns>A handle to a mutex object.</returns>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32Wrap.WaitForSingleObject(System.IntPtr,System.UInt32)">
            <summary>
            Waits for the specified mutex and returns true if the mutex was signaled.
            </summary>
            <param name="mutex">The mutex reference to wait on, call CallCreateMutex to get it.</param>
            <param name="timeout">The time out in milliseconds to wait, if not specified wait forever.</param>
            <returns>
            True if the mutex was signaled, false if a timeout occurred or if the thread which owned
            this mutex released it.
            </returns>
            <exception cref="T:System.Runtime.InteropServices.COMException">If the function fails</exception>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32Wrap.ReleaseMutex(System.IntPtr)">
            <summary>
            Releases ownership of the specified mutex object.
            </summary>
            <param name="mutex">A handle to a mutex object.</param>
            <returns>True if the mutex was successfully closed.</returns>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32Wrap.CloseHandle(System.IntPtr)">
            <summary>CloseHandle() is a wrapper for
            <see cref="M:NationalInstruments.TestStand.Utility.Win32.CloseHandle(System.IntPtr)"/>.  It differs in two
            ways.  First, it takes care of checking the return value of
            Win32.CloseHandle() and throws an appropriate exception.
            This means that CloseHandle() will generally either return
            true or throw and exception.  The one exception to this rule
            is if <see cref="P:NationalInstruments.TestStand.Utility.Win32.INVALID_HANDLE_VALUE"/> is passed as
            the argument.  In this case, the wrapper function returns
            false immediately without ever invoking the Win32 method.
            </summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32Wrap.GetLongPathNameW(System.String)">
            <summary>GetLongPathNameW() is a wrapper for
            <see cref="M:NationalInstruments.TestStand.Utility.Win32.GetLongPathNameW(System.String,System.Text.StringBuilder,System.Int32)"/>
            that takes care of buffer sizing and converting Win32 error
            codes to exceptions.</summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32Wrap.GetLongPathNameW_Long(System.String)">
            <summary>GetLongPathNameW_Long() is a wrapper for
            <see cref="M:NationalInstruments.TestStand.Utility.Win32.GetLongPathNameW(System.String,System.Text.StringBuilder,System.Int32)"/>
            that takes care of all of the escaping for paths longer than
            MAX_PATH, as well as buffer sizing, and converting Win32 error
            codes to exceptions.</summary>
        </member>
        <member name="T:NationalInstruments.TestStand.Utility.Win32Wrap.FindFirstFileW_Wrapper">
            <summary>FindFirstFileW_Wrapper is a wrapper around the Win32
            FindFirstFileW() / FindNextFileW() / FindClose() functions.
            It manages the find handle returned by FindFirstFileW(),
            providing final clean-up via the IDisposable interface.
            Also, most error scenarios are mapped to appropriate .Net
            exceptions.  (ERROR_FILE_NOT_FOUND for FindFirstFileW()
            and ERROR_NO_MORE_FILES for FindNextFileW() are treated as
            status causing false to be returned.  These cases do not
            lead to exceptions.)
            To use FindFirstFileW_Wrapper, instantiate an empty instance
            using the no-arg constructor.  Initialize the wrapper by
            calling FindFirstFileW() on it, just as you would normally
            call FindFirstFileW().  Iterate through the found files by
            calling FindNextFileW() on the wrapper, just as you would
            normally call FindNextFileW().
            When you are done, you should call Dispose() to clean up.
            FindClose() has also been provided should you want to keep
            the wrapper around for later use without holding on to the
            current find handle.
            The wrapper can be reused as needed by calling FindFirstFileW().
            This will release the current find handle before reinitializing
            the wrapper.</summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32Wrap.FindFirstFileW_Wrapper.IsDots(System.String)">
            <summary>Tests if a directory is "." (the current directory)
            or ".." (the parent directory).  This is handy because
            FindFirstFileW() includes "." and ".." in its returned files
            when you ask for all files in a directory using the "*"
            pattern.</summary>
            <param name="fileName">The file name to test.  This is the
            simple file name, not the full path.</param>
            <returns>true if fileName is "." or "..", false
            otherwise.</returns>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32Wrap.FindFirstFileW_Wrapper.Finalize">
            <summary>Finalizer for FindFirstFileW_Wrapper.</summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32Wrap.FindFirstFileW_Wrapper.Dispose(System.Boolean)">
            <summary>Dispose helper method for disposable pattern
            described at
            http://msdn.microsoft.com/en-us/library/system.idisposable.dispose.aspx.
            </summary>
            <param name="disposing">true if Dispose(bool) is called from
            IDisposable.Dispose(),  false if Dispose(bool) is called from
            the finalizer.</param>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32Wrap.FindFirstFileW_Wrapper.FindClose">
            <summary>Close the current find handle, if any, associated
            with this wrapper.
            Normally you will not need to invoke FindClose().  You can
            call FindFirstFileW() to reinitialize the wrapper with a
            new set of files or Dispose() when you are done.
            FindClose() will throw an exception if it fails for any
            reason other than the current handle being
            INVALID_HANDLE_VALUE.</summary>
            <returns>true if the current handle was successfully closed,
            or false if the current handle is invalid.</returns>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32Wrap.FindFirstFileW_Wrapper.FindFirstFileW(System.String,NationalInstruments.TestStand.Utility.Win32.WIN32_FIND_DATAW@)">
            <summary>Closes the existing find handle, if any, and
            searches a directory for a file or subdirectory with a
            name that matches a specific name (or partial name if
            wildcards are used).
            For paths longer than MAX_PATH, see FindFirstFileW_Long().
            FindFirstFileW() will throw an appropriate exception if
            there is a problem closing the existing find handle (if
            present) or the underlying Win32 FindFirstFileW() call
            fails for any reason other than ERROR_FILE_NOT_FOUND.
            </summary>
            <param name="fileName">The directory or path, and the file
            name, which can include wildcard characters, for example,
            an asterisk (*) or a question mark (?).
            This parameter should not end in a trailing backslash (\).
            If the string ends with a wildcard, period (.), or directory
            name, the user must have access permissions to the root and
            all subdirectories on the path.
            To extend the path name limit beyond MAX_PATH to 32,767 wide
            characters, prepend "\\?\" to the path, or use
            FindFirstFileW_Long().</param>
            <param name="findFileData">A WIN32_FIND_DATAW structure that
            receives information about a found file or directory.</param>
            <returns>If the function succeeds, the return value is
            true and the findFileData parameter contains information
            about the next file or directory found. If no files are
            found, findFileData is left unchanged and false is returned.
            </returns>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32Wrap.FindFirstFileW_Wrapper.FindNextFileW(NationalInstruments.TestStand.Utility.Win32.WIN32_FIND_DATAW@)">
            <summary>Continues a file search from a previous call to the
            FindFirstFileW() or FindFirstFileW_Long() methods.</summary>
            <param name="findFileData">A WIN32_FIND_DATAW structure
            that receives information about the found file or
            subdirectory.
            FindNextFileW() throws an exception if it encounters an
            error other than reaching the end of the list.
            </param>
            <returns>If the function succeeds, the return value is
            true and the findFileData parameter contains information
            about the next file or directory found.  If there are no
            more files, findFileData is left unchanged and false is
            returned.</returns>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32Wrap.FindFirstFileW_Wrapper.FindFirstFileW_Long(System.String,NationalInstruments.TestStand.Utility.Win32.WIN32_FIND_DATAW@)">
            <summary>This function mimics the behavior of
            FindFirstFileW(), but works for paths longer than MAX_PATH.
            Note that paths longer than MAX_PATH cannot be relative and
            cannot contain wild cards, so we cannot truly duplicate the
            behavior of FindFirstFileW() for arbitrary paths.
            Note:  This method will escape any path you give it with "\\?\"
            (or "\\?\UNC\" if appropriate). You should not prepend the
            "\\?\" to the path yourself.</summary>
            <param name="fileName">The directory or path, and the file
            name.  The path must be absolute.  It cannot use forward
            slashes to represent path separators, a period to represent
            the current directory, or double dots to represent the parent
            directory.</param>
            <param name="findFileData">A WIN32_FIND_DATAW structure that
            receives information about a found file or directory.</param>
            <returns>true if at least one file was found, false if no
            files were found</returns>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32Wrap.FindFirstFileW_Wrapper.disposed">
            <summary>Set to true once Dispose() has been executed
            once.</summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.Win32Wrap.FindFirstFileW_Wrapper.mFindHandle">
            <summary>The current find handle we are iterating
            over.</summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32Wrap.CreateFileW(System.String,NationalInstruments.TestStand.Utility.Win32.FileAccess,NationalInstruments.TestStand.Utility.Win32.FileShare,System.IntPtr,NationalInstruments.TestStand.Utility.Win32.CreationDisposition,NationalInstruments.TestStand.Utility.Win32.FileAttributes,System.IntPtr)">
            <summary>CreateFileW() is a wrapper for
            <see cref="M:NationalInstruments.TestStand.Utility.Win32.CreateFileW(System.String,NationalInstruments.TestStand.Utility.Win32.FileAccess,NationalInstruments.TestStand.Utility.Win32.FileShare,System.IntPtr,NationalInstruments.TestStand.Utility.Win32.CreationDisposition,NationalInstruments.TestStand.Utility.Win32.FileAttributes,System.IntPtr)"/>
            that takes care of converting Win32 error codes to exceptions.
            </summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32Wrap.CreateDirectoryW(System.String,System.IntPtr)">
            <summary>CreateDirectoryW() is a wrapper for
            <see cref="M:NationalInstruments.TestStand.Utility.Win32.CreateDirectoryW(System.String,System.IntPtr)"/>
            that takes care of converting Win32 error codes to exceptions.
            </summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32Wrap.CreateFileW_Long(System.String,NationalInstruments.TestStand.Utility.Win32.FileAccess,NationalInstruments.TestStand.Utility.Win32.FileShare,System.IntPtr,NationalInstruments.TestStand.Utility.Win32.CreationDisposition,NationalInstruments.TestStand.Utility.Win32.FileAttributes,System.IntPtr)">
            <summary>CreateFileW_Long() is a wrapper for
            <see cref="M:NationalInstruments.TestStand.Utility.Win32.CreateFileW(System.String,NationalInstruments.TestStand.Utility.Win32.FileAccess,NationalInstruments.TestStand.Utility.Win32.FileShare,System.IntPtr,NationalInstruments.TestStand.Utility.Win32.CreationDisposition,NationalInstruments.TestStand.Utility.Win32.FileAttributes,System.IntPtr)"/>
            that takes care of converting Win32 error codes to exceptions.
            It also escapes the fileName argument with the appropriate
            long path prefix (\\?\ or \\?\UNC\).</summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32Wrap.CreateDirectoryW_Long(System.String,System.IntPtr)">
            <summary>CreateDirectoryW_Long() is a wrapper for
            <see cref="M:NationalInstruments.TestStand.Utility.Win32.CreateDirectoryW(System.String,System.IntPtr)"/>
            that takes care of converting Win32 error codes to exceptions.
            It also escapes the fileName argument with the appropriate
            long path prefix (\\?\ or \\?\UNC\).</summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32Wrap.GetFileSizeEx(System.IntPtr)">
            <summary>GetFileSizeEx() is a wrapper for
            <see cref="M:NationalInstruments.TestStand.Utility.Win32.GetFileSizeEx(System.IntPtr,System.Int64@)"/>
            that takes care of converting Win32 error codes to exceptions.
            </summary>
            <returns>The 64-bit file size.</returns>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32Wrap.WriteFile(System.IntPtr,System.Byte[])">
            <summary>WriteFile() is a wrapper for
            <see cref="M:NationalInstruments.TestStand.Utility.Win32.WriteFile(System.IntPtr,System.Byte[],System.UInt32,System.UInt32@,System.IntPtr)"/>
            that takes care of converting Win32 error codes to exceptions.
            It also converts the output numberOfBytesWritten parameter to a
            return value and passes null for lpOverLapped for convenience.
            </summary>
            <param name="hFile">A handle to the file or I/O device (e.g.
            file, file stream, physical disk, etc.)</param>
            <param name="lpBuffer">A buffer containing the data to be written
            to the file or device.</param>
            <returns>The number of bytes to be written to the file or device.</returns>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32Wrap.GetFileSize(System.IntPtr)">
            <summary>GetFileSize() is a wrapper for
            <see cref="M:NationalInstruments.TestStand.Utility.Win32.GetFileSize(System.IntPtr,System.UInt32@)"/>
            that takes care of converting Win32 error codes to exceptions.
            It also handles the conversion of the 32-bit low and high sizes
            to a single 64-bit ulong return value.</summary>
            <returns>The 64-bit file size.</returns>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32Wrap.MoveFileExW(System.String,System.String,NationalInstruments.TestStand.Utility.Win32.MoveFileExFlags)">
            <summary>MoveFileExW() is a wrapper for
            <see cref="M:NationalInstruments.TestStand.Utility.Win32.MoveFileExW(System.String,System.String,NationalInstruments.TestStand.Utility.Win32.MoveFileExFlags)"/>
            that takes care of converting Win32 error codes to exceptions.
            </summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32Wrap.MoveFileExW_Long(System.String,System.String,NationalInstruments.TestStand.Utility.Win32.MoveFileExFlags)">
            <summary>MoveFileExW_Long() is a wrapper for
            <see cref="M:NationalInstruments.TestStand.Utility.Win32.MoveFileExW(System.String,System.String,NationalInstruments.TestStand.Utility.Win32.MoveFileExFlags)"/>
            that takes care of converting Win32 error codes to exceptions.
            It also escapes the existingFileName and newFileName arguments
            with the appropriate long path prefix (\\?\ or
            \\?\UNC\).</summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32Wrap.CopyFileW(System.String,System.String,System.Boolean)">
            <summary>CopyFileW() is a wrapper for
            <see cref="M:NationalInstruments.TestStand.Utility.Win32.CopyFileW(System.String,System.String,System.Boolean)"/>
            that takes care of converting Win32 error codes to exceptions.
            </summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32Wrap.CopyFileW_Long(System.String,System.String,System.Boolean)">
            <summary>CopyFileW_Long() is a wrapper for
            <see cref="M:NationalInstruments.TestStand.Utility.Win32.CopyFileW(System.String,System.String,System.Boolean)"/>
            that takes care of converting Win32 error codes to exceptions.
            It also escapes the existingFileName and newFileName arguments
            with the appropriate long path prefix (\\?\ or
            \\?\UNC\).</summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32Wrap.DeleteFileW(System.String)">
            <summary>DeleteFileW() is a wrapper for
            <see cref="M:NationalInstruments.TestStand.Utility.Win32.DeleteFileW(System.String)"/>
            that takes care of converting Win32 error codes to exceptions.
            </summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32Wrap.RemoveDirectoryW(System.String)">
            <summary>RemoveDirectoryW() is a wrapper for
            <see cref="M:NationalInstruments.TestStand.Utility.Win32.RemoveDirectoryW(System.String)"/>
            that takes care of converting Win32 error codes to exceptions.
            </summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32Wrap.DeleteFileW_Long(System.String)">
            <summary>DeleteFileW_Long() is a wrapper for
            <see cref="M:NationalInstruments.TestStand.Utility.Win32.DeleteFileW(System.String)"/>
            that takes care of converting Win32 error codes to exceptions.
            It also escapes the fileName argument with the appropriate
            long path prefix (\\?\ or \\?\UNC\).</summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32Wrap.RemoveDirectoryW_Long(System.String)">
            <summary>RemoveDirectoryW_Long() is a wrapper for
            <see cref="M:NationalInstruments.TestStand.Utility.Win32.RemoveDirectoryW(System.String)"/>
            that takes care of converting Win32 error codes to exceptions.
            It also escapes the fileName argument with the appropriate
            long path prefix (\\?\ or \\?\UNC\).</summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32Wrap.GetFileAttributesW(System.String)">
            <summary>
            GetFileAttributesW() is a wrapper for <see cref="M:NationalInstruments.TestStand.Utility.Win32.GetFileAttributesW(System.String)"/>
            that takes care of converting Win32 error codes to exceptions.
            </summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32Wrap.GetFileAttributesW_Long(System.String)">
            <summary>
            GetFileAttributesW_Long() is a wrapper for <see cref="M:NationalInstruments.TestStand.Utility.Win32.GetFileAttributesW(System.String)"/>
            that takes care of converting Win32 error codes to exceptions. It also escapes the path
            argument with the appropriate long path prefix (\\?\ or \\?\UNC\).
            </summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32Wrap.SetFileAttributesW(System.String,NationalInstruments.TestStand.Utility.Win32.FileAttributes)">
            <summary>
            SetFileAttributesW() is a wrapper for <see cref="M:NationalInstruments.TestStand.Utility.Win32.SetFileAttributesW(System.String,NationalInstruments.TestStand.Utility.Win32.FileAttributes)"/>
            that takes care of converting Win32 error codes to exceptions.
            </summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32Wrap.SetFileAttributesW_Long(System.String,NationalInstruments.TestStand.Utility.Win32.FileAttributes)">
            <summary>
            SetFileAttributesW_Long() is a wrapper for <see cref="M:NationalInstruments.TestStand.Utility.Win32.SetFileAttributesW(System.String,NationalInstruments.TestStand.Utility.Win32.FileAttributes)"/>
            that takes care of converting Win32 error codes to exceptions. It also escapes the path
            argument with the appropriate long path prefix (\\?\ or \\?\UNC\).
            </summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Win32Wrap.ThrowExceptionForLastError">
            <summary>This method calls
            <see cref="M:NationalInstruments.TestStand.Utility.Win32Wrap.ThrowExceptionForWin32Error(System.Int32)"/> on the return
            value of <see cref="M:System.Runtime.InteropServices.Marshal.GetLastWin32Error"/>.</summary>
        </member>
        <member name="T:NationalInstruments.TestStand.Utility.ITestStandLocalizable">
            <summary>
            Use the ITestStandLocalizable to allow a custom user control to be localizable.
            </summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.ITestStandLocalizable.Localize(NationalInstruments.TestStand.Interop.API.Engine,System.String)">
            <summary>
            When called, this method will localize the control that it is called in using the
            <paramref name="engine"/> and <paramref name="category"/>.
            </summary>
            <param name="engine">The engine used to localize</param>
            <param name="category">The category used to localize</param>
        </member>
        <member name="T:NationalInstruments.TestStand.Utility.Localizer">
            <summary>
            Use a localizer to localize the Text property of .net menu items or controls.
            </summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Localizer.#ctor(NationalInstruments.TestStand.Interop.API.Engine)">
            <summary>
            Creates a new Localizer object. Localizers created with this constructor do not localize all TestStand UI Controls when LocalizeForm is called.
            </summary>
            <param name="engine">
            The Localizer uses the TestStand engine you pass to obtain the localized text for menu items and controls.
            </param>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Localizer.#ctor(NationalInstruments.TestStand.Interop.UI.Ax.AxApplicationMgr)">
            <summary>
            Creates a new Localizer object.
            </summary>
            <param name="applicationMgr">
            The Localizer uses the TestStand ApplicationMgr you pass to obtain the localized text for menu items and controls.
            </param>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Localizer.#ctor(NationalInstruments.TestStand.Interop.UI.ApplicationMgr)">
            <summary>
            Creates a new Localizer object.
            </summary>
            <param name="applicationMgr">
            The Localizer uses the TestStand ApplicationMgr you pass to obtain the localized text for menu items and controls.
            </param>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Localizer.#ctor(NationalInstruments.TestStand.Interop.API.Engine,NationalInstruments.TestStand.Interop.UI.Ax.AxApplicationMgr)">
            <summary>
            Creates a new Localizer object.
            </summary>
            <param name="engine">
            The Localizer uses the TestStand engine you pass to obtain the localized text for menu items and controls.
            </param>
            <param name="applicationMgr">
            The Localizer uses the ApplicationMgr you pass to localize text for the TestStand User Interface controls. You can pass null to this parameter if you do not wish to localize UI controls.
            </param>
        </member>
        <member name="P:NationalInstruments.TestStand.Utility.Localizer.Engine">
            <remarks>
            Returns the Engine with which the Localize was constructed.
            </remarks>
        </member>
        <member name="P:NationalInstruments.TestStand.Utility.Localizer.ApplicationMgr">
            <remarks>
            Returns the ApplicationMgr with which the Localizer was constructed. Obsolete, use GetApplicationMgr instead.
            </remarks>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Localizer.GetApplicationMgr">
            <remarks>
            Returns the ApplicationMgr with which the Localizer was constructed.
            </remarks>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Localizer.LocalizeControls(System.Windows.Forms.Control.ControlCollection,System.String)">
            <summary>
            Localize the collection of controls in <paramref name="controls"/> with the string in
            <paramref name="category"/>
            </summary>
            <param name="controls">The controls collection to localize</param>
            <param name="category">The category to localize with</param>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Localizer.LocalizeForm(System.Windows.Forms.Form,System.String,System.Boolean)">
            <summary><para>This method localizes the text on a form to the current language the TestStand language setting selects.</para>
                <para>For each control on a form, this method uses the value of the Control.Text property as a tag to obtain a localized string from the TestStand string resource category you specify. If a localized string with that tag exists, the method replaces the value of the Control.Text property with the localized string. If the tag does not exist, the method does not alter the control text.</para>
                <para>The method also localizes controls that reside within other controls or tab pages.</para>
            </summary>
            <param name="form">Pass the form to localize.
            </param>
            <param name="category">Pass the category name of the TestStand string resource section that contains the localized strings for the form.
            </param>
            <param name="localizeMenu">Pass true to localize the menu item text for the items in the menu bar of the form.
            </param>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Localizer.LocalizeMenu(System.Windows.Forms.Menu,System.String)">
            <summary>
                <para>This method localizes the menu item text to the current language the TestStand language setting selects.</para>
                <para>For each item in a menu, this method uses the value of the MenuItem.Text property as a tag to obtain a localized string from the TestStand string resource category you specify. If a localized string with that tag exists, the method replaces the value of the MenuItem.Text property with the localized string. If the tag does not exist, the method does not alter the menu item text.</para>
                <para>The method also localizes menu items that reside within sub-menus.</para>
            </summary>
            <param name="menu">Pass the menu to localize.
            </param>
            <param name="category">Pass the category name of the TestStand string resource section that contains the localized strings for the menu.
            </param>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Localizer.LocalizeContextMenu(System.Windows.Forms.ContextMenuStrip,System.String)">
            <summary>
            Localizes the text in all menu items for a context menu strip to the current language the
            TestStand language setting selects. For each menu item this method uses the value of the menu
            item Text property as a tag to obtain a localized string from the string from the TestStand
            string resource category you specify. If a localized string with that tag exists, the method
            replaces the value of the Control.Text property with the localized string; if the tag does
            not exist, the method does not alter the control text.
            </summary>
            <param name="menu">Pass the context menu strip to localize</param>
            <param name="category">
            Pass the category name of the TestStand string resource section that contains the localized
            strings for the form.
            </param>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Localizer.LocalizeNotifyIcon(System.Windows.Forms.NotifyIcon,System.String)">
            <summary>
            Localizes the text in a notify icon for a context menu strip to the current language the
            TestStand language setting selects. For each menu item in the context menu strip this
            method uses the value of the menu item Text property as a tag to obtain a localized string
            from the string from the TestStand string resource category you specify. If a localized
            string with that tag exists, the method replaces the value of the Control.Text property
            with the localized string; if the tag does not exist, the method does not alter the control
            text.
            </summary>
            <param name="icon">Pass the notify icon to localize</param>
            <param name="category">
            Pass the category name of the TestStand string resource section that contains the localized
            strings for the form.
            </param>
        </member>
        <member name="T:NationalInstruments.TestStand.Utility.Tiler">
            <remarks>
            You can use this class for tiling forms or other objects when the Form.LayoutMdi method is not adequate or applicable
            </remarks>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Tiler.#ctor">
            <summary>
            Use a Tiler object to layout windows or other objects in a square or nearly square grid
            </summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Tiler.SetNumTiles(System.Int32)">
            <summary>
            Specificies the number of tiles to partition into a square or nearly square grid
            </summary>
            <param name="numTiles">The number of tiles to layout in a grid</param>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Tiler.GetTilePosition(System.Int32,System.Int32@,System.Int32@)">
            <summary>
            Returns the tile coordinates of a specified tile in the grid of tiles
            </summary>
            <param name="tileIndex">the index of a tile, from 0 to (number-of-tiles - 1)</param>
            <param name="x">returns the x position of the tile, from 0 to (max-number-of-tiles-in-a-row - 1)</param>
            <param name="y">returns the y position of the tile, from 0 to (max-number-of-tiles-in-a-column - 1)</param>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Tiler.TileWindows(System.Collections.ICollection,System.Drawing.Rectangle)">
            <summary>
            Lays out a collection of forms in a grid within the specified bounds
            </summary>
            <param name="forms">a collection of forms</param>
            <param name="bounds">the rectangle within which to layout the forms</param>
        </member>
        <member name="T:NationalInstruments.TestStand.Utility.LayoutPersister">
            <remarks>
            You can use this class for saving and loading control bounds or sizes to/from a TestStand application's configuration file.
            </remarks>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.LayoutPersister.SaveSizes(NationalInstruments.TestStand.Interop.UI.Ax.AxApplicationMgr,System.Windows.Forms.Control[])">
            <summary>
            Saves the height and width for each of the specified controls into a TestStand application's configuration file.
            </summary>
            <param name="applicationMgr">Pass the ApplicationMgr control for the application</param>
            <param name="controls">Pass any number of controls</param>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.LayoutPersister.SaveSizes(NationalInstruments.TestStand.Interop.UI.Ax.AxApplicationMgr,System.String,System.Windows.Forms.Control[])">
            <summary>
            Saves the height and width for each of the specified controls into a TestStand application's configuration file. This overload let you specify the name of the configuration file property that stores the information.
            </summary>
            <param name="applicationMgr">Pass the ApplicationMgr control for the application</param>
            <param name="configurationPropertyName">Pass the name of the configuration file subproperty that stores the information</param>
            <param name="controls">Pass any number of controls</param>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.LayoutPersister.SaveBounds(NationalInstruments.TestStand.Interop.UI.Ax.AxApplicationMgr,System.Windows.Forms.Control[])">
            <summary>
            Saves the bounds for each of the specified controls into a TestStand application's configuration file.
            </summary>
            <param name="applicationMgr">Pass the ApplicationMgr control for the application</param>
            <param name="controls">Pass any number of controls</param>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.LayoutPersister.SaveBounds(NationalInstruments.TestStand.Interop.UI.Ax.AxApplicationMgr,System.String,System.Windows.Forms.Control[])">
            <summary>
            Saves the bounds for each of the specified controls into a TestStand application's configuration file. This overload let you specify the name of the configuration file property that stores the information.
            </summary>
            <param name="applicationMgr">Pass the ApplicationMgr control for the application</param>
            <param name="configurationPropertyName">Pass the name of the configuration file subproperty that stores the information</param>
            <param name="controls">Pass any number of controls</param>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.LayoutPersister.LoadSizes(NationalInstruments.TestStand.Interop.UI.Ax.AxApplicationMgr,System.Windows.Forms.Control[])">
            <summary>
            Loads the height and width for each of the specified controls into a TestStand application's configuration file. You must call LoadSizes and SaveSizes with the same set of controls in the same order.
            </summary>
            <param name="applicationMgr">Pass the ApplicationMgr control for the application</param>
            <param name="controls">Pass any number of controls</param>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.LayoutPersister.LoadSizes(NationalInstruments.TestStand.Interop.UI.Ax.AxApplicationMgr,System.String,System.Windows.Forms.Control[])">
            <summary>
            Loads the height and width for each of the specified controls into a TestStand application's configuration file. You must call LoadSizes and SaveSizes with the same set of controls in the same order. This overload let you specify the name of the configuration file property that stores the information.
            </summary>
            <param name="applicationMgr">Pass the ApplicationMgr control for the application</param>
            <param name="configurationPropertyName">Pass the name of the configuration file subproperty that stores the information</param>
            <param name="controls">Pass any number of controls</param>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.LayoutPersister.LoadBounds(NationalInstruments.TestStand.Interop.UI.Ax.AxApplicationMgr,System.Windows.Forms.Control[])">
            <summary>
            Loads the bounds for each of the specified controls into a TestStand application's configuration file. You must call LoadBounds and SaveBounds with the same set of controls in the same order.
            </summary>
            <param name="applicationMgr">Pass the ApplicationMgr control for the application</param>
            <param name="controls">Pass any number of controls</param>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.LayoutPersister.LoadBounds(NationalInstruments.TestStand.Interop.UI.Ax.AxApplicationMgr,System.String,System.Windows.Forms.Control[])">
            <summary>
            Loads the bounds for each of the specified controls into a TestStand application's configuration file. You must call LoadBounds and SaveBounds with the same set of controls in the same order. This overload let you specify the name of the configuration file property that stores the information.
            </summary>
            <param name="applicationMgr">Pass the ApplicationMgr control for the application</param>
            <param name="configurationPropertyName">Pass the name of the configuration file subproperty that stores the information</param>
            <param name="controls">Pass any number of controls</param>
        </member>
        <member name="T:NationalInstruments.TestStand.Utility.Splitters">
            <remarks>
            You can use this class to simplify the implementation of splitter bars when using the border properties of TestStand UI Controls.
            </remarks>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Splitters.DragSplitter(System.Windows.Forms.Control,System.Windows.Forms.Control,System.Int32,System.Int32,System.Int32,System.Int32,System.Int64)">
            <summary>
            Call this method from the BorderDragged event for a TestStand control that has a drag border enabled in order to resize the control that owns the drag border and
            the control that shares the area split by the border. This method has been tested only with one or fewer borders per control. It may require modification for use with more than one border per control.
            /// </summary>
            <param name="master">Pass the control that receives the BorderDragged event.</param>
            <param name="slave">Pass the control that shares the area split by the drag border of the master control.</param>
            <param name="newX">Pass the value of newX received in the BorderDragged event handler.</param>
            <param name="newY">Pass the value of newY received in the BorderDragged event handler.</param>
            <param name="newWidth">Pass the value of newWidth received in the BorderDragged event handler.</param>
            <param name="newHeight">Pass the value of newHeight received in the BorderDragged event handler.</param>
            <param name="bordersChanged">Pass the value of bordersChanged received in the BorderDragged event handler.</param>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.Splitters.DivideSpaceBetweenPanes(System.Boolean,System.Int32,System.Int32,System.Windows.Forms.Control[])">
            <summary>
            Call this method to divide an area between two or more panes. If the area is larger or smaller than the current sum of the pane sizes, the available
            area is distributed among the open panes in proportion to their current relative sizes.
            This method has been tested only with one or fewer borders per control. It may require modification for use with more than one border per control.
            /// </summary>
            <param name="verticalSplitter">Pass true if the controls are separated by vertical drag borders that divide a horizontal space. Pass false if the controls are separated by horizontal drag borders that divide a vertical space.</param>
            <param name="spaceStart">Pass the start of area that the panes share. If the splitters are vertical, pass the X coordinate for the start of the area. If the splitters are horizontal, pass the Y coordinate for the start of the area.</param>
            <param name="spaceEnd">Pass the end of area that the panes share. If the splitters are vertical, pass the X coordinate for the end of the area. If the splitters are horizontal, pass the Y coordinate for the end of the area.</param>
            <param name="panes">Pass the controls that share the specified area. For vertical splitters, pass the controls in order from left to right. For horizontal splitters, pass the controls in order from top to bottom.</param>
        </member>
        <member name="T:NationalInstruments.TestStand.Utility.ErrorMessage">
            <remarks>
            Use this class to help format error messages
            </remarks>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.ErrorMessage.AppendCodeAndDescription(NationalInstruments.TestStand.Interop.UI.Ax.AxApplicationMgr,System.String,System.Int64)">
            <summary>
            Returns the errorString with the error code and code description appended to it if the code is a TestStand error code.
            </summary>
            <param name="applicationMgr">Pass the ApplicationMgr control for the application</param>
            <param name="errorMessage">Pass the error message</param>
            <param name="errorCode">Pass the error code</param>
        </member>
        <member name="T:NationalInstruments.TestStand.Utility.ApplicationWrapper">
            <remarks>
            This class exists to provide an exception suppressing wrapper around System.Windows.Forms.Application.Run
            </remarks>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.ApplicationWrapper.Run(System.Windows.Forms.Form)">
            <remarks>
            This method is identical to System.Windows.Forms.Application.Run() except that it suppresses a harmless exception that can occur during dll unloading if the application exited while
            a menu is open. The error occurs only in a very specific interaction between Windows forms, Windows timer messages, and COM components. This is a simple workaround.
            </remarks>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.ApplicationWrapper.Run(System.Windows.Forms.ApplicationContext)">
            <remarks>
            This method is identical to System.Windows.Forms.Application.Run() except that it suppresses a harmless exception that can occur during dll unloading if the application exited while
            a menu is open. The error occurs only in a very specific interaction between Windows forms, Windows timer messages, and COM components. This is a simple workaround.
            </remarks>
        </member>
        <member name="T:NationalInstruments.TestStand.Utility.LaunchTestStandApplicationInNewDomain">
            <remarks>
            You can use this class to launch the application in a separate AppDomain. This class ensures
            that the TestStand Engine is destructed after the application exits so that the Engine does
            not report incorrect object leaks.
            </remarks>
        </member>
        <member name="T:NationalInstruments.TestStand.Utility.LaunchTestStandApplicationInNewDomain.MainEntryPointDelegate">
            <summary>
            Delegate for the main entry point to the application.
            </summary>
        </member>
        <member name="T:NationalInstruments.TestStand.Utility.LaunchTestStandApplicationInNewDomain.MainEntryPointDelegateWithArgs">
            <summary>
            Delegate for the main entry point to the application with command-line arguments
            </summary>
        </member>
        <member name="T:NationalInstruments.TestStand.Utility.LaunchTestStandApplicationInNewDomain.MainEntryPointDelegateWithArgsReturnCode">
            <summary>
            Delegate for the main entry point to the application with command-line arguments and a return code.
            </summary>
            <returns></returns>
        </member>
        <member name="T:NationalInstruments.TestStand.Utility.LaunchTestStandApplicationInNewDomain.DisplayErrorMessageDelegate">
            <summary>
            Delegate for displaying error messages from the LaunchProtected method
            </summary>
            <param name="caption">Receives the caption that should be displayed in the message</param>
            <param name="message">Receives the error message to display</param>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.LaunchTestStandApplicationInNewDomain.Launch(NationalInstruments.TestStand.Utility.LaunchTestStandApplicationInNewDomain.MainEntryPointDelegateWithArgs,System.String[])">
            <summary>
            Launches the application in a new AppDomain. This method can throw exceptions when using
            an old 32-bit Engine. Use LaunchProtected instead.
            </summary>
            <param name="entryPoint">Pass the main entry point to the application</param>
            <param name="args">Command-line arguments</param>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.LaunchTestStandApplicationInNewDomain.Launch(NationalInstruments.TestStand.Utility.LaunchTestStandApplicationInNewDomain.MainEntryPointDelegate)">
            <summary>
            Launches the application in a new AppDomain. This method can throw exceptions when using
            an old 32-bit Engine. Use LaunchProtected instead.
            </summary>
            <param name="entryPoint">Pass the main entry point to the application</param>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.LaunchTestStandApplicationInNewDomain.LaunchProtected(NationalInstruments.TestStand.Utility.LaunchTestStandApplicationInNewDomain.MainEntryPointDelegateWithArgs,System.String[],System.String,NationalInstruments.TestStand.Utility.LaunchTestStandApplicationInNewDomain.DisplayErrorMessageDelegate,System.Boolean)">
            <summary>
            Launches the application in a new AppDomain. If the engine cannot be created displays
            an error message. Handles the specific case that the engine cannot be created in
            process because a version of TestStand that is only 32-bit is active and this
            application is 64-bit.
            </summary>
            <param name="entryPoint">Pass the main entry point to the application</param>
            <param name="applicationName">The name of the application to display in an error message in case of errors.</param>
            <param name="args">Pass the arguments expected by the <paramref name="entryPoint"/> method.</param>
            <param name="displayErrorMessage">Pass the method to use if an error message needs to be displayed</param>
            <param name="parseArgs">Pass true to enable the application to parse TestStand specific arguments, such as the "/env" flag, from the command line. Pass false if your application handles all command line arguments manually</param>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.LaunchTestStandApplicationInNewDomain.LaunchProtected(NationalInstruments.TestStand.Utility.LaunchTestStandApplicationInNewDomain.MainEntryPointDelegate,System.String,NationalInstruments.TestStand.Utility.LaunchTestStandApplicationInNewDomain.DisplayErrorMessageDelegate)">
            <summary>
            Launches the application in a new AppDomain. If the engine cannot be created displays
            an error message. Handles the specific case that the engine cannot be created in
            process because a version of TestStand that is only 32-bit is active and this
            application is 64-bit.
            </summary>
            <param name="entryPoint">Pass the main entry point to the application</param>
            <param name="applicationName">The name of the application to display in an error message in case of errors.</param>
            <param name="displayErrorMessage">Pass the method to use if an error message needs to be displayed</param>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.LaunchTestStandApplicationInNewDomain.LaunchProtectedReturnCode(NationalInstruments.TestStand.Utility.LaunchTestStandApplicationInNewDomain.MainEntryPointDelegateWithArgsReturnCode,System.String[],System.String,NationalInstruments.TestStand.Utility.LaunchTestStandApplicationInNewDomain.DisplayErrorMessageDelegate,System.Boolean)">
            <summary>
            Launches the application in a new AppDomain. If the engine cannot be created displays
            an error message. Handles the specific case that the engine cannot be created in process
            because a version of TestStand that is only 32-bit is active and this application
            is 64-bit. Will return the return code given by entryPoint. If the Application cannot
            be run or unloaded appropriately, this method will return the code -1000.
            </summary>
            <param name="entryPoint"></param>
            <param name="args"></param>
            <param name="applicationName"></param>
            <param name="displayErrorMessage"></param>
            <param name="parseArgs">Pass true to enable the application to parse TestStand specific arguments, such as the "/env" flag, from the command line. Pass false if your application handles all command line arguments manually</param>
            <returns></returns>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.LaunchTestStandApplicationInNewDomain.SetEngineEnvironment(System.String)">
            <summary>
            Initialize the environment using the provided path. This method must be called before creating an instance of the TestStand engine.
            </summary>
            <param name="engineEnvironmentPath"></param>
        </member>
        <member name="T:NationalInstruments.TestStand.Utility.LongPath">
            <summary>
            This is a utilitiy class to help work with path names greater than
            MAX_PATH.
            </summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.LongPath.DirectorySeparatorChar">
            <summary>Provided for convenience.  <see cref="F:System.IO.Path.DirectorySeparatorChar"/></summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.LongPath.AltDirectorySeparatorChar">
            <summary>Provided for convenience.  <see cref="F:System.IO.Path.AltDirectorySeparatorChar"/></summary>
        </member>
        <member name="F:NationalInstruments.TestStand.Utility.LongPath.VolumeSeparatorChar">
            <summary>Provided for convenience.  <see cref="F:System.IO.Path.VolumeSeparatorChar"/></summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.LongPath.IsPathRooted(System.String)">
            <summary>Provided for convenience.  <see cref="M:System.IO.Path.IsPathRooted(System.String)"/></summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.LongPath.UsesDriveLetter(System.String)">
            <summary>Very simple check to see if the path begins with a drive letter (e.g. "C:").
            Because UsesDriveLetter() is an internal helper function, it does not normalize the path.  You must
            do that if you want to.</summary>
            <param name="path">The path to evaluate.</param>
            <returns>true if path begins with a drive letter; false otherwise.</returns>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.LongPath.IsAbsolute(System.String)">
            <summary>Checks if the path is absolute.
            Because InAbsolute() is an internal helper function, it does not normalize the path.  You must do that
            if you want to.</summary>
            <param name="path">The path to evaluate.</param>
            <returns>true if path is absolute; false otherwise.</returns>
        </member>
        <member name="T:NationalInstruments.TestStand.Utility.LongPath.PathNotAbsoluteException">
            <summary>Long paths cannot be relative.  This exception is thrown when one of our path functions
            encounters a relative path.
            See also http://msdn.microsoft.com/en-us/library/windows/desktop/aa365247.aspx
            </summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.LongPath.PathNotAbsoluteException.#ctor">
            <summary>Construct a new PathNotAbsoluteException.</summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.LongPath.CheckAndNormalizePath(System.String,System.String,System.Boolean)">
             <summary>This is a helper function for methods such as
             <see cref="M:NationalInstruments.TestStand.Utility.LongPath.GetPathRoot(System.String)"/> and
             <see cref="M:NationalInstruments.TestStand.Utility.LongPath.GetDirectoryName(System.String)"/>.
             It checks for conditions that the C# documentation
             specifies lead to argument exceptions.  It also performs
             normalization. I found when reverse engineering some of the C#
             path methods that they were implicitly normalizing path
             arguments in multiple ways:
             1.  They trim leading and trailing whitespace.
             2.  They replace all slashes with backslashes.
             3.  Runs of consecutive directory separators are coalesced.
             This method performs said normalization.
             In addition, this method will optionally evaluate "." and ".." chacters.  Note that doing so requires
             path be absolute.  If collapseDots is true and path is relative, a PathNotAbsoluteException is thrown.
             Checking and normalization are combined because some of the
             checking needs to happen before and some after
             normalization.</summary>
             <param name="path">The path to normalize.</param>
             <param name="paramName">The name of the paramter (to use with exceptions.)</param>
             <param name="collapseDots">Evaluate the ".." and "." chacters in the specified path.</param>
             <returns>A normalized version of the path.</returns>
             <exception cref="T:System.ArgumentException">If the path is empty,
             contains invalid path characters, or is not of legal
             form.</exception>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.LongPath.GetDirectoryName(System.String)">
            <summary>This function mimics the behavior of
            <see cref="M:System.IO.Path.GetDirectoryName(System.String)"/>
            but works on paths longer than MAX_PATH.
            NOTE:  Every attempt was made to make this method match the
            behavior of Path.GetDirectoryName() as closely as possible,
            but the actual behavior of Path.GetDirectoryName() is more
            complex than documented at MSDN.  We had to reverse engineer
            the actual behavior for many cases.  Our implementation may
            miss some corner cases, particularly of the normalization
            process.  This implementation was tested and works for most
            reasonable cases.</summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.LongPath.GetFullPath(System.String)">
            <summary>This function mimics the behavior of
            <see cref="M:System.IO.Path.GetFullPath(System.String)"/> but works for
            paths longer than MAX_PATH.  Note that paths longer than
            MAX_PATH cannot be relative, so we cannot truly duplicate the
            behavior of Path.GetFullPath() for arbitrary paths.
            Note:  This method will escape any path you give it with "\\?\"
            (or "\\?\UNC\" if appropriate). You should not prepend the
            "\\?\" to the path yourself.</summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.LongPath.GetPathRoot(System.String)">
             <summary>This function mimics the behavior of
             <see cref="M:System.IO.Path.GetPathRoot(System.String)"/>
             but works on paths longer than MAX_PATH.
             NOTE:  Every attempt was made to make this method match the
             behavior of Path.GetPathRoot() as closely as possible,
             but the actual behavior of Path.GetPathRoot() is more
             complex than documented at MSDN.  We had to reverse engineer
             the actual behavior for many cases.  Our implementation may
             miss some corner cases, particularly of the normalization
             process.  This implementation was tested and works for most
             reasonable cases.</summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.LongPath.GetFileName(System.String)">
            <summary>
            Convenience method which calls into <see cref="M:System.IO.Path.GetFileName(System.String)"/>
            </summary>
            <param name="path">The path to get the file name for</param>
            <returns>The file name of the path passed as a parameter.</returns>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.LongPath.Combine(System.String,System.String)">
            <summary>
            Convenience method which calls <see cref="M:System.IO.Path.Combine(System.String,System.String)"/>
            </summary>
            <param name="path1">The first path to combine. </param>
            <param name="path2">The second path to combine. </param>
            <returns>
            The combined paths. If one of the specified paths is a zero-length string, this method
            returns the other path. If <paramref name="path2"/> contains an absolute path, this
            method returns <paramref name="path2"/>.
            </returns>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.LongPath.Combine(System.String[])">
            <summary>
            Convenience method which calls <see cref="M:System.IO.Path.Combine(System.String[])"/>.
            </summary>
            <param name="paths">An array of parts of the path.</param>
            <returns>The combined paths.</returns>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.LongPath.GetFileNameWithoutExtension(System.String)">
            <summary>
            Convenience method that calls <see cref="M:System.IO.Path.GetFileNameWithoutExtension(System.String)"/>
            </summary>
            <param name="path">The path of the file. </param>
            <returns>
            The string returned by <see cref="M:NationalInstruments.TestStand.Utility.LongPath.GetFileName(System.String)"/>, minus the last period (.) and all
            characters following it.
            </returns>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.LongPath.GetExtension(System.String)">
            <summary>
            Convenience method that calls <see cref="M:System.IO.Path.GetExtension(System.String)"/>
            </summary>
            <param name="path">The path of the file. </param>
            <returns>
            The extension of the specified path (including the period "."), or null, or
            String.Empty. If <paramref name="path"/> is null, GetExtension returns null. If
            <paramref name="path"/> does not have extension information, GetExtension returns
            <see cref="F:System.String.Empty"/>.
            </returns>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.LongPath.GetInvalidFileNameChars">
            <summary>
            Convenience method that calls <see cref="M:System.IO.Path.GetInvalidFileNameChars"/>
            </summary>
            <returns>An array containing the characters that are not allowed in file names.</returns>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.LongPath.GetInvalidPathChars">
            <summary>
            Convenience method that calls <see cref="M:System.IO.Path.GetInvalidPathChars"/>
            </summary>
            <returns>An array containing the characters that are not allowed in path names.</returns>
        </member>
        <member name="T:NationalInstruments.TestStand.Utility.LongFileInfo">
            <summary>
            This is a utility class to help work with path names greater than MAX_PATH
            </summary>
        </member>
        <member name="P:NationalInstruments.TestStand.Utility.LongFileInfo.FullName">
            <summary>
            The full path of the file
            </summary>
        </member>
        <member name="P:NationalInstruments.TestStand.Utility.LongFileInfo.Initialized">
            <summary>
            Whether the values have been initialized.
            </summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.LongFileInfo.Refresh">
            <summary>
            Refreshes the information in the long file info structure.
            </summary>
        </member>
        <member name="P:NationalInstruments.TestStand.Utility.LongFileInfo.Length">
            <summary>
            Gets the size, in bytes, of the current file.
            </summary>
            <returns>The size of the current file in bytes.</returns>
        </member>
        <member name="P:NationalInstruments.TestStand.Utility.LongFileInfo.CreationTime">
            <summary>
            The creation time of the file. Note that this value is initialized the first time it
            is read and it will not be refreshed unless you manually call refresh.
            </summary>
        </member>
        <member name="P:NationalInstruments.TestStand.Utility.LongFileInfo.LastAccessTime">
            <summary>
            The last time the file was accessed. Note that this value is initialized the first time
            it is read and it will not be refreshed unless you manually call refresh.
            </summary>
        </member>
        <member name="P:NationalInstruments.TestStand.Utility.LongFileInfo.LastWriteTime">
            <summary>
            The modification time of the file. Note that this value is initialized the first time
            it is read and it will not be refreshed unless you manually call refresh.
            </summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.LongFileInfo.#ctor(System.String)">
            <summary>
            Creates a new instance of LongFileInfo with the file specified by <paramref name="fileName"/>
            </summary>
            <param name="fileName">The path of the file</param>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.LongFileInfo.#ctor(System.String,NationalInstruments.TestStand.Utility.Win32.WIN32_FIND_DATAW)">
            <summary>
            Creates a new instance of LongFileInfo using the information contained in
            <paramref name="fileData"/> to get the date information.
            </summary>
            <param name="fullName">The path of the file</param>
            <param name="fileData">The data structure which contains the dates for the files</param>
        </member>
        <member name="T:NationalInstruments.TestStand.Utility.LongFile">
            <summary>This is a utilitiy class to help work with path names
            greater than MAX_PATH.</summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.LongFile.Exists(System.String)">
            <summary> This function mimics the behavior of
            <see cref="M:System.IO.File.Exists(System.String)"/>
            but works on paths longer than MAX_PATH.
            Note that paths longer than MAX_PATH cannot be relative,
            so we cannot duplicate the behavior of
            File.Exists() exactly.  This Exists() method requires
            an absolute path (even for short paths).
            Note:  This method will escape any path you give it with "\\?\"
            (or "\\?\UNC\" if appropriate). You should not prepend the
            "\\?\" to the path yourself.</summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.LongFile.Move(System.String,System.String)">
            <summary> This function mimics the behavior of
            <see cref="M:System.IO.File.Move(System.String,System.String)"/>
            but works on paths longer than MAX_PATH.  Note that paths longer
            than MAX_PATH cannot be relative, so we cannot duplicate
            the behavior of File.Move() exactly.  This Move() method requires
            an absolute path (even for short paths).  Also, the exception
            behavior is not identical to that specified in File.Move().
            You may get different types of
            <see cref="T:System.IO.IOException"/> than specified.  You may
            also get <see cref="T:System.ComponentModel.Win32Exception"/>.
            Note:  This method will escape any path you give it with "\\?\"
            (or "\\?\UNC\" if appropriate). You should not prepend the
            "\\?\" to the paths yourself.</summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.LongFile.Copy(System.String,System.String)">
             <summary> This function mimics the behavior of
             <see cref="M:System.IO.File.Copy(System.String,System.String)"/>
             but works on paths longer than MAX_PATH.  Note that paths longer
             than MAX_PATH cannot be relative, so we cannot duplicate
             the behavior of File.Copy() exactly.  This Copy() method requires
             an absolute path (even for short paths).  Also, the exception
             behavior is not identical to that specified in File.Copy().
             You may get different types of
             <see cref="T:System.IO.IOException"/> than specified.  You may
             also get <see cref="T:System.ComponentModel.Win32Exception"/>.
             Note:  This method will escape any path you give it with "\\?\"
             (or "\\?\UNC\" if appropriate). You should not prepend the
             "\\?\" to the paths yourself.</summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.LongFile.Copy(System.String,System.String,System.Boolean)">
             <summary> This function mimics the behavior of
             <see cref="M:System.IO.File.Copy(System.String,System.String,System.Boolean)"/>
             but works on paths longer than MAX_PATH.  Note that paths longer
             than MAX_PATH cannot be relative, so we cannot duplicate
             the behavior of File.Copy() exactly.  This Copy() method requires
             an absolute path (even for short paths).  Also, the exception
             behavior is not identical to that specified in File.Copy().
             You may get different types of
             <see cref="T:System.IO.IOException"/> than specified.  You may
             also get <see cref="T:System.ComponentModel.Win32Exception"/>.
             Note:  This method will escape any path you give it with "\\?\"
             (or "\\?\UNC\" if appropriate). You should not prepend the
             "\\?\" to the paths yourself.</summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.LongFile.Delete(System.String)">
             <summary> This function mimics the behavior of
             <see cref="M:System.IO.File.Delete(System.String)"/>
             but works on paths longer than MAX_PATH.  Note that paths longer
             than MAX_PATH cannot be relative, so we cannot duplicate
             the behavior of File.Delete() exactly.  This Delete() method
             requires an absolute path (even for short paths).  Also, the
             exception behavior is not identical to that specified in
             File.Delete().  You may get different types of
             <see cref="T:System.IO.IOException"/> than specified.  You may
             also get <see cref="T:System.ComponentModel.Win32Exception"/>.
             Note:  This method will escape any path you give it with "\\?\"
             (or "\\?\UNC\" if appropriate). You should not prepend the
             "\\?\" to the path yourself.</summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.LongFile.GetAttributes(System.String)">
            <summary>
            Gets the FileAttributes of the file on the <paramref name="path"/>.
            </summary>
            <param name="path">The path to the file.</param>
            <returns>The FileAttributes of the file on the path.</returns>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.LongFile.SetAttributes(System.String,NationalInstruments.TestStand.Utility.Win32.FileAttributes)">
            <summary>
            Sets the specified <paramref name="fileAttributes"/> of the file on the specified
            <paramref name="path"/>.
            </summary>
            <param name="path">The path to the file.</param>
            <param name="fileAttributes">A bitwise combination of the enumeration values.</param>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.LongFile.WriteAllText(System.String,System.String)">
            <summary>
            Creates a new file, writes the specified string to the file, and then closes the file.
            If the target file already exists, it is overwritten.
            </summary>
            <param name="path">The file to write to.</param>
            <param name="contents">The string to write to the file.</param>
        </member>
        <member name="T:NationalInstruments.TestStand.Utility.LongDirectory">
            <summary>
            This is a utilitiy class to help work with path names greater than
            MAX_PATH.
            </summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.LongDirectory.Exists(System.String)">
            <summary>
            This function mimics the behavior of
            <see cref="M:System.IO.Directory.Exists(System.String)"/>
            but works on paths longer than MAX_PATH.
            Note that paths longer than MAX_PATH cannot be relative,
            so we cannot duplicate the behavior of
            Directory.Exists() exactly.  This Exists() method requires
            an absolute path (even for short paths).
            Note:  This method will escape any path you give it with "\\?\"
            (or "\\?\UNC\" if appropriate). You should not prepend the
            "\\?\" to the paths yourself.</summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.LongDirectory.Delete(System.String,System.Boolean)">
            <summary>
            This function mimics the behavior of
            <see cref="M:System.IO.Directory.Delete(System.String,System.Boolean)"/>
            but works on paths longer than MAX_PATH.
            Note that paths longer than MAX_PATH cannot be relative,
            so we cannot duplicate the behavior of
            Directory.Delete() exactly.  This Delete() method requires
            an absolute path (even for short paths).
            Note:  This method will escape any path you give it with "\\?\"
            (or "\\?\UNC\" if appropriate). You should not prepend the
            "\\?\" to the paths yourself.</summary>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.LongDirectory.CreateDirectory(System.String)">
            <summary>This function mimics the behavior of
            <see cref="M:System.IO.Directory.CreateDirectory(System.String)"/>
            but works on paths longer than MAX_PATH.
            Note that paths longer than MAX_PATH cannot be relative,
            so we cannot duplicate the behavior of
            Directory.CreateDirectory() exactly.  This method requires
            an absolute path (even for short paths).
            Note:  This method will escape any path you give it with "\\?\"
            (or "\\?\UNC\" if appropriate). You should not prepend the
            "\\?\" to the paths yourself.
            </summary>
            <param name="path">The directory path to create.</param>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.LongDirectory.GetFiles(System.String)">
            <summary>This function mimics the behavior of
            <see cref="M:System.IO.Directory.GetFiles(System.String)"/>
            but works on paths longer than MAX_PATH.
            Note that paths longer than MAX_PATH cannot be relative,
            so we cannot duplicate the behavior of
            Directory.GetFiles() exactly.  This method requires
            an absolute path (even for short paths).
            Note:  This method will escape any path you give it with "\\?\"
            (or "\\?\UNC\" if appropriate). You should not prepend the
            "\\?\" to the paths yourself.
            </summary>
            <param name="path">The full path name of the directory to get
            files from.</param>
        </member>
        <member name="M:NationalInstruments.TestStand.Utility.LongDirectory.GetDirectories(System.String)">
            <summary>This function mimics the behavior of
            <see cref="M:System.IO.Directory.GetDirectories(System.String)"/>
            but works on paths longer than MAX_PATH.
            Note that paths longer than MAX_PATH cannot be relative,
            so we cannot duplicate the behavior of
            Directory.GetDirectories() exactly.  This method requires
            an absolute path (even for short paths).
            Note:  This method will escape any path you give it with "\\?\"
            (or "\\?\UNC\" if appropriate). You should not prepend the
            "\\?\" to the paths yourself.
            </summary>
            <param name="path">The full path name of the directory to get
            directories from.</param>
        </member>
    </members>
</doc>
Libs/TSSync.Interop.dll
Binary files differ
ModBusTcpController/ModBusTcpController.cs
@@ -48,23 +48,39 @@
            return res?.IsSuccess == true;
        }
        public bool ReadDIInt(string address, out int res, out string msg)
        public bool ReadDIInt16(string address, out int res, out string msg)
        {
            var result = client?.ReadInt32($"x=2;{address}");
            var result = client?.ReadInt16($"x=2;{address}");
            msg = result?.Message;
            res = result?.Content ?? 0;
            return result?.IsSuccess == true;
        }
        public bool ReadDOInt(string address, out int res, out string msg)
        public bool ReadDOInt16(string address, out int res, out string msg)
        {
            var result = client?.ReadInt32(address);
            var result = client?.ReadInt16(address);
            msg = result?.Message;
            res = result?.Content ?? 0;
            return result?.IsSuccess == true;
        }
        public bool WriteInt(string address, int value, out string msg)
        public bool WriteInt16(string address, short value, out string msg)
        {
            msg = string.Empty;
            var res = client?.Write(address, value);
            msg = res.Message;
            return res?.IsSuccess == true;
        }
        public bool ReadUInt16(string address, out ushort res, out string msg)
        {
            var result = client?.ReadUInt16(address);
            msg = result?.Message;
            res = result?.Content ?? 0;
            return result?.IsSuccess == true;
        }
        public bool WriteUInt16(string address, ushort value, out string msg)
        {
            msg = string.Empty;
            var res = client?.Write(address, value);
ModBusTcpController/Properties/AssemblyInfo.cs
@@ -28,5 +28,5 @@
//      ç”Ÿæˆå·
//      ä¿®è®¢å·
//
[assembly: AssemblyVersion("1.0.0.1")]
[assembly: AssemblyFileVersion("1.0.0.1")]
[assembly: AssemblyVersion("1.0.0.3")]
[assembly: AssemblyFileVersion("1.0.0.3")]
PLCHelper/Entity/PLCTagData.cs
File was renamed from Plugin.CurrentSensorControl/Entity/PLCTagData.cs
@@ -1,18 +1,31 @@
using HMI.Core;
namespace Plugin.CurrentSensorControl.Entity
namespace PLCHelper.Entity
{
    public enum PLCTagType {
    public enum PLCTagType
    {
        BOOL,
        SHORT,
        USHORT,
        INT,
        FLOAT
    }
    public enum ConnectionType
    {
        MODBUS,
        PLC_S7,
        NXI_5010
    }
    public class PLCTagData
    {
        [ExcelColumn("名称")]
        public string Name { get; set; }
        [ExcelColumn("连接类型")]
        public ConnectionType ConnectionType { get; set; } = ConnectionType.PLC_S7;
        [ExcelColumn("地址")]
        public string Address { get; set; }
        [ExcelColumn("类型")]
PLCHelper/ModbusHelper.cs
New file
@@ -0,0 +1,153 @@
using HslCommunication;
using HslCommunication.ModBus;
using PLCHelper.Entity;
using System;
using System.Collections.Concurrent;
namespace PLCHelper
{
    public class ModbusHelper
    {
        private static ConcurrentDictionary<string, ModbusTcpNet> cache = new ConcurrentDictionary<string, ModbusTcpNet>();
        internal static ModbusTcpNet GetClient(string ip, int port)
        {
            string key = $"{ip}:{port};";
            if (!cache.ContainsKey(key))
            {
                var client = new ModbusTcpNet(ip, port);
                cache[key] = client;
                client.ConnectServer();
            }
            return cache[key];
        }
        internal static bool ParseConfig(string address, out string ip, out int port, out string index)
        {
            try
            {
                var arr = address.Split(',');
                ip = arr[0];
                port = int.Parse(arr[1]);
                index = arr[2];
                return true;
            }
            catch
            {
                ip = null;
                port = -1;
                index = null;
                return false;
            }
        }
        internal static void Release()
        {
            foreach (var client in cache.Values)
            {
                client.Dispose();
            }
            cache.Clear();
        }
        internal static bool ReadData(PLCTagData data, out object val, out string errMsg)
        {
            val = null;
            try
            {
                string address = data.Address;
                if (!ModbusHelper.ParseConfig(address, out string ip, out int port, out string index))
                {
                    errMsg = "解析配置失败";
                    return false;
                }
                var api = ModbusHelper.GetClient(ip, port);
                if (data.Type == PLCTagType.BOOL)
                {
                    var res = api.ReadBool(index);
                    val = res.Content;
                    errMsg = res.Message;
                    return res.IsSuccess;
                }
                else if (data.Type == PLCTagType.SHORT)
                {
                    var res = api.ReadInt16(index);
                    val = res.Content;
                    errMsg = res.Message;
                    return res.IsSuccess;
                }
                else if (data.Type == PLCTagType.USHORT)
                {
                    var res = api.ReadUInt16(index);
                    val = res.Content;
                    errMsg = res.Message;
                    return res.IsSuccess;
                }
                else if (data.Type == PLCTagType.INT)
                {
                    var res = api.ReadInt32(index);
                    val = res.Content;
                    errMsg = res.Message;
                    return res.IsSuccess;
                }
                else if (data.Type == PLCTagType.FLOAT)
                {
                    var res = api.ReadFloat(index);
                    val = res.Content;
                    errMsg = res.Message;
                    return res.IsSuccess;
                }
                errMsg = "类型不支持";
                return false;
            }
            catch (Exception ex)
            {
                errMsg = ex.Message;
                return false;
            }
        }
        internal static bool WriteData(PLCTagData data, object val, out string msg)
        {
            try
            {
                string address = data.Address;
                if (!ParseConfig(address, out string ip, out int port, out string index))
                {
                    msg = "解析配置失败";
                    return false;
                }
                var api = GetClient(ip, port);
                OperateResult res;
                switch (data.Type)
                {
                    case PLCTagType.BOOL:
                        res = api.Write(index, bool.Parse(val.ToString()));
                        break;
                    case PLCTagType.SHORT:
                        res = api.Write(index, short.Parse(val.ToString()));
                        break;
                    case PLCTagType.USHORT:
                        res = api.Write(index, ushort.Parse(val.ToString()));
                        break;
                    case PLCTagType.INT:
                        res = api.Write(index, int.Parse(val.ToString()));
                        break;
                    case PLCTagType.FLOAT:
                        res = api.Write(index, float.Parse(val.ToString()));
                        break;
                    default:
                        msg = "类型不支持";
                        return false;
                }
                msg = res.Message;
                return res.IsSuccess;
            }
            catch (Exception ex)
            {
                msg = ex.Message;
                return false;
            }
        }
    }
}
PLCHelper/NXI_5010Helper.cs
New file
@@ -0,0 +1,109 @@
using PLCHelper.Entity;
using System.Collections.Generic;
namespace PLCHelper
{
    public class NXI_5010Helper
    {
        private static Dictionary<string, RestTcpClient> cache = new Dictionary<string, RestTcpClient>();
        internal static RestTcpClient GetClient(string ip, int port)
        {
            var key = $"{ip}:{port};";
            if (!cache.ContainsKey(key))
            {
                var client = new RestTcpClient(ip, port);
                client.ReceiveTimeout = 500;
                client.ConnectServer();
                if (client.Request("*RST", out string res, out string errMsg) && res == "RST")
                {
                    if (client.Request("*TSS", out res, out errMsg))
                    {
                    }
                }
                cache[key] = client;
            }
            return cache[key];
        }
        internal static bool ParseConfig(string address, out string ip, out int port, out string slot, out string com, out string chn)
        {
            try
            {
                var arr = address.Split(',');
                ip = arr[0];
                port = int.Parse(arr[1]);
                slot = arr[2];
                com = arr[3];
                chn = arr[4];
                return true;
            }
            catch
            {
                ip = null;
                port = -1;
                slot = null;
                com = null;
                chn = null;
                return false;
            }
        }
        internal static bool ReadData(PLCTagData data, string name, out object val)
        {
            val = null;
            string address = data.Address;
            if (!ParseConfig(address, out string ip, out int port, out string slot, out string com, out string chn))
            {
                return false;
            }
            var api = GetClient(ip, port);
            if (data.Type == PLCTagType.BOOL)
            {
                var send = $"MULT::SLOT {slot}:GET G{com}C{chn}";
                var res = api.ReadBool(send);
                val = res.Content;
                return res.IsSuccess;
            }
            return false;
        }
        internal static bool WriteData(PLCTagData data, string name, object val)
        {
            val = null;
            string address = data.Address;
            if (!ParseConfig(address, out string ip, out int port, out string slot, out string com, out string chn))
            {
                return false;
            }
            var api = GetClient(ip, port);
            if (data.Type == PLCTagType.BOOL)
            {
                string send = string.Empty;
                if ((bool)val == true)
                {
                    send = $"MULT::SLOT {slot}:SET G{com}C{chn}";
                    var res = api.Write(send, true);
                    return res.IsSuccess;
                }
                else
                {
                    send = $"MULT::SLOT {slot}:RESE";
                    var res = api.Write(send, true);
                    return res.IsSuccess;
                }
            }
            return false;
        }
        internal static void Release()
        {
            foreach (var client in cache.Values)
            {
                client.Dispose();
            }
            cache.Clear();
        }
    }
}
PLCHelper/PLCHelper.csproj
New file
@@ -0,0 +1,65 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
  <PropertyGroup>
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
    <ProjectGuid>{C3F17E03-EF05-4203-8D29-3AD984F3BD9C}</ProjectGuid>
    <OutputType>Library</OutputType>
    <AppDesignerFolder>Properties</AppDesignerFolder>
    <RootNamespace>PLCHelper</RootNamespace>
    <AssemblyName>PLCHelper</AssemblyName>
    <TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
    <FileAlignment>512</FileAlignment>
    <Deterministic>true</Deterministic>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
    <DebugSymbols>true</DebugSymbols>
    <DebugType>full</DebugType>
    <Optimize>false</Optimize>
    <OutputPath>bin\Debug\</OutputPath>
    <DefineConstants>DEBUG;TRACE</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
    <DebugType>pdbonly</DebugType>
    <Optimize>true</Optimize>
    <OutputPath>bin\Release\</OutputPath>
    <DefineConstants>TRACE</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
  </PropertyGroup>
  <ItemGroup>
    <Reference Include="HslCommunication">
      <HintPath>..\Libs\HslCommunication.dll</HintPath>
    </Reference>
    <Reference Include="System" />
    <Reference Include="System.Core" />
    <Reference Include="System.Xml.Linq" />
    <Reference Include="System.Data.DataSetExtensions" />
    <Reference Include="Microsoft.CSharp" />
    <Reference Include="System.Data" />
    <Reference Include="System.Net.Http" />
    <Reference Include="System.Xml" />
  </ItemGroup>
  <ItemGroup>
    <Compile Include="Entity\PLCTagData.cs" />
    <Compile Include="ModbusHelper.cs" />
    <Compile Include="NXI_5010Helper.cs" />
    <Compile Include="Properties\AssemblyInfo.cs" />
    <Compile Include="RestTcpClient.cs" />
    <Compile Include="S7Context.cs" />
  </ItemGroup>
  <ItemGroup>
    <ProjectReference Include="..\HMI.Core\HMI.Core.csproj">
      <Project>{3e3bf44a-0b69-45c5-9512-528cb48a7106}</Project>
      <Name>HMI.Core</Name>
    </ProjectReference>
    <ProjectReference Include="..\SimpleUtil\HMI.Simple.Util\HMI.Simple.Util.csproj">
      <Project>{CF5BEBE9-2803-49C3-B773-73D082E0984A}</Project>
      <Name>HMI.Simple.Util</Name>
    </ProjectReference>
  </ItemGroup>
  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>
PLCHelper/Properties/AssemblyInfo.cs
New file
@@ -0,0 +1,33 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// æœ‰å…³ç¨‹åºé›†çš„一般信息由以下
// æŽ§åˆ¶ã€‚更改这些特性值可修改
// ä¸Žç¨‹åºé›†å…³è”的信息。
[assembly: AssemblyTitle("PLCHelper")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("PLCHelper")]
[assembly: AssemblyCopyright("Copyright Â©  2025")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// å°† ComVisible è®¾ç½®ä¸º false ä¼šä½¿æ­¤ç¨‹åºé›†ä¸­çš„类型
//对 COM ç»„件不可见。如果需要从 COM è®¿é—®æ­¤ç¨‹åºé›†ä¸­çš„类型
//请将此类型的 ComVisible ç‰¹æ€§è®¾ç½®ä¸º true。
[assembly: ComVisible(false)]
// å¦‚果此项目向 COM å…¬å¼€ï¼Œåˆ™ä¸‹åˆ— GUID ç”¨äºŽç±»åž‹åº“çš„ ID
[assembly: Guid("c3f17e03-ef05-4203-8d29-3ad984f3bd9c")]
// ç¨‹åºé›†çš„版本信息由下列四个值组成:
//
//      ä¸»ç‰ˆæœ¬
//      æ¬¡ç‰ˆæœ¬
//      ç”Ÿæˆå·
//      ä¿®è®¢å·
//
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
PLCHelper/RestTcpClient.cs
New file
@@ -0,0 +1,114 @@
using HslCommunication;
using System;
using System.IO;
using System.Net.Sockets;
using System.Text;
namespace PLCHelper
{
    public class RestTcpClient : IDisposable
    {
        public string IP { get; private set; }
        public int Port { get; private set; }
        public int ReceiveTimeout { get; set; } = 5000;
        private TcpClient tcpClient;
        private Stream Stream;
        private BinaryReader reader;
        private BinaryWriter writer;
        public RestTcpClient(string ip, int port)
        {
            IP = ip;
            Port = port;
        }
        public void ConnectServer()
        {
            tcpClient = new TcpClient(IP, Port);
            tcpClient.ReceiveTimeout = ReceiveTimeout;
            Stream = tcpClient.GetStream();
            reader = new BinaryReader(Stream);
            writer = new BinaryWriter(Stream);
        }
        public OperateResult<bool> ReadBool(string data)
        {
            OperateResult<bool> res = new OperateResult<bool>();
            if (Request(data, out string response, out string errMsg))
            {
                res.Content = bool.Parse(response);
                res.IsSuccess = true;
            }
            else
            {
                res.Message = errMsg;
                res.IsSuccess = false;
            }
            return res;
        }
        public OperateResult Write(string data, bool val)
        {
            OperateResult res = new OperateResult();
            if (Request(data, out string response, out string errMsg))
            {
                res.IsSuccess = true;
            }
            else
            {
                res.Message = errMsg;
                res.IsSuccess = false;
            }
            return res;
        }
        public void Send(string data)
        {
            data = data + "\r";
            writer.Write(Encoding.UTF8.GetBytes(data));
            writer.Flush();
        }
        public bool Request(string data, out string response, out string errMsg)
        {
            lock (this)
            {
                errMsg = string.Empty;
                response = string.Empty;
                try
                {
                    Send(data);
                    response = Receive();
                    return true;
                }
                catch (Exception ex)
                {
                    errMsg = ex.Message;
                    return false;
                }
            }
        }
        private string Receive()
        {
            byte[] array = new byte[1024];
            int num = tcpClient.Client.Receive(array);
            if (num == 0)
            {
                throw new Exception("Closed");
            }
            var bytes = new byte[num];
            Array.Copy(array, bytes, num);
            string data = Encoding.UTF8.GetString(bytes);
            if (data.EndsWith("\r")) data = data.Substring(0, data.Length - 1);
            return data;
        }
        public void Dispose()
        {
            tcpClient.Close();
        }
    }
}
PLCHelper/S7Context.cs
New file
@@ -0,0 +1,313 @@
using HMI.Core.Util;
using HslCommunication;
using HslCommunication.Core.Pipe;
using HslCommunication.Profinet.Siemens;
using PLCHelper.Entity;
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.IO;
namespace PLCHelper
{
    public class S7Context
    {
        private static ConcurrentDictionary<string, SiemensS7Net> cache = new ConcurrentDictionary<string, SiemensS7Net>();
        private static ConcurrentDictionary<SiemensS7Net, int> failedCount = new ConcurrentDictionary<SiemensS7Net, int>();
        private static Dictionary<string, PLCTagData> dataCache = new Dictionary<string, PLCTagData>();
        public static ObservableCollection<PLCTagData> Datasource = new ObservableCollection<PLCTagData>();
        private static string Ip;
        private static int Port;
        private static readonly object lockObj = new object();
        public static void Init(string ip, int port)
        {
            Ip = ip;
            Port = port;
            LoadTagData();
        }
        public static void LoadTagData()
        {
            lock (lockObj)
            {
                dataCache.Clear();
                try
                {
                    string path = Path.Combine(PathHelper.ConfigFolder, "CurrentSensorControl", "BurnInSettingData.data");
                    if (File.Exists(path))
                    {
                        Datasource = XmlHelper.DeserializeFromXml<ObservableCollection<PLCTagData>>(path);
                    }
                    else
                    {
                        Datasource = new ObservableCollection<PLCTagData>();
                    }
                }
                catch (Exception ex)
                {
                    Datasource = new ObservableCollection<PLCTagData>();
                }
                foreach (var data in Datasource)
                {
                    dataCache[data.Name] = data;
                }
            }
        }
        public static SiemensS7Net Get(string name)
        {
            if (!cache.ContainsKey(name))
            {
                var client = new SiemensS7Net(SiemensPLCS.S1500);
                cache[name] = client;
                PipeTcpNet pipeTcpNet = new PipeTcpNet(Ip, Port);
                pipeTcpNet.ConnectTimeOut = 200;
                pipeTcpNet.ReceiveTimeOut = 200;
                client.CommunicationPipe = pipeTcpNet;
                client.ConnectServer();
                failedCount[client] = 0;
            }
            return cache[name];
        }
        private static bool GetS7Data(SiemensS7Net api, PLCTagData data, string name, out object val)
        {
            val = null;
            string address = data.Address;
            if (data.Type == PLCTagType.BOOL)
            {
                var res = api.ReadBool(address);
                val = res.Content;
                return res.IsSuccess;
            }
            else if (data.Type == PLCTagType.SHORT)
            {
                var res = api.ReadInt16(address);
                val = res.Content;
                return res.IsSuccess;
            }
            else if (data.Type == PLCTagType.INT)
            {
                var res = api.ReadInt32(address);
                val = res.Content;
                return res.IsSuccess;
            }
            else if (data.Type == PLCTagType.FLOAT)
            {
                var res = api.ReadFloat(address);
                val = res.Content;
                return res.IsSuccess;
            }
            return false;
        }
        public static bool GetData(SiemensS7Net api, string name, out object val)
        {
            val = null;
            if (dataCache.ContainsKey(name))
            {
                var data = dataCache[name];
                if (data.ConnectionType == ConnectionType.PLC_S7)
                {
                    if (failedCount[api] >= 3)
                    {
                        return false;
                    }
                    var res = GetS7Data(api, data, name, out val);
                    if (!res) failedCount[api]++;
                    return res;
                }
                else if (data.ConnectionType == ConnectionType.MODBUS)
                {
                    return ModbusHelper.ReadData(data, out val, out _);
                }
                else if (data.ConnectionType == ConnectionType.NXI_5010)
                {
                    return NXI_5010Helper.ReadData(data, name, out val);
                }
                return false;
            }
            else
            {
                return false;
            }
        }
        public static bool GetData(string apiName, string name, out object val)
        {
            val = null;
            if (dataCache.ContainsKey(name))
            {
                var data = dataCache[name];
                if (data.ConnectionType == ConnectionType.PLC_S7)
                {
                    var api = Get(apiName);
                    if (failedCount[api] >= 3)
                    {
                        return false;
                    }
                    var res = GetS7Data(api, data, name, out val);
                    if (!res) failedCount[api]++;
                    return res;
                }
                else if (data.ConnectionType == ConnectionType.MODBUS)
                {
                    return ModbusHelper.ReadData(data, out val, out _);
                }
                else if (data.ConnectionType == ConnectionType.NXI_5010)
                {
                    return NXI_5010Helper.ReadData(data, name, out val);
                }
                return false;
            }
            else
            {
                return false;
            }
        }
        private static bool WriteS7Data(SiemensS7Net api, PLCTagData data, string name, object val)
        {
            string address = data.Address;
            OperateResult res;
            switch (data.Type)
            {
                case PLCTagType.BOOL:
                    res = api.Write(address, (bool)val);
                    break;
                case PLCTagType.SHORT:
                    res = api.Write(address, (short)val);
                    break;
                case PLCTagType.USHORT:
                    res = api.Write(address, (ushort)val);
                    break;
                case PLCTagType.INT:
                    res = api.Write(address, (int)val);
                    break;
                case PLCTagType.FLOAT:
                    res = api.Write(address, (float)val);
                    break;
                default:
                    return false;
            }
            return res.IsSuccess;
        }
        private static bool WriteS7Data2(SiemensS7Net api, PLCTagData data, string name, object val, out string errMsg)
        {
            errMsg = string.Empty;
            string address = data.Address;
            OperateResult res;
            switch (data.Type)
            {
                case PLCTagType.BOOL:
                    res = api.Write(address, (bool)val);
                    break;
                case PLCTagType.SHORT:
                    res = api.Write(address, (short)val);
                    break;
                case PLCTagType.USHORT:
                    res = api.Write(address, (ushort)val);
                    break;
                case PLCTagType.INT:
                    res = api.Write(address, (int)val);
                    break;
                case PLCTagType.FLOAT:
                    res = api.Write(address, (float)val);
                    break;
                default:
                    return false;
            }
            errMsg = res.Message;
            return res.IsSuccess;
        }
        public static bool WriteData(SiemensS7Net api, string name, object val)
        {
            if (dataCache.ContainsKey(name))
            {
                var data = dataCache[name];
                string address = data.Address;
                if (data.ConnectionType == ConnectionType.PLC_S7)
                {
                    if (failedCount[api] >= 3)
                    {
                        return false;
                    }
                    var res = WriteS7Data(api, data, name, val);
                    if (!res) failedCount[api]++;
                    return res;
                }
                else if (data.ConnectionType == ConnectionType.MODBUS)
                {
                    return ModbusHelper.WriteData(data, val, out _);
                }
                return false;
            }
            else
            {
                return false;
            }
        }
        public static bool WriteData(string apiName, string name, object val, out string errMsg)
        {
            errMsg = string.Empty;
            if (dataCache.ContainsKey(name))
            {
                var data = dataCache[name];
                string address = data.Address;
                if (data.ConnectionType == ConnectionType.PLC_S7)
                {
                    var api = Get(apiName);
                    if (failedCount[api] >= 3)
                    {
                        errMsg = "超过重试次数";
                        return false;
                    }
                    var res = WriteS7Data2(api, data, name, val, out errMsg);
                    if (!res) failedCount[api]++;
                    return res;
                }
                else if (data.ConnectionType == ConnectionType.MODBUS)
                {
                    return ModbusHelper.WriteData(data, val, out errMsg);
                }
                errMsg = "不支持的类型";
                return false;
            }
            else
            {
                errMsg = $"未找到标签[{name}]";
                return false;
            }
        }
        public static void Release()
        {
            foreach (var client in cache.Values)
            {
                client.Dispose();
            }
            cache.Clear();
            ModbusHelper.Release();
            NXI_5010Helper.Release();
        }
        public static void ResetFailCount()
        {
            foreach (var client in failedCount.Keys)
            {
                failedCount[client] = 0;
            }
        }
    }
}
Plugin.CurrentSensorControl/BurnInCell.xaml
@@ -13,20 +13,26 @@
xmlns:pw="https://opensource.panuon.com/wpf"
xmlns:pu="https://opensource.panuon.com/wpf-ui"
xmlns:dp="clr-namespace:HMI.UI.DpUtil;assembly=HMI.UI"
             FontSize="10"
             d:DesignHeight="450" d:DesignWidth="800">
    <UserControl.Resources>
        <Style TargetType="pu:Switch">
            <Setter Property="ContentPlacement" Value="Left" />
            <Setter Property="BoxHeight" Value="16" />
            <Setter Property="CheckedBackground" Value="{StaticResource GreenVerBar}" />
            <Setter Property="Background" Value="{StaticResource DangerColor}" />
            <Setter Property="BoxHeight" Value="14" />
            <Setter Property="CheckedBackground" Value="{DynamicResource GreenVerBar}" />
            <Setter Property="Background" Value="{DynamicResource DangerColor}" />
            <Setter Property="ToggleSize" Value="10" />
            <Setter Property="ToggleShadowColor" Value="{x:Null}" />
            <Setter Property="Margin" Value="0"/>
            <Setter Property="Padding" Value="0"/>
        </Style>
        <Style TargetType="Label">
            <Setter Property="VerticalContentAlignment" Value="Center"/>
        </Style>
    </UserControl.Resources>
    <GroupBox Header="{Binding Header}">
        <Grid>
        <!--<Grid>
            <Grid.RowDefinitions>
                <RowDefinition />
                <RowDefinition />
@@ -52,14 +58,57 @@
            <pu:Switch Grid.Row="1" Grid.Column="1" CheckedContent="NG亮" x:Name="ngLightSw" 
                       IsChecked="{Binding NgLightOn,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"
Content="NG灭"/>
        </Grid>-->
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="Auto"/>
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="Auto"/>
                <ColumnDefinition />
                <ColumnDefinition Width="Auto"/>
                <ColumnDefinition />
            </Grid.ColumnDefinitions>
            <Label>电源</Label>
            <pu:Switch Grid.Row="0" Grid.Column="1" x:Name="powerSw"
IsChecked="{Binding PowerStatus,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/>
            <!--<ui:LightBall Grid.Row="1" Grid.Column="0" Value="{Binding CellStatus}" Content="OK/NG状态"/>-->
            <!--<TextBlock Grid.Row="0" Grid.Column="0"  Text="{Binding PowerStatus}"/>
            <TextBlock Grid.Row="0" Grid.Column="1"  Text="{Binding ActivationStatus}"/>-->
            <Label Grid.Row="0" Grid.Column="2">激活</Label>
            <pu:Switch Grid.Row="0" Grid.Column="3" x:Name="activationSw"
IsChecked="{Binding ActivationStatus,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/>
            
            <Label Grid.Row="1" Grid.Column="0">OK灯</Label>
            <pu:Switch Grid.Row="1" Grid.Column="1" x:Name="okLightSw"
                       IsChecked="{Binding OkLightOn,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/>
            <Label Grid.Row="1" Grid.Column="2">NG灯</Label>
            <pu:Switch Grid.Row="1" Grid.Column="3" x:Name="ngLightSw"
                       IsChecked="{Binding NgLightOn,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/>
            <Label Grid.Row="2" Grid.Column="0">电流</Label>
            <TextBox Grid.Row="2" Grid.Column="1" Grid.ColumnSpan="3" IsReadOnly="True"
                     Style="{StaticResource EditorTextBoxStyle}" Height="18" Text="{Binding Current}"/>
        </Grid>
        <!--<UniformGrid Rows="2" Columns="2">
            <pu:Switch Grid.Row="0" Grid.Column="0" CheckedContent="电源开" x:Name="powerSw"
IsChecked="{Binding PowerStatus,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"
Content="电源关"/>
            <pu:Switch Grid.Row="0" Grid.Column="1" CheckedContent="激活" x:Name="activationSw"
IsChecked="{Binding ActivationStatus,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"
Content="未激活"/>
            <pu:Switch Grid.Row="1" Grid.Column="0" CheckedContent="OK亮" x:Name="okLightSw"
                       IsChecked="{Binding OkLightOn,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"
Content="OK灭"/>
            <pu:Switch Grid.Row="1" Grid.Column="1" CheckedContent="NG亮" x:Name="ngLightSw"
                       IsChecked="{Binding NgLightOn,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"
Content="NG灭"/>
        </UniformGrid>-->
    </GroupBox>
</UserControl>
Plugin.CurrentSensorControl/BurnInCell.xaml.cs
@@ -1,5 +1,6 @@
using CommunityToolkit.Mvvm.ComponentModel;
using HslCommunication.Profinet.Siemens;
using PLCHelper;
using Plugin.CurrentSensorControl.Entity;
using System.Windows.Controls;
@@ -117,6 +118,9 @@
            }
        }
        [ObservableProperty]
        private string current;
        [ObservableProperty]
@@ -169,6 +173,12 @@
                    ngLightOn = (bool)val;
                    OnPropertyChanged("NgLightOn");
                }
                name = $"Oven{ovenIndex + 1}_Cell{cellIndex + 1}_Current";
                if (S7Context.GetData(api, name, out val))
                {
                    Current = val.ToString();
                }
            }
            catch (Exception ex)
            {
Plugin.CurrentSensorControl/BurnInOven.xaml
@@ -13,6 +13,7 @@
            xmlns:pw="https://opensource.panuon.com/wpf"
            xmlns:pu="https://opensource.panuon.com/wpf-ui"
            xmlns:dp="clr-namespace:HMI.UI.DpUtil;assembly=HMI.UI"
            FontSize="10"
            d:DesignHeight="450" d:DesignWidth="800">
    <UserControl.Resources>
        <Style x:Key="ovenTb" TargetType="TextBox" BasedOn="{StaticResource EditorTextBoxStyle}">
@@ -36,22 +37,29 @@
                <pu:Switch CheckedContent="照明开" x:Name="lightSw" 
                           CheckedBackground="Green"
                           Background="{StaticResource DangerColor}"
                           BoxHeight="14"
                           Background="{DynamicResource DangerColor}"
                           IsChecked="{Binding LightStatus,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" 
                           Content="照明关"/>
                <Button Background="{StaticResource PrimaryColor}" Foreground="{StaticResource PrimaryColorContract}"
                        Click="Button_Click"
                        Tag="0"
                        Content="停止等待"/>
                <Button Background="{StaticResource DangerColor}" Foreground="{StaticResource DangerColorContrast}"
                        Click="Button_Click"
                        Tag="1"
                        Content="加热启动"/>
                <Button Background="{StaticResource SuccessColor}" Foreground="{StaticResource SuccessColorContrast}"
                        Click="Button_Click"
                        Tag="2"
                        Content="冷却启动"/>
                <Button Background="{DynamicResource PrimaryColor}" Foreground="{DynamicResource PrimaryColorContract}"
                        Click="Button_Click" Tag="0" Content="停止等待"/>
                <Button Background="{DynamicResource DangerColor}" Foreground="{DynamicResource DangerColorContrast}"
                        Click="Button_Click" Tag="1" Content="加热启动"/>
                <Button Background="{DynamicResource SuccessColor}" Foreground="{DynamicResource SuccessColorContrast}"
                        Click="Button_Click" Tag="2" Content="冷却启动"/>
                <pu:FormGroup Header="水冷机状态">
                    <TextBox Style="{StaticResource ovenTb}" IsReadOnly="True" Text="{Binding CoolerStatus}"/>
                </pu:FormGroup>
                <Button Background="{DynamicResource PrimaryColor}" Foreground="{DynamicResource PrimaryColorContract}"
                        Click="Button_Click2" Tag="1" Content="运水"/>
                <Button Background="{DynamicResource PrimaryColor}" Foreground="{DynamicResource DangerColorContrast}"
                        Click="Button_Click2" Tag="2" Content="吹水"/>
                <Button Background="{DynamicResource PrimaryColor}" Foreground="{DynamicResource SuccessColorContrast}"
                        Click="Button_Click2" Tag="3" Content="测压"/>
                <Button Background="{DynamicResource DangerColor}" Foreground="{DynamicResource SuccessColorContrast}"
                        Click="Button_Click2" Tag="0" Content="停止"/>
            </StackPanel>
            <StackPanel Grid.Row="1" Grid.Column="0" Orientation="Horizontal" dp:StackPanelHelper.ChildSpace="5">
Plugin.CurrentSensorControl/BurnInOven.xaml.cs
@@ -1,10 +1,8 @@
using CommunityToolkit.Mvvm.ComponentModel;
using ConnectionUtil;
using HslCommunication.Profinet.Siemens;
using PLCHelper;
using Plugin.CurrentSensorControl.Entity;
using System.Drawing;
using System.Windows.Controls;
using System.Windows.Markup;
namespace Plugin.CurrentSensorControl
{
@@ -16,7 +14,7 @@
    {
        private BaseConfig config;
        private static readonly string[] datas = new string[] { "_LEDLight", "_Req", "_SetTemp", "_SaveTemp", "_TempDown", "_TempUp", "_AvgTemp" };
        private static readonly string[] datas = new string[] { "_CoolerStatus", "_LEDLight", "_Req", "_SetTemp", "_SaveTemp", "_TempDown", "_TempUp", "_AvgTemp" };
        [ObservableProperty]
        private string header;
@@ -25,6 +23,9 @@
        private string req;
        [ObservableProperty]
        private string reqStatus;
        [ObservableProperty]
        private string coolerStatus;
        [ObservableProperty]
        private string setTemp;
@@ -161,8 +162,26 @@
                        {
                            AvgTemp = val;
                        }
                        else if (data == "_CoolerStatus")
                        {
                            if (val == "1")
                            {
                                CoolerStatus = "运水";
                    }
                            else if (val == "2")
                            {
                                CoolerStatus = "吹水";
                            }
                            else if (val == "3")
                            {
                                CoolerStatus = "测压";
                            }
                            else if (val == "0")
                            {
                                CoolerStatus = "停止";
                            }
                        }
                    }
                    //;
                    //if (api.DoFctReadSingle(name, out string val, out _))
@@ -229,5 +248,13 @@
            S7Context.WriteData(api, name, short.Parse(btn.Tag.ToString()));
            //api.DoFctWriteSingle(name, btn.Tag.ToString(), out string errMsg);
        }
        private void Button_Click2(object sender, System.Windows.RoutedEventArgs e)
        {
            var btn = sender as Button;
            string name = $"Oven{ovenIndex + 1}_CoolerStatus";
            S7Context.WriteData(api, name, ushort.Parse(btn.Tag.ToString()));
            //api.DoFctWriteSingle(name, btn.Tag.ToString(), out string errMsg);
        }
    }
}
Plugin.CurrentSensorControl/BurnInOvenCollection.xaml.cs
@@ -1,5 +1,6 @@
using Plugin.CurrentSensorControl.Entity;
using System.Drawing;
using HMI.Core.Setting;
using PLCHelper;
using Plugin.CurrentSensorControl.Entity;
using System.Windows.Controls;
namespace Plugin.CurrentSensorControl
@@ -24,6 +25,7 @@
        public void InitMainGrid()
        {
            S7Context.Init(SystemSetting.Instance.PlcIp, SystemSetting.Instance.PlcPort);
            this.rowCount = config.Row;
            this.colCount = config.Column;
            ovens = new BurnInOven[this.rowCount * this.colCount];
Plugin.CurrentSensorControl/BurnInSettingModal.xaml
@@ -32,7 +32,7 @@
            <Button Style="{StaticResource ExportBtn}" x:Name="exportBtn" Click="Button_Click"/>
            <Button Style="{StaticResource ImportBtn}" x:Name="importBtn" Click="Button_Click"/>
        </StackPanel>
        <ListView Grid.Row="1" Style="{StaticResource DefaultListTable}" x:Name="table"
        <!--<ListView Grid.Row="1" Style="{StaticResource DefaultListTable}" x:Name="table"
                      ItemsSource="{Binding Datasource}"
                      VirtualizingPanel.IsContainerVirtualizable="True"
VirtualizingPanel.IsVirtualizing="True" 
@@ -155,6 +155,66 @@
                    </GridViewColumn>
                </GridView>
            </ListView.View>
        </ListView>
        </ListView>-->
        <DataGrid Grid.Row="1" Style="{StaticResource DefaultDataGrid}" dp:DataGridHelper.ShowRowNumber="True"
                  VirtualizingPanel.IsContainerVirtualizable="True"
                  VirtualizingPanel.IsVirtualizing="True"
                  VirtualizingPanel.VirtualizationMode="Recycling"
                  HorizontalScrollBarVisibility="Disabled"
                  ItemsSource="{Binding Datasource}" x:Name="table">
            <DataGrid.Columns>
                <DataGridTextColumn Header="#"
                                    Binding="{Binding Header, RelativeSource={RelativeSource AncestorType={x:Type DataGridRow}, Mode=FindAncestor}}"
                    Width="40"/>
                <DataGridTextColumn Width="*" Binding="{Binding Name}">
                    <DataGridTextColumn.Header>
                        <TextBlock Text="Name"/>
                    </DataGridTextColumn.Header>
                </DataGridTextColumn>
                <DataGridTextColumn Width="*" Binding="{Binding ConnectionType}">
                    <DataGridTextColumn.Header>
                        <TextBlock Text="ConnectionType"/>
                    </DataGridTextColumn.Header>
                </DataGridTextColumn>
                <DataGridTextColumn Width="*" Binding="{Binding Address}">
                    <DataGridTextColumn.Header>
                        <TextBlock Text="Address"/>
                    </DataGridTextColumn.Header>
                </DataGridTextColumn>
                <DataGridTextColumn Width="*" Binding="{Binding Type}">
                    <DataGridTextColumn.Header>
                        <TextBlock Text="Type"/>
                    </DataGridTextColumn.Header>
                </DataGridTextColumn>
                <DataGridTextColumn Width="70" Binding="{Binding Length}">
                    <DataGridTextColumn.Header>
                        <TextBlock Text="Length"/>
                    </DataGridTextColumn.Header>
                </DataGridTextColumn>
                <DataGridTextColumn Width="*" Binding="{Binding Description}">
                    <DataGridTextColumn.Header>
                        <TextBlock Text="Description"/>
                    </DataGridTextColumn.Header>
                </DataGridTextColumn>
                <DataGridTemplateColumn Width="110" IsReadOnly="True" CanUserResize="False">
                    <DataGridTemplateColumn.Header>
                        <TextBlock Text="{DynamicResource App.Opt}"/>
                    </DataGridTemplateColumn.Header>
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <StackPanel Orientation="Horizontal">
                                <Button x:Name="editBtn" Style="{StaticResource EditLink}"
    Click="Button_Click" Margin="0,0,10,0"
    Tag="{Binding }"/>
                                <Button x:Name="delBtn" Style="{StaticResource DeleteLink}"
    Tag="{Binding }"
    Click="Button_Click"/>
                            </StackPanel>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
</pu:WindowX>
Plugin.CurrentSensorControl/BurnInSettingModal.xaml.cs
@@ -1,9 +1,8 @@
using HMI.UI.DpUtil;
using HMI.UI.Util;
using HMI.UI.Util;
using HMI.Util;
using Microsoft.Win32;
using Panuon.WPF.UI;
using Plugin.CurrentSensorControl.Entity;
using PLCHelper.Entity;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Windows.Controls;
Plugin.CurrentSensorControl/ControlPage - ¸´ÖÆ.xaml
New file
@@ -0,0 +1,353 @@
<hb:SimpleMaskControl x:Class="Plugin.CurrentSensorControl.ControlPage_Bak"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:local="clr-namespace:Plugin.CurrentSensorControl"
             mc:Ignorable="d"
             xmlns:hb="clr-namespace:HMI.Base;assembly=HMI.Base"
xmlns:uic="clr-namespace:HMI.UI.Converter;assembly=HMI.UI"
xmlns:ui="clr-namespace:HMI.UI;assembly=HMI.UI"
xmlns:mdi="clr-namespace:HMI.UI.MDI;assembly=HMI.UI"
xmlns:pw="https://opensource.panuon.com/wpf"
xmlns:pu="https://opensource.panuon.com/wpf-ui"
xmlns:dp="clr-namespace:HMI.UI.DpUtil;assembly=HMI.UI"
                      Loaded="SimpleMaskControl_Loaded"
             d:DesignHeight="450" d:DesignWidth="800">
    <UserControl.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <pu:StyleDictionary Includes="TabControl" />
                <ResourceDictionary Source="/HMI.UI;component/Style/PanuonListView.xaml"/>
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </UserControl.Resources>
    <Border Style="{StaticResource CardBoarder}" Padding="0" Background="#FFF">
        <TabControl
pu:TabControlHelper.HeaderPanelAlignment="Stretch"
pu:TabControlHelper.ItemsBackground="{DynamicResource VerBar}"
pu:TabControlHelper.ItemsForeground="#FFFFFF"
pu:TabControlHelper.ItemsFontSize="14"
pu:TabControlHelper.ItemsHeight="30"
pu:TabControlHelper.ItemsHorizontalHeaderAlignment="Left"
pu:TabControlHelper.ItemsHoverBackground="{DynamicResource SecondPrimaryColor}"
pu:TabControlHelper.ItemsHoverForeground="#FFFFFF"
pu:TabControlHelper.ItemsPadding="20,0,20,0"
pu:TabControlHelper.ItemsRibbonLineCornerRadius="4"
pu:TabControlHelper.ItemsRibbonLineMargin="0,5,0,5"
pu:TabControlHelper.ItemsRibbonLineThickness="4"
pu:TabControlHelper.ItemsRibbonLineVisibility="Visible"
pu:TabControlHelper.ItemsSelectedBackground="#FFF"
pu:TabControlHelper.ItemsSelectedRibbonLineBrush="#FFFFFF"
pu:TabControlHelper.ItemsSelectedRibbonLineThickness="2">
            <TabControl.Template>
                <ControlTemplate TargetType="{x:Type TabControl}">
                    <Grid>
                        <Grid.RowDefinitions>
                            <RowDefinition Height="Auto"/>
                            <RowDefinition Height="*"/>
                        </Grid.RowDefinitions>
                        <Border BorderThickness="1,1,1,0" BorderBrush="#acacac" Background="{DynamicResource VerBar}" Padding="2,2,10,0">
                            <TabPanel x:Name="HeaderPanel" Grid.Row="0" Panel.ZIndex="1" IsItemsHost="True"/>
                        </Border>
                        <Border Grid.Row="1" BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="1,0,1,1" Background="{TemplateBinding Background}">
                            <ContentPresenter x:Name="PART_SelectedContentHost" ContentSource="SelectedContent"/>
                        </Border>
                    </Grid>
                </ControlTemplate>
            </TabControl.Template>
            <TabItem Header="老化调试">
                <Grid dp:GridHelper.Space="5" Background="#f3f9ff">
                    <Grid.RowDefinitions>
                        <RowDefinition Height="Auto"/>
                        <RowDefinition/>
                    </Grid.RowDefinitions>
                    <StackPanel Orientation="Horizontal" Height="30" dp:StackPanelHelper.ChildSpace="10" Margin="6,0,6,0">
                        <Button Style="{StaticResource SettingBtn}" x:Name="burnInSettingBtn" Click="Button_Click"/>
                        <pu:Switch CheckedContent="静音ON" x:Name="lightSw"
CheckedBackground="Green"
Background="{DynamicResource DangerColor}"
IsChecked="{Binding PlcMute,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"
Content="静音OFF"/>
                    </StackPanel>
                    <local:BurnInOvenCollection Grid.Row="1" Grid.Column="0" x:Name="ovenCollection"/>
                </Grid>
            </TabItem>
            <TabItem Header="电流监控">
                <Grid dp:GridHelper.Space="8">
                    <Grid.RowDefinitions>
                        <RowDefinition Height="Auto"/>
                        <RowDefinition/>
                    </Grid.RowDefinitions>
                    <DockPanel>
                        <StackPanel dp:StackPanelHelper.ChildSpace="10" DockPanel.Dock="Right" Orientation="Horizontal">
                            <Button Style="{StaticResource AddBtn}" x:Name="addBtn" Click="Button_Click"/>
                            <Button Style="{StaticResource RfhBtn}" x:Name="rfhBtn" Click="Button_Click"/>
                            <Button Style="{StaticResource ExportBtn}" x:Name="exportBtn" Click="Button_Click"/>
                            <Button Style="{StaticResource ImportBtn}" x:Name="importBtn" Click="Button_Click"/>
                            <!--<Button Style="{StaticResource DelBtn}"/>-->
                        </StackPanel>
                        <StackPanel Orientation="Horizontal" VerticalAlignment="Center" dp:StackPanelHelper.ChildSpace="10">
                            <pu:FormGroup FontSize="18" Header="电流传感器" Orientation="Horizontal">
                            </pu:FormGroup>
                            <Button Style="{StaticResource ResetBtn}"
            x:Name="connectAllBtn" Click="Button_Click" Content="全部连接" />
                            <Button Style="{StaticResource SettingBtn}" Content="全部断开" x:Name="disConnectAllBtn" Click="Button_Click"/>
                            <!--<Button Style="{StaticResource SettingBtn}" Content="设置" x:Name="settingBtn" Click="Button_Click"/>-->
                        </StackPanel>
                    </DockPanel>
                    <TabControl Grid.Row="1"
pu:TabControlHelper.HeaderPanelAlignment="Stretch"
pu:TabControlHelper.ItemsBackground="{DynamicResource VerBar}"
pu:TabControlHelper.ItemsForeground="#FFFFFF"
pu:TabControlHelper.ItemsFontSize="14"
pu:TabControlHelper.ItemsHeight="30"
pu:TabControlHelper.ItemsHorizontalHeaderAlignment="Left"
pu:TabControlHelper.ItemsHoverBackground="{DynamicResource SecondPrimaryColor}"
pu:TabControlHelper.ItemsHoverForeground="#FFFFFF"
pu:TabControlHelper.ItemsPadding="20,0,0,0"
pu:TabControlHelper.ItemsRibbonLineCornerRadius="4"
pu:TabControlHelper.ItemsRibbonLineMargin="0,5,0,5"
pu:TabControlHelper.ItemsRibbonLineThickness="4"
pu:TabControlHelper.ItemsRibbonLineVisibility="Visible"
pu:TabControlHelper.ItemsSelectedBackground="#FFF"
pu:TabControlHelper.ItemsSelectedRibbonLineBrush="#FFFFFF"
pu:TabControlHelper.ItemsSelectedRibbonLineThickness="2"
pu:TabControlHelper.ItemsWidth="100" >
                        <TabControl.Template>
                            <ControlTemplate TargetType="{x:Type TabControl}">
                                <Grid>
                                    <Grid.RowDefinitions>
                                        <RowDefinition Height="Auto"/>
                                        <RowDefinition Height="*"/>
                                    </Grid.RowDefinitions>
                                    <Border BorderThickness="1,1,1,0" BorderBrush="#acacac" Background="{DynamicResource VerBar}" Padding="2,2,10,0">
                                        <TabPanel x:Name="HeaderPanel" Grid.Row="0" Panel.ZIndex="1" IsItemsHost="True"/>
                                    </Border>
                                    <Border Grid.Row="1" BorderBrush="{TemplateBinding BorderBrush}"
                    BorderThickness="1,0,1,1" Background="{TemplateBinding Background}">
                                        <ContentPresenter x:Name="PART_SelectedContentHost" ContentSource="SelectedContent"/>
                                    </Border>
                                </Grid>
                            </ControlTemplate>
                        </TabControl.Template>
                        <TabItem Header="控件">
                            <ScrollViewer Grid.Row="1" Grid.Column="0"
              Style="{StaticResource DefaultScrollViewer}"
              VerticalScrollBarVisibility="Auto">
                                <WrapPanel Background="#FFF" x:Name="diWrap"/>
                            </ScrollViewer>
                        </TabItem>
                        <TabItem Header="列表">
                            <Grid>
                                <Grid.RowDefinitions>
                                    <RowDefinition Height="Auto"/>
                                    <RowDefinition/>
                                </Grid.RowDefinitions>
                                <DataGrid Grid.Row="1" Style="{StaticResource DefaultDataGrid}"
                                          dp:DataGridHelper.ShowRowNumber="True"
                                          x:Name="table" ItemsSource="{Binding Datasource}">
                                    <DataGrid.Columns>
                                        <DataGridTextColumn Width="60" Header="#"
                                                            Binding="{Binding Header, RelativeSource={RelativeSource AncestorType={x:Type DataGridRow}, Mode=FindAncestor}}" />
                                        <DataGridTextColumn Width="*" Binding="{Binding Name}">
                                            <DataGridTextColumn.Header>
                                                <TextBlock Text="{DynamicResource doc.name}"/>
                                            </DataGridTextColumn.Header>
                                        </DataGridTextColumn>
                                        <DataGridTextColumn Width="200" Binding="{Binding Ip}">
                                            <DataGridTextColumn.Header>
                                                <TextBlock Text="IP"/>
                                            </DataGridTextColumn.Header>
                                        </DataGridTextColumn>
                                        <DataGridTextColumn Width="120" Binding="{Binding Port}">
                                            <DataGridTextColumn.Header>
                                                <TextBlock Text="Port"/>
                                            </DataGridTextColumn.Header>
                                        </DataGridTextColumn>
                                        <DataGridTextColumn Width="120" Binding="{Binding Channel}">
                                            <DataGridTextColumn.Header>
                                                <TextBlock Text="Index"/>
                                            </DataGridTextColumn.Header>
                                        </DataGridTextColumn>
                                        <!--<GridViewColumn Width="120">
                                                <GridViewColumn.Header>
                                                    <TextBlock Text="地址"/>
                                                </GridViewColumn.Header>
                                                <GridViewColumn.CellTemplate>
                                                    <DataTemplate>
                                                        <Border Style="{StaticResource CellBorder}">
                                                            <TextBlock Style="{StaticResource ListTableTextBlock}"
Text="{Binding Address}"/>
                                                        </Border>
                                                    </DataTemplate>
                                                </GridViewColumn.CellTemplate>
                                            </GridViewColumn>-->
                                        <DataGridTemplateColumn Width="120">
                                            <DataGridTemplateColumn.Header>
                                                <TextBlock Text="{DynamicResource App.Opt}"/>
                                            </DataGridTemplateColumn.Header>
                                            <DataGridTemplateColumn.CellTemplate>
                                                <DataTemplate>
                                                    <StackPanel Orientation="Horizontal" dp:StackPanelHelper.ChildSpace="10">
                                                        <Button x:Name="editBtn" Style="{StaticResource EditLink}"
                Click="Button_Click" Tag="{Binding }"/>
                                                        <Button x:Name="delBtn" Style="{StaticResource DeleteLink}"
                Click="Button_Click" Tag="{Binding }"/>
                                                    </StackPanel>
                                                </DataTemplate>
                                            </DataGridTemplateColumn.CellTemplate>
                                        </DataGridTemplateColumn>
                                    </DataGrid.Columns>
                                </DataGrid>
                                <!--<ListView Grid.Row="1" Style="{StaticResource DefaultListTable}" x:Name="table"
                      ItemsSource="{Binding Datasource}"
                      VirtualizingPanel.IsContainerVirtualizable="True"
VirtualizingPanel.IsVirtualizing="True"
VirtualizingPanel.VirtualizationMode="Standard">
                                    <ListView.Resources>
                                        <Style x:Key="RowLink" TargetType="Button" BasedOn="{StaticResource LinkButton}">
                                            <Style.Triggers>
                                                <DataTrigger Binding="{Binding Path=IsMouseOver,
                RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=ListViewItem,AncestorLevel=1}}"
         Value="True">
                                                    <Setter Property="Foreground" Value="#FFF"/>
                                                </DataTrigger>
                                                <DataTrigger Binding="{Binding Path=IsSelected,
       RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=ListViewItem,AncestorLevel=1}}"
Value="True">
                                                    <Setter Property="Foreground" Value="#FFF"/>
                                                </DataTrigger>
                                            </Style.Triggers>
                                        </Style>
                                        <Style x:Key="DeleteLink" TargetType="Button" BasedOn="{StaticResource DangerLinkButton}">
                                            <Setter Property="Content" Value="{DynamicResource App.Delete}"/>
                                        </Style>
                                        <Style x:Key="EditLink" TargetType="Button" BasedOn="{StaticResource RowLink}">
                                            <Setter Property="Content" Value="{DynamicResource App.Edit}"/>
                                        </Style>
                                    </ListView.Resources>
                                    <ListView.View>
                                        <GridView AllowsColumnReorder="False">
                                            <GridViewColumn Width="60" Header="#">
                                                <GridViewColumn.CellTemplate>
                                                    <DataTemplate>
                                                        <TextBlock Text="{Binding Converter={StaticResource lvRowNumber},
RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=ListViewItem,AncestorLevel=1}}"/>
                                                    </DataTemplate>
                                                </GridViewColumn.CellTemplate>
                                            </GridViewColumn>
                                            <GridViewColumn Width="700">
                                                <GridViewColumn.Header>
                                                    <TextBlock Text="{DynamicResource doc.name}"/>
                                                </GridViewColumn.Header>
                                                <GridViewColumn.CellTemplate>
                                                    <DataTemplate>
                                                        <Border Style="{StaticResource CellBorder}">
                                                            <TextBlock Style="{StaticResource ListTableTextBlock}"
                                                           Text="{Binding Name}"/>
                                                        </Border>
                                                    </DataTemplate>
                                                </GridViewColumn.CellTemplate>
                                            </GridViewColumn>
                                            <GridViewColumn Width="100">
                                                <GridViewColumn.Header>
                                                    <TextBlock Text="IP"/>
                                                </GridViewColumn.Header>
                                                <GridViewColumn.CellTemplate>
                                                    <DataTemplate>
                                                        <Border Style="{StaticResource CellBorder}">
                                                            <TextBlock Style="{StaticResource ListTableTextBlock}"
   Text="{Binding Ip}"/>
                                                        </Border>
                                                    </DataTemplate>
                                                </GridViewColumn.CellTemplate>
                                            </GridViewColumn>
                                            <GridViewColumn Width="120">
                                                <GridViewColumn.Header>
                                                    <TextBlock Text="端口"/>
                                                </GridViewColumn.Header>
                                                <GridViewColumn.CellTemplate>
                                                    <DataTemplate>
                                                        <Border Style="{StaticResource CellBorder}">
                                                            <TextBlock Style="{StaticResource ListTableTextBlock}"
                                                   Text="{Binding Port}"/>
                                                        </Border>
                                                    </DataTemplate>
                                                </GridViewColumn.CellTemplate>
                                            </GridViewColumn>
                                            --><!--<GridViewColumn Width="120">
                                                <GridViewColumn.Header>
                                                    <TextBlock Text="地址"/>
                                                </GridViewColumn.Header>
                                                <GridViewColumn.CellTemplate>
                                                    <DataTemplate>
                                                        <Border Style="{StaticResource CellBorder}">
                                                            <TextBlock Style="{StaticResource ListTableTextBlock}"
Text="{Binding Address}"/>
                                                        </Border>
                                                    </DataTemplate>
                                                </GridViewColumn.CellTemplate>
                                            </GridViewColumn>--><!--
                                            <GridViewColumn Width="120">
                                                <GridViewColumn.Header>
                                                    <TextBlock Text="下标"/>
                                                </GridViewColumn.Header>
                                                <GridViewColumn.CellTemplate>
                                                    <DataTemplate>
                                                        <Border Style="{StaticResource CellBorder}">
                                                            <TextBlock Style="{StaticResource ListTableTextBlock}"
                   Text="{Binding Channel}"/>
                                                        </Border>
                                                    </DataTemplate>
                                                </GridViewColumn.CellTemplate>
                                            </GridViewColumn>
                                            <GridViewColumn Width="120">
                                                <GridViewColumn.Header>
                                                    <TextBlock Text="{DynamicResource App.Opt}"/>
                                                </GridViewColumn.Header>
                                                <GridViewColumn.CellTemplate>
                                                    <DataTemplate>
                                                        <StackPanel Orientation="Horizontal" dp:StackPanelHelper.ChildSpace="10">
                                                            <Button x:Name="editBtn" Style="{StaticResource EditLink}"
                Click="Button_Click" Tag="{Binding }"/>
                                                            <Button x:Name="delBtn" Style="{StaticResource DeleteLink}"
                Click="Button_Click" Tag="{Binding }"/>
                                                        </StackPanel>
                                                    </DataTemplate>
                                                </GridViewColumn.CellTemplate>
                                            </GridViewColumn>
                                        </GridView>
                                    </ListView.View>
                                </ListView>-->
                            </Grid>
                        </TabItem>
                    </TabControl>
                </Grid>
            </TabItem>
        </TabControl>
    </Border>
</hb:SimpleMaskControl>
Plugin.CurrentSensorControl/ControlPage - ¸´ÖÆ.xaml.cs
New file
@@ -0,0 +1,450 @@
using CommunityToolkit.Mvvm.ComponentModel;
using HMI.Base;
using HMI.Core.Util;
using HMI.UI.Util;
using HMI.Util;
using HslCommunication.Profinet.Siemens;
using log4net;
using Microsoft.Win32;
using PLCHelper;
using PLCHelper.Entity;
using Plugin.CurrentSensorControl.Entity;
using System.Collections.ObjectModel;
using System.IO;
using System.Timers;
using System.Windows;
using System.Windows.Controls;
namespace Plugin.CurrentSensorControl
{
    /// <summary>
    /// ControlPage.xaml çš„交互逻辑
    /// </summary>
    [ObservableObject]
    public partial class ControlPage_Bak : SimpleMaskControl
    {
        [ObservableProperty]
        private ObservableCollection<SensorData> datasource = new ObservableCollection<SensorData>();
        private List<SingleSensor> controls = new List<SingleSensor>();
        private System.Timers.Timer timer;
        private System.Timers.Timer opcTimer;
        public static ILog Logger { get; private set; }
        private volatile bool needRead = false;
        private SiemensS7Net api;
        private bool plcMute = false;
        public bool PlcMute
        {
            get => plcMute;
            set
            {
                try
                {
                    string name = $"PLC_Mute";
                    if (S7Context.WriteData(api, name, value))
                    {
                        plcMute = value;
                        OnPropertyChanged(nameof(PlcMute));
                    }
                }
                catch (Exception ex)
                {
                }
            }
        }
        public ControlPage_Bak()
        {
            timer = new System.Timers.Timer();
            timer.Elapsed += Timer_Elapsed;
            timer.AutoReset = false;
            timer.Interval = 1000;
            opcTimer = new System.Timers.Timer();
            opcTimer.Elapsed += OpcTimer_Elapsed; ;
            opcTimer.AutoReset = false;
            opcTimer.Interval = 1000;
            DataContext = this;
            InitializeComponent();
        }
        private void OpcTimer_Elapsed(object sender, ElapsedEventArgs e)
        {
            opcTimer.Enabled = false;
            try
            {
                if (S7Context.GetData(api, "PLC_Mute", out object val))
                {
                    plcMute = (bool)val;
                    OnPropertyChanged("PlcMute");
                }
            }
            catch (Exception ex)
            {
            }
            try
            {
                var time = DateTime.Now;
                ovenCollection.Refresh();
                S7Context.ResetFailCount();
                log.Debug($"Time Cast: {(DateTime.Now - time).TotalMilliseconds}ms");
            }
            catch (Exception ex)
            {
            }
            finally
            {
                if (needRead) opcTimer.Enabled = true;
            }
        }
        private void Timer_Elapsed(object sender, ElapsedEventArgs e)
        {
            timer.Enabled = false;
            try
            {
                foreach (var ctl in controls)
                {
                    if (!needRead) return;
                    if (ctl is SingleSensor ss)
                    {
                        ss.ReadCurrent();
                        Thread.Sleep(50);
                    }
                }
            }
            catch (Exception ex)
            {
            }
            finally
            {
                if (needRead) timer.Enabled = true;
            }
        }
        public override void InitFinish()
        {
            Logger = log;
            try
            {
                LoadBurnInSetting();
            }
            catch (Exception ex)
            {
                log.Error("LoadBurnInSetting Error.", ex);
            }
        }
        public override void Active()
        {
            if (!isLoaded) return;
            StartReadCurrent();
        }
        public override void DeActive()
        {
            StopReadCurrent();
        }
        public override void DoClose(object sender, EventArgs e)
        {
            StopReadCurrent();
            S7Context.Release();
            base.DoClose(sender, e);
        }
        public void StartReadCurrent()
        {
            needRead = true;
            timer.Enabled = true;
            opcTimer.Enabled = true;
        }
        public void StopReadCurrent()
        {
            needRead = false;
            timer.Enabled = false;
            opcTimer.Enabled = false;
        }
        private void LoadSensorData()
        {
            string path = Path.Combine(BaseFolder, "sensor.data");
            var list = new ObservableCollection<SensorData>();
            try
            {
                if (File.Exists(path))
                {
                    list = XmlHelper.DeserializeFromXml<ObservableCollection<SensorData>>(path);
                }
            }
            catch (Exception ex)
            {
                log.Error("Load Sensor Data Failed.", ex);
            }
            Datasource = list;
        }
        private void ClearSensorControl()
        {
            foreach (var ctl in diWrap.Children)
            {
                if (ctl is SingleSensor ss)
                {
                    ss.Close();
                }
            }
            diWrap.Children.Clear();
            controls.Clear();
        }
        private void RefreshSensorControl(bool start)
        {
            StopReadCurrent();
            ClearSensorControl();
            foreach (var data in Datasource)
            {
                SingleSensor ss = new SingleSensor(data.Name, data.Ip, data.Port, data.Address, data.Channel)
                {
                    Width = 240
                };
                diWrap.Children.Add(ss);
                controls.Add(ss);
                Task.Factory.StartNew(() =>
                {
                    ss.Connect();
                });
            }
            if (start) StartReadCurrent();
        }
        private void ConnectAllSensor()
        {
            foreach (var ctl in diWrap.Children)
            {
                if (ctl is SingleSensor ss)
                {
                    ss.Connect();
                }
            }
        }
        private void DisconnectAllSensor()
        {
            foreach (var ctl in diWrap.Children)
            {
                if (ctl is SingleSensor ss)
                {
                    ss.Close();
                }
            }
        }
        private bool isLoaded = false;
        private void SimpleMaskControl_Loaded(object sender, System.Windows.RoutedEventArgs e)
        {
            ShowMask(() =>
            {
                api = S7Context.Get($"1");
                Dispatcher.Invoke(() =>
                {
                    LoadSensorData();
                    RefreshSensorControl(needRead);
                    //LoadBurnInSetting();
                    StartReadCurrent();
                    isLoaded = true;
                    Loaded -= SimpleMaskControl_Loaded;
                });
            }, (ex) =>
            {
                ToastHelper.Error("Loaded Failed.");
                log.Error("Load Error.", ex);
            }, null, "请稍后");
        }
        private void OpenDataModal(SensorData data)
        {
            DataModal modal = new DataModal()
            {
                Title = "新增",
                Owner = Window.GetWindow(this)
            };
            if (modal.Open(data, Datasource) == true)
            {
                string path = Path.Combine(BaseFolder, "sensor.data");
                try
                {
                    XmlHelper.SerializeToXml(path, Datasource);
                    LoadSensorData();
                    RefreshSensorControl(needRead);
                }
                catch (Exception ex)
                {
                    ToastHelper.Error("保存失败");
                    log.Error("Save Sensor Data Failed.", ex);
                }
            }
        }
        private void DoExport()
        {
            try
            {
                SaveFileDialog sfd = new SaveFileDialog();
                sfd.Filter = "Excel æ–‡ä»¶ (*.xls)|*.xls";
                if (sfd.ShowDialog() == true)
                {
                    ExcelHelper.ExportExcel(sfd.FileName, Datasource);
                }
                ToastHelper.Success(this.lang("App.ExportSuccess"));
            }
            catch (Exception ex)
            {
                log.Error("Export Failed.", ex);
                ToastHelper.Error(this.lang("App.ExportFailed"));
            }
        }
        private void DoImport()
        {
            try
            {
                OpenFileDialog ofd = new OpenFileDialog();
                ofd.Filter = "Excel æ–‡ä»¶ (*.xls)|*.xls";
                if (ofd.ShowDialog() == true)
                {
                    var datas = ExcelHelper.ReadFromExcel<SensorData>(ofd.FileName);
                    string path = Path.Combine(BaseFolder, "sensor.data");
                    XmlHelper.SerializeToXml(path, datas);
                    DoRefresh();
                    ToastHelper.Success(this.lang("App.ExportSuccess"));
                }
            }
            catch (Exception ex)
            {
                log.Error("Export Failed.", ex);
                ToastHelper.Error(this.lang("App.ExportFailed"));
            }
        }
        private void SaveDatasouce(object datasource)
        {
            string path = Path.Combine(BaseFolder, "sensor.data");
            XmlHelper.SerializeToXml(path, datasource);
        }
        private void DoRefresh()
        {
            ShowMask(() =>
            {
                Dispatcher.BeginInvoke(new Action(() =>
                {
                    LoadSensorData();
                    RefreshSensorControl(needRead);
                }));
            }, (ex) =>
            {
                log.Error("Refresh Sensor Data Failed.", ex);
            }, "请稍后", "正在加载...");
        }
        private void DoDelete(SensorData data)
        {
            if (MsgBoxHelper2.WarnChoose("确定要删除吗?") == MessageBoxResult.OK)
            {
                var index = Datasource.IndexOf(data);
                if (index >= 0)
                {
                    Datasource.RemoveAt(index);
                    SaveDatasouce(Datasource);
                    DoRefresh();
                }
            }
        }
        private void Button_Click(object sender, System.Windows.RoutedEventArgs e)
        {
            var btn = sender as Button;
            var tag = btn?.Tag;
            switch (btn?.Name)
            {
                case "addBtn":
                    OpenDataModal(new SensorData());
                    break;
                case "rfhBtn":
                    DoRefresh();
                    break;
                case "editBtn":
                    OpenDataModal((SensorData)tag);
                    break;
                case "delBtn":
                    DoDelete((SensorData)tag);
                    break;
                case "connectAllBtn":
                    ConnectAllSensor();
                    break;
                case "disConnectAllBtn":
                    DisconnectAllSensor();
                    break;
                case "exportBtn":
                    DoExport();
                    break;
                case "importBtn":
                    DoImport();
                    break;
                case "burnInSettingBtn":
                    OpenBurnSettingModal();
                    break;
                default:
                    break;
            }
        }
        [ObservableProperty]
        private ObservableCollection<PLCTagData> burnInSettingData;
        private void LoadBurnInSetting()
        {
            S7Context.LoadTagData();
            BurnInSettingData = S7Context.Datasource;
        }
        private void LoadBurnInSettingCache()
        {
            S7Context.LoadTagData();
        }
        private void OpenBurnSettingModal()
        {
            BurnInSettingModal modal = new BurnInSettingModal
            {
                Owner = Window.GetWindow(this)
            };
            if (modal.Open(BurnInSettingData) == true)
            {
                var datas = modal.Datasource;
                try
                {
                    string path = Path.Combine(BaseFolder, "BurnInSettingData.data");
                    XmlHelper.SerializeToXml(path, datas);
                    BurnInSettingData = datas;
                    LoadBurnInSettingCache();
                }
                catch (Exception ex)
                {
                }
            }
        }
    }
}
Plugin.CurrentSensorControl/ControlPage.xaml
@@ -24,42 +24,6 @@
    </UserControl.Resources>
    <Border Style="{StaticResource CardBoarder}" Padding="0" Background="#FFF">
        <TabControl
pu:TabControlHelper.HeaderPanelAlignment="Stretch"
pu:TabControlHelper.ItemsBackground="{DynamicResource VerBar}"
pu:TabControlHelper.ItemsForeground="#FFFFFF"
pu:TabControlHelper.ItemsFontSize="14"
pu:TabControlHelper.ItemsHeight="30"
pu:TabControlHelper.ItemsHorizontalHeaderAlignment="Left"
pu:TabControlHelper.ItemsHoverBackground="{DynamicResource SecondPrimaryColor}"
pu:TabControlHelper.ItemsHoverForeground="#FFFFFF"
pu:TabControlHelper.ItemsPadding="20,0,20,0"
pu:TabControlHelper.ItemsRibbonLineCornerRadius="4"
pu:TabControlHelper.ItemsRibbonLineMargin="0,5,0,5"
pu:TabControlHelper.ItemsRibbonLineThickness="4"
pu:TabControlHelper.ItemsRibbonLineVisibility="Visible"
pu:TabControlHelper.ItemsSelectedBackground="#FFF"
pu:TabControlHelper.ItemsSelectedRibbonLineBrush="#FFFFFF"
pu:TabControlHelper.ItemsSelectedRibbonLineThickness="2">
            <TabControl.Template>
                <ControlTemplate TargetType="{x:Type TabControl}">
                    <Grid>
                        <Grid.RowDefinitions>
                            <RowDefinition Height="Auto"/>
                            <RowDefinition Height="*"/>
                        </Grid.RowDefinitions>
                        <Border BorderThickness="1,1,1,0" BorderBrush="#acacac" Background="{DynamicResource VerBar}" Padding="2,2,10,0">
                            <TabPanel x:Name="HeaderPanel" Grid.Row="0" Panel.ZIndex="1" IsItemsHost="True"/>
                        </Border>
                        <Border Grid.Row="1" BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="1,0,1,1" Background="{TemplateBinding Background}">
                            <ContentPresenter x:Name="PART_SelectedContentHost" ContentSource="SelectedContent"/>
                        </Border>
                    </Grid>
                </ControlTemplate>
            </TabControl.Template>
            <TabItem Header="老化调试">
                <Grid dp:GridHelper.Space="5" Background="#f3f9ff">
                    <Grid.RowDefinitions>
                        <RowDefinition Height="Auto"/>
@@ -70,221 +34,13 @@
                        <pu:Switch CheckedContent="静音ON" x:Name="lightSw" 
CheckedBackground="Green"
Background="{StaticResource DangerColor}"
Background="{DynamicResource DangerColor}"
IsChecked="{Binding PlcMute,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" 
Content="静音OFF"/>
                    </StackPanel>
                    <local:BurnInOvenCollection Grid.Row="1" Grid.Column="0" x:Name="ovenCollection"/>
                </Grid>
            </TabItem>
            <TabItem Header="电流监控">
                <Grid dp:GridHelper.Space="8">
                    <Grid.RowDefinitions>
                        <RowDefinition Height="Auto"/>
                        <RowDefinition/>
                    </Grid.RowDefinitions>
                    <DockPanel>
                        <StackPanel dp:StackPanelHelper.ChildSpace="10" DockPanel.Dock="Right" Orientation="Horizontal">
                            <Button Style="{StaticResource AddBtn}" x:Name="addBtn" Click="Button_Click"/>
                            <Button Style="{StaticResource RfhBtn}" x:Name="rfhBtn" Click="Button_Click"/>
                            <Button Style="{StaticResource ExportBtn}" x:Name="exportBtn" Click="Button_Click"/>
                            <Button Style="{StaticResource ImportBtn}" x:Name="importBtn" Click="Button_Click"/>
                            <!--<Button Style="{StaticResource DelBtn}"/>-->
                        </StackPanel>
                        <StackPanel Orientation="Horizontal" VerticalAlignment="Center" dp:StackPanelHelper.ChildSpace="10">
                            <pu:FormGroup FontSize="18" Header="电流传感器" Orientation="Horizontal">
                            </pu:FormGroup>
                            <Button Style="{StaticResource ResetBtn}"
            x:Name="connectAllBtn" Click="Button_Click" Content="全部连接" />
                            <Button Style="{StaticResource SettingBtn}" Content="全部断开" x:Name="disConnectAllBtn" Click="Button_Click"/>
                            <!--<Button Style="{StaticResource SettingBtn}" Content="设置" x:Name="settingBtn" Click="Button_Click"/>-->
                        </StackPanel>
                    </DockPanel>
                    <TabControl Grid.Row="1"
pu:TabControlHelper.HeaderPanelAlignment="Stretch"
pu:TabControlHelper.ItemsBackground="{DynamicResource VerBar}"
pu:TabControlHelper.ItemsForeground="#FFFFFF"
pu:TabControlHelper.ItemsFontSize="14"
pu:TabControlHelper.ItemsHeight="30"
pu:TabControlHelper.ItemsHorizontalHeaderAlignment="Left"
pu:TabControlHelper.ItemsHoverBackground="{DynamicResource SecondPrimaryColor}"
pu:TabControlHelper.ItemsHoverForeground="#FFFFFF"
pu:TabControlHelper.ItemsPadding="20,0,0,0"
pu:TabControlHelper.ItemsRibbonLineCornerRadius="4"
pu:TabControlHelper.ItemsRibbonLineMargin="0,5,0,5"
pu:TabControlHelper.ItemsRibbonLineThickness="4"
pu:TabControlHelper.ItemsRibbonLineVisibility="Visible"
pu:TabControlHelper.ItemsSelectedBackground="#FFF"
pu:TabControlHelper.ItemsSelectedRibbonLineBrush="#FFFFFF"
pu:TabControlHelper.ItemsSelectedRibbonLineThickness="2"
pu:TabControlHelper.ItemsWidth="100" >
                        <TabControl.Template>
                            <ControlTemplate TargetType="{x:Type TabControl}">
                                <Grid>
                                    <Grid.RowDefinitions>
                                        <RowDefinition Height="Auto"/>
                                        <RowDefinition Height="*"/>
                                    </Grid.RowDefinitions>
                                    <Border BorderThickness="1,1,1,0" BorderBrush="#acacac" Background="{DynamicResource VerBar}" Padding="2,2,10,0">
                                        <TabPanel x:Name="HeaderPanel" Grid.Row="0" Panel.ZIndex="1" IsItemsHost="True"/>
                                    </Border>
                                    <Border Grid.Row="1" BorderBrush="{TemplateBinding BorderBrush}"
                    BorderThickness="1,0,1,1" Background="{TemplateBinding Background}">
                                        <ContentPresenter x:Name="PART_SelectedContentHost" ContentSource="SelectedContent"/>
                                    </Border>
                                </Grid>
                            </ControlTemplate>
                        </TabControl.Template>
                        <TabItem Header="控件">
                            <ScrollViewer Grid.Row="1" Grid.Column="0"
              Style="{StaticResource DefaultScrollViewer}"
              VerticalScrollBarVisibility="Auto">
                                <WrapPanel Background="#FFF" x:Name="diWrap"/>
                            </ScrollViewer>
                        </TabItem>
                        <TabItem Header="列表">
                            <Grid>
                                <Grid.RowDefinitions>
                                    <RowDefinition Height="Auto"/>
                                    <RowDefinition/>
                                </Grid.RowDefinitions>
                                <ListView Grid.Row="1" Style="{StaticResource DefaultListTable}" x:Name="table"
                      ItemsSource="{Binding Datasource}"
                      VirtualizingPanel.IsContainerVirtualizable="True"
VirtualizingPanel.IsVirtualizing="True"
VirtualizingPanel.VirtualizationMode="Standard">
                                    <ListView.Resources>
                                        <Style x:Key="RowLink" TargetType="Button" BasedOn="{StaticResource LinkButton}">
                                            <Style.Triggers>
                                                <DataTrigger Binding="{Binding Path=IsMouseOver,
                RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=ListViewItem,AncestorLevel=1}}"
         Value="True">
                                                    <Setter Property="Foreground" Value="#FFF"/>
                                                </DataTrigger>
                                                <DataTrigger Binding="{Binding Path=IsSelected,
       RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=ListViewItem,AncestorLevel=1}}"
Value="True">
                                                    <Setter Property="Foreground" Value="#FFF"/>
                                                </DataTrigger>
                                            </Style.Triggers>
                                        </Style>
                                        <Style x:Key="DeleteLink" TargetType="Button" BasedOn="{StaticResource DangerLinkButton}">
                                            <Setter Property="Content" Value="{DynamicResource App.Delete}"/>
                                        </Style>
                                        <Style x:Key="EditLink" TargetType="Button" BasedOn="{StaticResource RowLink}">
                                            <Setter Property="Content" Value="{DynamicResource App.Edit}"/>
                                        </Style>
                                    </ListView.Resources>
                                    <ListView.View>
                                        <GridView AllowsColumnReorder="False">
                                            <GridViewColumn Width="60" Header="#">
                                                <GridViewColumn.CellTemplate>
                                                    <DataTemplate>
                                                        <TextBlock Text="{Binding Converter={StaticResource lvRowNumber},
RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=ListViewItem,AncestorLevel=1}}"/>
                                                    </DataTemplate>
                                                </GridViewColumn.CellTemplate>
                                            </GridViewColumn>
                                            <GridViewColumn Width="700">
                                                <GridViewColumn.Header>
                                                    <TextBlock Text="{DynamicResource doc.name}"/>
                                                </GridViewColumn.Header>
                                                <GridViewColumn.CellTemplate>
                                                    <DataTemplate>
                                                        <Border Style="{StaticResource CellBorder}">
                                                            <TextBlock Style="{StaticResource ListTableTextBlock}"
                                                           Text="{Binding Name}"/>
                                                        </Border>
                                                    </DataTemplate>
                                                </GridViewColumn.CellTemplate>
                                            </GridViewColumn>
                                            <GridViewColumn Width="100">
                                                <GridViewColumn.Header>
                                                    <TextBlock Text="IP"/>
                                                </GridViewColumn.Header>
                                                <GridViewColumn.CellTemplate>
                                                    <DataTemplate>
                                                        <Border Style="{StaticResource CellBorder}">
                                                            <TextBlock Style="{StaticResource ListTableTextBlock}"
   Text="{Binding Ip}"/>
                                                        </Border>
                                                    </DataTemplate>
                                                </GridViewColumn.CellTemplate>
                                            </GridViewColumn>
                                            <GridViewColumn Width="120">
                                                <GridViewColumn.Header>
                                                    <TextBlock Text="端口"/>
                                                </GridViewColumn.Header>
                                                <GridViewColumn.CellTemplate>
                                                    <DataTemplate>
                                                        <Border Style="{StaticResource CellBorder}">
                                                            <TextBlock Style="{StaticResource ListTableTextBlock}"
                                                   Text="{Binding Port}"/>
                                                        </Border>
                                                    </DataTemplate>
                                                </GridViewColumn.CellTemplate>
                                            </GridViewColumn>
                                            <GridViewColumn Width="120">
                                                <GridViewColumn.Header>
                                                    <TextBlock Text="地址"/>
                                                </GridViewColumn.Header>
                                                <GridViewColumn.CellTemplate>
                                                    <DataTemplate>
                                                        <Border Style="{StaticResource CellBorder}">
                                                            <TextBlock Style="{StaticResource ListTableTextBlock}"
Text="{Binding Address}"/>
                                                        </Border>
                                                    </DataTemplate>
                                                </GridViewColumn.CellTemplate>
                                            </GridViewColumn>
                                            <GridViewColumn Width="120">
                                                <GridViewColumn.Header>
                                                    <TextBlock Text="通道"/>
                                                </GridViewColumn.Header>
                                                <GridViewColumn.CellTemplate>
                                                    <DataTemplate>
                                                        <Border Style="{StaticResource CellBorder}">
                                                            <TextBlock Style="{StaticResource ListTableTextBlock}"
                   Text="{Binding Channel}"/>
                                                        </Border>
                                                    </DataTemplate>
                                                </GridViewColumn.CellTemplate>
                                            </GridViewColumn>
                                            <GridViewColumn Width="120">
                                                <GridViewColumn.Header>
                                                    <TextBlock Text="{DynamicResource App.Opt}"/>
                                                </GridViewColumn.Header>
                                                <GridViewColumn.CellTemplate>
                                                    <DataTemplate>
                                                        <StackPanel Orientation="Horizontal" dp:StackPanelHelper.ChildSpace="10">
                                                            <Button x:Name="editBtn" Style="{StaticResource EditLink}"
                Click="Button_Click" Tag="{Binding }"/>
                                                            <Button x:Name="delBtn" Style="{StaticResource DeleteLink}"
                Click="Button_Click" Tag="{Binding }"/>
                                                        </StackPanel>
                                                    </DataTemplate>
                                                </GridViewColumn.CellTemplate>
                                            </GridViewColumn>
                                        </GridView>
                                    </ListView.View>
                                </ListView>
                            </Grid>
                        </TabItem>
                    </TabControl>
                </Grid>
            </TabItem>
        </TabControl>
    </Border>
</hb:SimpleMaskControl>
Plugin.CurrentSensorControl/ControlPage.xaml.cs
@@ -1,20 +1,19 @@
using CommunityToolkit.Mvvm.ComponentModel;
using ConnectionUtil;
using HMI.Base;
using HMI.Core.Setting;
using HMI.Core.Util;
using HMI.UI.Util;
using HMI.Util;
using HslCommunication.Profinet.Siemens;
using log4net;
using Microsoft.Win32;
using PLCHelper;
using PLCHelper.Entity;
using Plugin.CurrentSensorControl.Entity;
using System.Collections.ObjectModel;
using System.IO;
using System.Timers;
using System.Windows;
using System.Windows.Controls;
using System.Xml.Linq;
namespace Plugin.CurrentSensorControl
{
@@ -70,9 +69,6 @@
            opcTimer.AutoReset = false;
            opcTimer.Interval = 1000;
            S7Context.Init(SystemSetting.Instance.PlcIp, SystemSetting.Instance.PlcPort);
            api = S7Context.Get($"1");
            DataContext = this;
            InitializeComponent();
        }
@@ -80,12 +76,26 @@
        private void OpcTimer_Elapsed(object sender, ElapsedEventArgs e)
        {
            opcTimer.Enabled = false;
            try
            {
                if (S7Context.GetData(api, "PLC_Mute", out object val))
                {
                    plcMute = (bool)val;
                    OnPropertyChanged("PlcMute");
                }
            }
            catch (Exception ex)
            {
            }
            try
            {
                var time = DateTime.Now;
                ovenCollection.Refresh();
                S7Context.ResetFailCount();
                log.Debug($"Time Cast: {(DateTime.Now - time).TotalMilliseconds}ms");
            }
            catch (Exception ex)
            {
@@ -99,18 +109,6 @@
        private void Timer_Elapsed(object sender, ElapsedEventArgs e)
        {
            timer.Enabled = false;
            try
            {
                if (S7Context.GetData(api, "PLC_Mute", out object val))
                {
                    plcMute = (bool)val;
                    OnPropertyChanged("PlcMute");
                }
            }
            catch (Exception ex)
            {
            }
            try
            {
@@ -137,10 +135,19 @@
        public override void InitFinish()
        {
            Logger = log;
            try
            {
                LoadBurnInSetting();
            }
            catch (Exception ex)
            {
                log.Error("LoadBurnInSetting Error.", ex);
            }
        }
        public override void Active()
        {
            if (!isLoaded) return;
            StartReadCurrent();
        }
@@ -152,6 +159,7 @@
        public override void DoClose(object sender, EventArgs e)
        {
            StopReadCurrent();
            S7Context.Release();
            base.DoClose(sender, e);
        }
@@ -189,65 +197,79 @@
        private void ClearSensorControl()
        {
            foreach (var ctl in diWrap.Children)
            {
                if (ctl is SingleSensor ss)
                {
                    ss.Close();
                }
            }
            diWrap.Children.Clear();
            controls.Clear();
            //foreach (var ctl in diWrap.Children)
            //{
            //    if (ctl is SingleSensor ss)
            //    {
            //        ss.Close();
            //    }
            //}
            //diWrap.Children.Clear();
            //controls.Clear();
        }
        private void RefreshSensorControl(bool start)
        {
            StopReadCurrent();
            ClearSensorControl();
            foreach (var data in Datasource)
            {
                SingleSensor ss = new SingleSensor(data.Name, data.Ip, data.Port, data.Address, data.Channel)
                {
                    Width = 240
                };
                diWrap.Children.Add(ss);
                controls.Add(ss);
                Task.Factory.StartNew(() =>
                {
                    ss.Connect();
                });
            }
            if (start) StartReadCurrent();
            //StopReadCurrent();
            //ClearSensorControl();
            //foreach (var data in Datasource)
            //{
            //    SingleSensor ss = new SingleSensor(data.Name, data.Ip, data.Port, data.Address, data.Channel)
            //    {
            //        Width = 240
            //    };
            //    diWrap.Children.Add(ss);
            //    controls.Add(ss);
            //    Task.Factory.StartNew(() =>
            //    {
            //        ss.Connect();
            //    });
            //}
            //if (start) StartReadCurrent();
        }
        private void ConnectAllSensor()
        {
            foreach (var ctl in diWrap.Children)
            {
                if (ctl is SingleSensor ss)
                {
                    ss.Connect();
                }
            }
            //foreach (var ctl in diWrap.Children)
            //{
            //    if (ctl is SingleSensor ss)
            //    {
            //        ss.Connect();
            //    }
            //}
        }
        private void DisconnectAllSensor()
        {
            foreach (var ctl in diWrap.Children)
            {
                if (ctl is SingleSensor ss)
                {
                    ss.Close();
                }
            }
            //foreach (var ctl in diWrap.Children)
            //{
            //    if (ctl is SingleSensor ss)
            //    {
            //        ss.Close();
            //    }
            //}
        }
        private bool isLoaded = false;
        private void SimpleMaskControl_Loaded(object sender, System.Windows.RoutedEventArgs e)
        {
            ShowMask(() =>
            {
                api = S7Context.Get($"1");
                Dispatcher.Invoke(() =>
        {
            LoadSensorData();
            RefreshSensorControl(needRead);
            LoadBurnInSetting();
                    //LoadBurnInSetting();
                    StartReadCurrent();
                    isLoaded = true;
            Loaded -= SimpleMaskControl_Loaded;
                });
            }, (ex) =>
            {
                ToastHelper.Error("Loaded Failed.");
                log.Error("Load Error.", ex);
            }, null, "请稍后");
        }
        private void OpenDataModal(SensorData data)
@@ -393,34 +415,13 @@
        private void LoadBurnInSetting()
        {
            S7Context.dataCache.Clear();
            ObservableCollection<PLCTagData> datas;
            try
            {
                string path = Path.Combine(BaseFolder, "BurnInSettingData.data");
                if (File.Exists(path))
                {
                    datas = XmlHelper.DeserializeFromXml<ObservableCollection<PLCTagData>>(path);
                }
                else
                {
                    datas = new ObservableCollection<PLCTagData>();
                }
            }
            catch (Exception ex)
            {
                datas = new ObservableCollection<PLCTagData>();
            }
            BurnInSettingData = datas;
            LoadBurnInSettingCache();
            S7Context.LoadTagData();
            BurnInSettingData = S7Context.Datasource;
        }
        private void LoadBurnInSettingCache()
        {
            foreach (var data in BurnInSettingData)
            {
                S7Context.dataCache[data.Name] = data;
            }
            S7Context.LoadTagData();
        }
        private void OpenBurnSettingModal()
Plugin.CurrentSensorControl/DataModal.xaml
@@ -41,14 +41,14 @@
                <pu:NumberInput x:Name="NiPort" Style="{StaticResource FormNumberInput}" />
            </pu:FormGroup>
            <pu:FormGroup x:Name="FgAddress" Header="Address"
            <!--<pu:FormGroup x:Name="FgAddress" Header="Address"
                        Style="{StaticResource InputFormGroupStyle}"
dp:FormGroupHelper.IsRequired="True"
GroupName="MyFormGroup">
                <pu:NumberInput x:Name="NiAddress" Style="{StaticResource FormNumberInput}" />
            </pu:FormGroup>
            </pu:FormGroup>-->
            <pu:FormGroup x:Name="FgChannel" Header="Channel"
            <pu:FormGroup x:Name="FgChannel" Header="Index"
                        Style="{StaticResource InputFormGroupStyle}"
dp:FormGroupHelper.IsRequired="True"
GroupName="MyFormGroup">
Plugin.CurrentSensorControl/DataModal.xaml.cs
@@ -94,7 +94,7 @@
                data.Name = TbName.Text;
                data.Ip = TbIP.Text;
                data.Port = ((int?)NiPort.Value) ?? 0;
                data.Address = ((int?)NiAddress.Value) ?? 0;
                //data.Address = ((int?)NiAddress.Value) ?? 0;
                data.Channel = ((int?)NiChannel.Value) ?? 0;
            }
            return flag;
@@ -120,7 +120,7 @@
            TbName.Text = data.Name;
            TbIP.Text = data.Ip;
            NiPort.Value = data.Port;
            NiAddress.Value = data.Address;
            //NiAddress.Value = data.Address;
            NiChannel.Value = data.Channel;
            return this.ShowDialog();
        }
Plugin.CurrentSensorControl/Entity/BaseConfig.cs
@@ -1,4 +1,6 @@
using System.Collections;
using HMI.Core.Entity;
using HMI.Core.Manager;
using System.Collections;
using System.Configuration;
using System.Runtime.CompilerServices;
@@ -10,14 +12,68 @@
        public static readonly BaseConfig Instance = new BaseConfig();
        private BaseConfig() {
        private BaseConfig()
        {
            RefreshNumberConfig(this);
        }
        private void RefreshNumberConfig(BaseConfig config)
        {
            ParameterData value = null;
            try
            {
                value = ParameterManager.GetCommonParameterByName("BurnInOvenCount");
                string[] datas = value.Value.Trim().Split(',');
                config.Row = int.Parse(datas[0]);
                config.Column = int.Parse(datas[1]);
            }
            catch (Exception ex)
            {
            
        }
            try
            {
                value = ParameterManager.GetCommonParameterByName("BurnInOvenName");
                config.NameStr = value.Value;
            }
            catch (Exception ex)
            {
            }
            try
            {
                value = ParameterManager.GetCommonParameterByName("BurnInOvenPort");
                config.PortStart = int.Parse(value.Value);
            }
            catch (Exception ex)
            {
            }
            try
            {
                value = ParameterManager.GetCommonParameterByName("BurnInCellCount");
                string[] datas = value.Value.Trim().Split(',');
                config.PositionColumn = int.Parse(datas[0]);
                config.PositionCount = int.Parse(datas[1]);
            }
            catch (Exception ex)
            {
            }
        }
        private string GetValue([CallerMemberName] string propertyName = null)
        {
            return (customConfig != null && customConfig.ContainsKey(propertyName)) ? customConfig[propertyName].ToString() : null;
        }
        private int row = 1;
        /// <summary>
        /// é¦–页布局行数
        /// </summary>
        private int row = 1;
        public int Row
        {
            get
@@ -25,11 +81,10 @@
                var data = GetValue();
                return data == null ? row : int.Parse(data);
            }
        }
        private string GetValue([CallerMemberName] string propertyName = null)
            set
        {
            return (customConfig != null && customConfig.ContainsKey(propertyName)) ? customConfig[propertyName].ToString() : null;
                customConfig[nameof(Row)] = value;
            }
        }
        /// <summary>
@@ -42,6 +97,10 @@
            {
                var data = GetValue();
                return data == null ? column : int.Parse(data);
            }
            set
            {
                customConfig[nameof(Column)] = value;
            }
        }
@@ -56,6 +115,10 @@
                var data = GetValue();
                return data == null ? cellCount : int.Parse(data);
            }
            set
            {
                customConfig[nameof(CellCount)] = value;
            }
        }
        /// <summary>
@@ -68,6 +131,10 @@
            {
                var data = GetValue();
                return data == null ? positionColumn : int.Parse(data);
            }
            set
            {
                customConfig[nameof(PositionColumn)] = value;
            }
        }
@@ -82,6 +149,10 @@
                var data = GetValue();
                return data == null ? positionCount : int.Parse(data);
            }
            set
            {
                customConfig[nameof(PositionCount)] = value;
            }
        }
        /// <summary>
@@ -94,6 +165,10 @@
            {
                var data = GetValue();
                return data == null ? maxSize : int.Parse(data);
            }
            set
            {
                customConfig[nameof(MaxSize)] = value;
            }
        }
@@ -108,6 +183,10 @@
                var data = GetValue();
                return data == null ? refreshInterval : int.Parse(data);
            }
            set
            {
                customConfig[nameof(RefreshInterval)] = value;
            }
        }
        /// <summary>
@@ -121,31 +200,9 @@
                var data = GetValue();
                return data == null ? nameStr : data;
            }
        }
        /// <summary>
        /// é»˜è®¤å±•示的图表标题
        /// </summary>
        private string mainChartTitle = "平均温度";
        public string MainChartTitle
            set
        {
            get
            {
                var data = GetValue();
                return data == null ? mainChartTitle : data;
            }
        }
        /// <summary>
        /// åŒå‡»æ‰“开的详细图表标题
        /// </summary>
        private string detailChartTitle = "详细温度";
        public string DetailChartTitle
        {
            get
            {
                var data = GetValue();
                return data == null ? detailChartTitle : data;
                customConfig[nameof(NameStr)] = value;
            }
        }
@@ -160,6 +217,10 @@
                var data = GetValue();
                return data == null ? cellListMaxSize : int.Parse(data);
            }
            set
            {
                customConfig[nameof(CellListMaxSize)] = value;
            }
        }
        private int portStart = 6660;
@@ -170,6 +231,10 @@
                var data = GetValue();
                return data == null ? portStart : int.Parse(data);
            }
            set
            {
                customConfig[nameof(PortStart)] = value;
            }
        }
        private string codeParserType;
Plugin.CurrentSensorControl/Entity/S7Context.cs
File was deleted
Plugin.CurrentSensorControl/Plugin.CurrentSensorControl.csproj
@@ -21,6 +21,7 @@
    <ProjectReference Include="..\HMI.Core\HMI.Core.csproj" />
    <ProjectReference Include="..\HMI.UI\HMI.UI.csproj" />
    <ProjectReference Include="..\OPCClient\OPCClient.csproj" />
    <ProjectReference Include="..\PLCHelper\PLCHelper.csproj" />
  </ItemGroup>
  <ItemGroup>
@@ -39,6 +40,9 @@
    <Compile Update="BurnInCell.xaml.cs">
      <SubType>Code</SubType>
    </Compile>
    <Compile Update="ControlPage - å¤åˆ¶.xaml.cs">
      <SubType>Code</SubType>
    </Compile>
  </ItemGroup>
</Project>
Plugin.CurrentSensorControl/SingleSensor.xaml.cs
@@ -12,8 +12,8 @@
    [ObservableObject]
    public partial class SingleSensor : UserControl
    {
        private static Dictionary<string, ModbusRtuOverTcp> clients = new Dictionary<string, ModbusRtuOverTcp>();
        private static Dictionary<ModbusRtuOverTcp, bool> status = new Dictionary<ModbusRtuOverTcp, bool>();
        private static Dictionary<string, ModbusTcpNet> clients = new Dictionary<string, ModbusTcpNet>();
        private static Dictionary<ModbusTcpNet, bool> status = new Dictionary<ModbusTcpNet, bool>();
        [ObservableProperty]
        private string sensorName;
@@ -47,7 +47,7 @@
        [ObservableProperty]
        private int channel;
        private ModbusRtuOverTcp client;
        private ModbusTcpNet client;
        public SingleSensor()
@@ -63,10 +63,10 @@
            Port = port;
            Address = address;
            Channel = channel;
            string key = $"{Ip}:{Port}:{Address}";
            string key = $"{Ip}:{Port}";
            if (!clients.ContainsKey(key))
            {
                client = new ModbusRtuOverTcp(Ip, Port, (byte)Address);
                client = new ModbusTcpNet(Ip, Port);
                clients[key] = client;
            }
            else
@@ -134,16 +134,16 @@
            var sb = status[client];
            if (IsConnected)
            {
                OperateResult<double[]> res;
                OperateResult<ushort> res;
                lock (client)
                {
                    res = client.ReadDouble(channel.ToString(), 1);
                    res = client.ReadUInt16(channel.ToString());
                }
                Dispatcher.Invoke(() =>
                {
                    if (res.IsSuccess)
                    {
                        Current = res.Content[0].ToString();
                        Current = (res.Content / 1000d).ToString();
                        ErrMsg = string.Empty;
                    }
                    else
Plugin.DOControl/DOControl.xaml
@@ -11,7 +11,7 @@
             xmlns:pu="https://opensource.panuon.com/wpf-ui"
             xmlns:dp="clr-namespace:HMI.UI.DpUtil;assembly=HMI.UI"
             Loaded="UserControl_Loaded"
             Background="{StaticResource WorkspaceBackground}"
             Background="{DynamicResource WorkspaceBackground}"
             d:DesignHeight="450" d:DesignWidth="800">
    <UserControl.Resources>
        <ResourceDictionary>
@@ -20,8 +20,8 @@
            </ResourceDictionary.MergedDictionaries>
            <Style TargetType="GroupBox" BasedOn="{StaticResource {x:Static pu:StyleKeys.GroupBoxStyle}}">
                <Setter Property="pu:GroupBoxHelper.HeaderBackground" Value="{StaticResource ReHoriBar}"/>
                <Setter Property="pu:GroupBoxHelper.HeaderForeground" Value="{StaticResource PrimaryColorContract}"/>
                <Setter Property="pu:GroupBoxHelper.HeaderBackground" Value="{DynamicResource ReHoriBar}"/>
                <Setter Property="pu:GroupBoxHelper.HeaderForeground" Value="{DynamicResource PrimaryColorContract}"/>
                <Setter Property="pu:GroupBoxHelper.HeaderFontWeight" Value="Bold"/>
            </Style>
        </ResourceDictionary>        
@@ -67,7 +67,7 @@
                                        <Setter Property="Cursor" Value="Hand"/>
                                        <Setter Property="FontWeight" Value="Bold"/>
                                        <Setter Property="Background" Value="{StaticResource PrimaryColor}"/>
                                        <Setter Property="Background" Value="{DynamicResource PrimaryColor}"/>
                                        <Setter Property="Template">
                                            <Setter.Value>
                                                <ControlTemplate TargetType="ListBoxItem">
@@ -81,13 +81,13 @@
                                                    <ControlTemplate.Triggers>
                                                        <Trigger Property="IsSelected" Value="True">
                                                            <Setter Property="Background" TargetName="border"
                                                        Value="{StaticResource ReHoriBar}"/>
                                                        Value="{DynamicResource ReHoriBar}"/>
                                                            <Setter Property="Foreground" Value="White"/>
                                                        </Trigger>
                                                        <Trigger Property="IsMouseOver" Value="True">
                                                            <Setter TargetName="border" Property="Background" Value="#7093d3" />
                                                            <Setter Property="Foreground" Value="{StaticResource SecondPrimaryColorContract}" />
                                                            <Setter Property="Foreground" Value="{DynamicResource SecondPrimaryColorContract}" />
                                                        </Trigger>
                                                    </ControlTemplate.Triggers>
                                                </ControlTemplate>
Plugin.DODriverControl/SingleControl.xaml.cs
@@ -505,6 +505,7 @@
                        switch (data.ControlType)
                        {
                            case ControlType.BOOL:
                            case ControlType.PULSE:
                                if (data.Dio == DIOType.DI)
                                {
                                    ((LightBall)ui).Value = value == data.PressDownValue;
Plugin.DataBoard/DataBoard.xaml.cs
@@ -1,6 +1,7 @@
using HMI.Base;
using HMI.Core.Entity;
using HMI.Core.Manager;
using HMI.Core.Setting;
using HMI.Core.Util;
using HMI.UI.Util;
using HMI.Util;
@@ -43,7 +44,9 @@
            set { Set(ref _options, value); }
        }
        private string iniFile;
        private string DataFolder;
        public override void InitFinish()
        {
            iniFile = Path.Combine(BaseFolder, "Config.ini");
@@ -51,6 +54,7 @@
            {
                File.Create(iniFile);
            }
            DataFolder = ParamSetting.DataLogFolder;
            LoadProduct();
        }
@@ -151,15 +155,15 @@
            }
        }
        public static string[] GetDbFiles(string folderPath, DateTime startTime, DateTime endTime)
        public string[] GetDbFiles(DateTime startTime, DateTime endTime)
        {
            if (!Directory.Exists(folderPath))
            if (!Directory.Exists(DataFolder))
            {
                return new string[0];
            }
            string startName = $"Data_{startTime.ToString("yyyyMMdd")}";
            string endName = $"Data_{endTime.ToString("yyyyMMdd")}";
            var oldFiles = Directory.GetFiles(folderPath, "Data_*.db");
            var oldFiles = Directory.GetFiles(DataFolder, "Data_*.db");
            oldFiles = oldFiles.Where(file =>
            {
                var fileName = Path.GetFileNameWithoutExtension(file);
@@ -176,7 +180,7 @@
        private List<SerialData> SelectSerialDataByTime(string model, DateTime start, DateTime end)
        {
            var s1 = DateTime.Now;
            string[] files = GetDbFiles(BaseFolder, start, end);
            string[] files = GetDbFiles(start, end);
            if (files == null || files.Length <= 0)
            {
                return new List<SerialData>();
@@ -207,7 +211,7 @@
        private List<SerialData> SelectResultDataByTime(string model, DateTime start, DateTime end)
        {
            string[] files = GetDbFiles(BaseFolder, start, end);
            string[] files = GetDbFiles(start, end);
            if (files == null || files.Length <= 0)
            {
                return new List<SerialData>();
Plugin.DataBoard/Libs/Static/test.html
@@ -208,6 +208,13 @@
                {
                    data: [],
                    type: 'bar',
                    label: {
                        show: true,
                        formatter: '{c}',
                        distance: 5,
                        fontSize: 14,
                        position: 'inside'
                    },
                    barMaxWidth: 50
                }
            ]
@@ -258,6 +265,12 @@
            legend: {
                orient: 'vertical',
                left: 'left'
            },
            label: {
                alignTo: 'edge',
                formatter: '{b}\n计数:{c}\n占比:{d}%',
                fontSize: 16,
                lineHeight: 18
            },
            series: [
                {
@@ -350,13 +363,23 @@
                    itemStyle: {
                        color: 'red'
                    },
                    label: {
                        show: true,
                        position: 'bottom',
                        formatter: (param) => param.value.toFixed(2) + '%'
                    },
                },
                {
                    data: [],
                    itemStyle: {
                        color: '#22448b'
                    },
                    type: 'line'
                    type: 'line',
                    label: {
                        show: true,
                        position: 'top',
                        formatter: (param) => param.value.toFixed(2)+'%'
                    },
                }
            ]
        };
@@ -441,7 +464,7 @@
                    data: [],
                    label: {
                        show: true,
                        formatter: '{b}',
                        formatter: '{b} è®¡æ•°:{c}',
                        distance: 10,
                        fontSize: 14,
                        position: 'insideLeft'
Plugin.DataBoard/Properties/AssemblyInfo.cs
@@ -47,6 +47,6 @@
//      ç”Ÿæˆå·
//      ä¿®è®¢å·
//
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyVersion("1.0.0.1")]
[assembly: AssemblyFileVersion("1.0.0.1")]
[assembly: PluginClassName("Plugin.DataBoard.DataBoard")]
Plugin.JarUI/JarCell.xaml
@@ -48,7 +48,7 @@
                                <Setter Property="Background" Value="{StaticResource passedColor}"/>
                            </DataTrigger>
                            <DataTrigger Binding="{Binding Status}" Value="Failed">
                                <Setter Property="Background" Value="{StaticResource DangerColor}"/>
                                <Setter Property="Background" Value="{DynamicResource DangerColor}"/>
                            </DataTrigger>
                            <DataTrigger Binding="{Binding Status}" Value="Testing">
                                <Setter Property="Background" Value="Gold"/>
Plugin.JarUI/Plugin.JarUI.csproj
@@ -49,6 +49,24 @@
    <LangVersion>7.3</LangVersion>
    <ErrorReport>prompt</ErrorReport>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
    <DebugSymbols>true</DebugSymbols>
    <OutputPath>bin\x86\Debug\</OutputPath>
    <DefineConstants>DEBUG;TRACE</DefineConstants>
    <DebugType>full</DebugType>
    <PlatformTarget>x86</PlatformTarget>
    <LangVersion>7.3</LangVersion>
    <ErrorReport>prompt</ErrorReport>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
    <OutputPath>bin\x86\Release\</OutputPath>
    <DefineConstants>TRACE</DefineConstants>
    <Optimize>true</Optimize>
    <DebugType>pdbonly</DebugType>
    <PlatformTarget>x86</PlatformTarget>
    <LangVersion>7.3</LangVersion>
    <ErrorReport>prompt</ErrorReport>
  </PropertyGroup>
  <ItemGroup>
    <Reference Include="log4net, Version=3.0.4.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a, processorArchitecture=MSIL">
      <HintPath>..\WPFProject\packages\log4net.3.0.4\lib\net462\log4net.dll</HintPath>
Plugin.SeqEditor/Plugin.SeqEditor.csproj
@@ -22,14 +22,12 @@
      <ProjectReference Include="..\HMI.Util\HMI.Util.csproj" />
    </ItemGroup>
    <ItemGroup>
      <Reference Include="NationalInstruments.TestStand.Interop.AdapterAPI">
        <HintPath>..\..\..\..\Program Files\National Instruments\TestStand 2020\API\DotNET\Assemblies\CurrentVersion\NationalInstruments.TestStand.Interop.AdapterAPI.dll</HintPath>
      </Reference>
      <Reference Include="NationalInstruments.TestStand.Interop.API">
        <HintPath>..\..\..\..\Program Files\National Instruments\TestStand 2020\API\DotNET\Assemblies\CurrentVersion\NationalInstruments.TestStand.Interop.API.dll</HintPath>
        <HintPath>..\Libs\NationalInstruments.TestStand.Interop.API.dll</HintPath>
      </Reference>
      <Reference Include="NationalInstruments.TestStand.Interop.UI.Support">
        <HintPath>..\..\..\..\Program Files\National Instruments\TestStand 2020\API\DotNET\Assemblies\CurrentVersion\NationalInstruments.TestStand.Interop.UI.Support.dll</HintPath>
      <Reference Include="NationalInstruments.TestStand.Interop.UI.AxControls">
        <HintPath>..\Libs\NationalInstruments.TestStand.Interop.UI.AxControls.dll</HintPath>
      </Reference>
      <Reference Include="System.Windows.Forms" />
    </ItemGroup>
</Project>
Plugin.SeqEditor/SeqEditor.xaml
@@ -127,18 +127,9 @@
                <Style.Triggers>
                    <Trigger Property="IsSelected" Value="True">
                        <Setter Property="Background" Value="{StaticResource PrimaryColor}"/>
                        <Setter Property="Background" Value="{DynamicResource PrimaryColor}"/>
                    </Trigger>
                </Style.Triggers>
            </Style>
            <Style x:Key="sb" TargetType="ui:TreeDataGrid" BasedOn="{StaticResource DefaultDataGrid}">
                <Setter Property="pu:DataGridHelper.RowHeaderSeparatorVisibility" Value="Visible"/>
                <Setter Property="pu:DataGridHelper.RowHeaderSeparatorBrush" Value="#FFF"/>
                <Setter Property="AreRowDetailsFrozen" Value="False"/>
                <Setter Property="HeadersVisibility" Value="Column"/>
                <Setter Property="DataGridCell.VerticalContentAlignment" Value="Center"/>
                <Setter Property="DataGridCell.HorizontalContentAlignment" Value="Left"/>
            </Style>
            <Style x:Key="gvh" TargetType="GridViewColumnHeader">
Plugin.TestResult/CSVPrinter.cs
New file
@@ -0,0 +1,44 @@
using System.IO;
using System.Text;
namespace CSVHelper
{
    public class CSVPrinter
    {
        public static void Print(string dir, string fileName, string title, string line)
        {
            EnsureDirectoryExists(dir);
            string path = Path.Combine(dir, fileName);
            lock (path)
            {
                if (!File.Exists(path))
                {
                    using (var fs = File.Create(path))
                    using (var writer = new StreamWriter(fs, Encoding.UTF8))
                    {
                        writer.WriteLine(title);
                        writer.WriteLine(line);
                        writer.Flush();
                    }
                }
                else
                {
                    using (var fs = new FileStream(path, FileMode.Append, FileAccess.Write, FileShare.ReadWrite))
                    using (var writer = new StreamWriter(fs, Encoding.UTF8))
                    {
                        writer.WriteLine(line);
                        writer.Flush();
                    }
                }
            }
        }
        private static void EnsureDirectoryExists(string logDir)
        {
            if (!Directory.Exists(logDir))
            {
                Directory.CreateDirectory(logDir);
            }
        }
    }
}
Plugin.TestResult/Chart.xaml.cs
@@ -1,12 +1,17 @@
using Plugin.TestResult_WPF.Model;
using log4net.Repository.Hierarchy;
using Plugin.TestResult_WPF.Model;
using ScottPlot;
using ScottPlot.Plottables;
using ScottPlot.TickGenerators;
using System;
using System.Collections.Generic;
using System.Data.SqlTypes;
using System.Linq;
using System.Text;
using System.Timers;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Xml.Linq;
namespace Plugin.TestResult_WPF
{
@@ -26,7 +31,8 @@
        private readonly Dictionary<string, Queue<long>> xValues;
        private readonly Dictionary<string, Queue<double>> yValues;
        readonly DataLogger singleLogger;
        private readonly Dictionary<DataLogger, double> maxValue = new Dictionary<DataLogger, double>();
        private readonly Dictionary<DataLogger, double> minValue = new Dictionary<DataLogger, double>();
        private readonly string title;
        private readonly bool multi;
@@ -37,6 +43,8 @@
        private float fontSize = -1;
        private Timer timer;
        private LinePlot[] childrenPlot;
        private readonly Dictionary<string, DataLogger> loggers = new Dictionary<string, DataLogger>();
@@ -49,12 +57,14 @@
            return logger;
        }
        public Chart(string title, bool multi, int maxSize, int refreshInterval)
        public Chart(string title, bool multi, float titleSize)
        {
            BaseConfig config = new BaseConfig();
            this.title = title;
            this.maxSize = maxSize;
            this.maxSize = config.MaxSize;
            this.multi = multi;
            this.refreshInterval = refreshInterval;
            this.refreshInterval = config.RefreshInterval;
            this.fontSize = titleSize;
            InitializeComponent();
@@ -66,22 +76,19 @@
                var legend = chart.Plot.ShowLegend(Edge.Top);
                legend.Alignment = Alignment.UpperLeft;
                legend.Padding = new PixelPadding(0);
                chart.Plot.Axes.Left.TickLabelStyle.FontSize = 12;
                chart.Plot.Axes.Bottom.TickLabelStyle.FontSize = 12;
                chart.Plot.Axes.Left.Label.FontSize = 15;
            }
            else
            {
                singleLogger = InitLogger();
                singleLogger.Color = Colors.Red;
                xData = new Queue<long>(maxSize);
                yData = new Queue<double>(maxSize);
                chart.Plot.Axes.Left.TickLabelStyle.FontSize = (float)FontSizeConverter.CountFontSize(12, ActualHeight, 92);
                chart.Plot.Axes.Bottom.TickLabelStyle.FontSize = (float)FontSizeConverter.CountFontSize(12, ActualHeight, 92);
                chart.Plot.Axes.Left.Label.FontSize = (float)FontSizeConverter.CountFontSize(15, ActualHeight, 92);
            }
            chart.Plot.Axes.Left.TickLabelStyle.FontSize = 12;
            chart.Plot.Axes.Left.Label.FontSize = 15;
            chart.Plot.Axes.Bottom.TickLabelStyle.FontSize = 12;
            chart.Plot.Axes.Bottom.TickLabelStyle.IsVisible = false;
            chart.Plot.Axes.Bottom.MajorTickStyle.Color = Colors.Transparent;
            chart.Plot.Axes.Bottom.MinorTickStyle.Color = Colors.Transparent;
            /// ç¦ç”¨é¼ æ ‡
            chart.UserInputProcessor.Disable();
@@ -172,40 +179,36 @@
            timer.Elapsed += Timer_Elapsed;
        }
        public Chart(string title, bool multi, float titleSize)
        public Chart(string title, string[] serials, float titleSize)
        {
            BaseConfig config = new BaseConfig();
            this.title = title;
            this.multi = multi;
            this.multi = true;
            this.maxSize = config.MaxSize;
            this.refreshInterval = config.RefreshInterval;
            fontSize = titleSize;
            childrenPlot = new LinePlot[serials.Length];
            InitializeComponent();
            if (this.multi)
            {
                xValues = new Dictionary<string, Queue<long>>();
                yValues = new Dictionary<string, Queue<double>>();
                //chart.Plot.ShowLegend(Alignment.UpperLeft, Orientation.Vertical);
                var legend = chart.Plot.ShowLegend(Edge.Top);
                legend.Alignment = Alignment.UpperLeft;
                legend.Padding = new PixelPadding(0);
            var panel = chart.Plot.ShowLegend(Edge.Top);
            panel.Alignment = Alignment.UpperLeft;
            panel.Padding = new PixelPadding(0);
                chart.Plot.Axes.Left.TickLabelStyle.FontSize = titleSize - 3;
                chart.Plot.Axes.Bottom.TickLabelStyle.FontSize = titleSize - 3;
                chart.Plot.Axes.Left.Label.FontSize = titleSize;
            }
            else
            {
                singleLogger = InitLogger();
                singleLogger.Color = Colors.Red;
                xData = new Queue<long>(maxSize);
                yData = new Queue<double>(maxSize);
                chart.Plot.Axes.Left.TickLabelStyle.FontSize = titleSize - 3;
            chart.Plot.Axes.Right.TickLabelStyle.FontSize = titleSize - 3;
            chart.Plot.Axes.Right.Label.FontSize = titleSize;
                chart.Plot.Axes.Bottom.TickLabelStyle.FontSize = titleSize - 3;
                chart.Plot.Axes.Left.Label.FontSize = titleSize;
            }
            chart.Plot.Axes.Bottom.TickLabelStyle.IsVisible = false;
            chart.Plot.Axes.Bottom.MajorTickStyle.Color = Colors.Transparent;
            chart.Plot.Axes.Bottom.MinorTickStyle.Color = Colors.Transparent;
            /// ç¦ç”¨é¼ æ ‡
            chart.UserInputProcessor.Disable();
@@ -216,6 +219,8 @@
                    return TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1)).AddMilliseconds(position).ToString("HH:mm:ss");
                return "";
            }
            chart.Plot.HideLegend();
            EvenlySpacedMinorTickGenerator minorTickGen = new EvenlySpacedMinorTickGenerator(10);
            NumericAutomatic myTickGenerator = new NumericAutomatic()
            {
@@ -223,12 +228,28 @@
                MinorTickGenerator = minorTickGen
            };
            chart.Plot.Axes.Bottom.TickGenerator = myTickGenerator;
            if (!string.IsNullOrEmpty(this.title))
            if (!string.IsNullOrEmpty(serials[0]))
            {
                chart.Plot.Axes.Left.Label.Text = this.title;
                var newLine = chart.Plot.Add.Line(Coordinates.NaN, Coordinates.NaN);
                newLine.Axes.YAxis = chart.Plot.Axes.Left;
                newLine.Axes.XAxis = chart.Plot.Axes.Bottom;
                childrenPlot[0] = newLine;
                chart.Plot.Axes.Left.Label.Text = serials[0];
                chart.Plot.Axes.Left.Label.Bold = false;
                chart.Plot.Font.Automatic();
                //RefreshData();
            }
            if (!string.IsNullOrEmpty(serials[1]))
            {
                var newLine = chart.Plot.Add.Line(Coordinates.NaN, Coordinates.NaN);
                newLine.Axes.YAxis = chart.Plot.Axes.Right;
                newLine.Axes.XAxis = chart.Plot.Axes.Bottom;
                childrenPlot[1] = newLine;
                chart.Plot.Axes.Right.Label.Text = serials[1];
                chart.Plot.Axes.Right.Label.Bold = false;
                chart.Plot.Font.Automatic();
            }
            timer = new Timer();
@@ -244,12 +265,30 @@
            }
        }
        private DataLogger GetLogger(string name, out bool isNew, string legend = null)
        {
            isNew = false;
            if (!loggers.ContainsKey(name))
            {
                var logger = InitLogger();
                if (legend != null) logger.LegendText = name;
                loggers.Add(name, logger);
                isNew = true;
            }
            return loggers[name];
        }
        public void RefreshData()
        {
            bool flag = timer.Enabled;
            try
            {
                timer.Enabled = false;
                foreach (var logger in loggers.Values)
                {
                    logger.ViewFull();
                }
                /// é™åˆ¶yè½´
                if (maxYValue > -1)
                {
@@ -271,47 +310,15 @@
        {
            this.maxYValue = -1;
            this.minYValue = double.MaxValue;
            if (this.multi)
            {
                foreach (var name in loggers.Keys)
                {
                    loggers[name].Clear();
                    xValues[name].Clear();
                    yValues[name].Clear();
                xValues?[name]?.Clear();
                yValues?[name]?.Clear();
                }
            xData?.Clear();
            yData?.Clear();
                chart.Refresh();
                return;
            }
            singleLogger.Clear();
            xData.Clear();
            yData.Clear();
            chart.Refresh();
        }
        public void AddData(double y)
        {
            if (this.multi)
            {
                return;
            }
            this.maxYValue = y > maxYValue ? y : maxYValue;
            this.minYValue = y < minYValue ? y : minYValue;
            var nowTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
            InsertData(xData, yData, nowTime, y);
            singleLogger.Add(new Coordinates(nowTime, y));
            //Streamer1.Add(new Coordinates(DateTimeOffset.Now.ToUnixTimeSeconds(), y));
            chart.Plot.GetPlottables<Marker>()
                .ToList()
                .ForEach(m => m.X -= 1);
            chart.Plot.GetPlottables<Marker>()
                .Where(m => m.X < 0)
                .ToList()
                .ForEach(m => chart.Plot.Remove(m));
            //RefreshData();
        }
        public List<double> GetSingleData()
@@ -339,38 +346,21 @@
            yAxis.Enqueue(y);
        }
        public void AddData(string name, double y)
        public void AddData(double y)
        {
            if (!this.multi)
            if (this.multi)
            {
                return;
            }
            var commonName = "Single";
            this.maxYValue = y > maxYValue ? y : maxYValue;
            this.minYValue = y < minYValue ? y : minYValue;
            if (loggers.ContainsKey(name))
            {
                var logger = loggers[name];
                var x = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
                logger.Add(new Coordinates(x, y));
                InsertData(xValues[name], yValues[name], x, y);
            }
            else
            {
                var logger = InitLogger();
                logger.LegendText = name;
                loggers.Add(name, logger);
                var xAxis = new Queue<long>(maxSize);
                var yAxis = new Queue<double>(maxSize);
                xValues.Add(name, xAxis);
                yValues.Add(name, yAxis);
                var x = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
                logger.Add(new Coordinates(x, y));
                InsertData(xAxis, yAxis, x, y);
            }
            var nowTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
            DataLogger singleLogger = GetLogger(commonName, out _);
            singleLogger.Color = Colors.Red;
            InsertData(xData, yData, nowTime, y);
            singleLogger.Add(new Coordinates(nowTime, y));
            //Streamer1.Add(new Coordinates(DateTimeOffset.Now.ToUnixTimeSeconds(), y));
@@ -381,7 +371,98 @@
                .Where(m => m.X < 0)
                .ToList()
                .ForEach(m => chart.Plot.Remove(m));
            //RefreshData();
        }
        public void AddData(string name, double y)
        {
            if (!this.multi)
            {
                return;
            }
            this.maxYValue = y > maxYValue ? y : maxYValue;
            this.minYValue = y < minYValue ? y : minYValue;
            DataLogger logger = null;
            if (loggers.ContainsKey(name))
            {
                logger = loggers[name];
            }
            else
            {
                logger = InitLogger();
                logger.LegendText = name;
                loggers.Add(name, logger);
                var xAxis = new Queue<long>(maxSize);
                var yAxis = new Queue<double>(maxSize);
                xValues.Add(name, xAxis);
                yValues.Add(name, yAxis);
            }
            var x = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
            logger.Add(new Coordinates(x, y));
            InsertData(xValues[name], yValues[name], x, y);
            //Streamer1.Add(new Coordinates(DateTimeOffset.Now.ToUnixTimeSeconds(), y));
            chart.Plot.GetPlottables<Marker>()
                .ToList()
                .ForEach(m => m.X -= 1);
            chart.Plot.GetPlottables<Marker>()
                .Where(m => m.X < 0)
                .ToList()
                .ForEach(m => chart.Plot.Remove(m));
        }
        public void AddData(int serials, string name, double y)
        {
            if (!this.multi)
            {
                return;
            }
            var plot = childrenPlot[serials];
            DataLogger logger = GetLogger(name, out bool isNew, name);
            this.maxYValue = y > maxYValue ? y : maxYValue;
            this.minYValue = y < minYValue ? y : minYValue;
            logger.Axes.YAxis = plot.Axes.YAxis;
            logger.Axes.XAxis = plot.Axes.XAxis;
            if (name == "水箱温度")
            {
                logger.Color = Colors.Red;
            }
            else if (name == "回水温度")
            {
                logger.Color = Colors.Blue;
            }
            else
            {
                logger.Color = Colors.Green;
            }
            if (isNew)
            {
                var xAxis = new Queue<long>(maxSize);
                var yAxis = new Queue<double>(maxSize);
                xValues.Add(name, xAxis);
                yValues.Add(name, yAxis);
            }
            var x = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
            logger.Add(new Coordinates(x, y));
            InsertData(xValues[name], yValues[name], x, y);
            //Streamer1.Add(new Coordinates(DateTimeOffset.Now.ToUnixTimeSeconds(), y));
            chart.Plot.GetPlottables<Marker>()
                .ToList()
                .ForEach(m => m.X -= 1);
            chart.Plot.GetPlottables<Marker>()
                .Where(m => m.X < 0)
                .ToList()
                .ForEach(m => chart.Plot.Remove(m));
        }
        private void UserControl_Loaded(object sender, System.Windows.RoutedEventArgs e)
Plugin.TestResult/Cooler.xaml
New file
@@ -0,0 +1,77 @@
<UserControl x:Class="Plugin.TestResult.Cooler"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:local="clr-namespace:Plugin.TestResult"
             mc:Ignorable="d"
        xmlns:pu="https://opensource.panuon.com/wpf-ui"
             d:DesignHeight="450" d:DesignWidth="800">
    <GroupBox Header="{Binding Title}">
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition />
                <RowDefinition Height="Auto"/>
            </Grid.RowDefinitions>
            <Label x:Name="label">
                <Label.Style>
                    <Style TargetType="Label">
                        <Setter Property="HorizontalContentAlignment" Value="Center"/>
                        <Setter Property="VerticalContentAlignment" Value="Center"/>
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding Status}" Value="0">
                                <Setter Property="Background" Value="Gray"/>
                                <Setter Property="Content" Value="停止"/>
                            </DataTrigger>
                            <DataTrigger Binding="{Binding Status}" Value="1">
                                <Setter Property="Content" Value="运水中"/>
                            </DataTrigger>
                            <DataTrigger Binding="{Binding Status}" Value="2">
                                <Setter Property="Background" Value="Gray"/>
                                <Setter Property="Content" Value="{Binding LabelContent}"/>
                            </DataTrigger>
                            <DataTrigger Binding="{Binding Status}" Value="3">
                                <Setter Property="Background" Value="Gray"/>
                                <Setter Property="Content" Value="测压中"/>
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </Label.Style>
            </Label>
            <StackPanel Grid.Row="1">
                <!--<Button Click="Button_Click" Style="{StaticResource PrimaryButton}" Tag="1" IsEnabled="False" Content="运水"/>-->
                <Button Click="Start_Click" Tag="2" x:Name="startBtn" Content="吹水">
                    <Button.Style>
                        <Style TargetType="Button" BasedOn="{StaticResource PrimaryButton}">
                            <Style.Triggers>
                                <DataTrigger Binding="{Binding Status}" Value="2">
                                    <Setter Property="IsEnabled" Value="False"/>
                                </DataTrigger>
                            </Style.Triggers>
                        </Style>
                    </Button.Style>
                </Button>
                <!--<Button Click="Button_Click" Style="{StaticResource PrimaryButton}" Tag="3" IsEnabled="False" Content="测压"/>-->
                <Button Click="Stop_Click" Style="{StaticResource DangerButton}" Tag="0" Content="停止" Cursor="Hand"/>
                <!--<Button.Style>
                    <Style TargetType="Button" BasedOn="{StaticResource PrimaryButton}">
                        <Setter Property="Content" Value="手动吹水"/>
                        <Setter Property="IsEnabled" Value="False"/>
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding Status}" Value="0">
                                <Setter Property="Content" Value="手动吹水"/>
                                <Setter Property="IsEnabled" Value="True"/>
                                <Setter Property="Background" Value="{DynamicResource SuccessColor}"/>
                            </DataTrigger>
                            <DataTrigger Binding="{Binding Status}" Value="2">
                                <Setter Property="Content" Value="停止吹水"/>
                                <Setter Property="IsEnabled" Value="True"/>
                                <Setter Property="Background" Value="{DynamicResource DangerColor}"/>
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </Button.Style>-->
            </StackPanel>
        </Grid>
    </GroupBox>
</UserControl>
Plugin.TestResult/Cooler.xaml.cs
New file
@@ -0,0 +1,218 @@
using HMI.Core.Manager;
using HMI.UI.Util;
using PLCHelper;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;
using System.Timers;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace Plugin.TestResult
{
    /// <summary>
    /// Cooler.xaml çš„交互逻辑
    /// </summary>
    public partial class Cooler : UserControl, INotifyPropertyChanged
    {
        #region ...
        public virtual event PropertyChangedEventHandler PropertyChanged;
        protected virtual void Set([CallerMemberName] string name = null)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
        }
        protected void Set<T>(ref T old, T @new, [CallerMemberName] string propertyName = null)
        {
            old = @new;
            if (propertyName != null)
            {
                Set(propertyName);
            }
        }
        #endregion
        public int index { get; private set; }
        public string Title { get; set; }
        private Timer timer;
        public Cooler(int index)
        {
            DataContext = this;
            this.index = index;
            this.Title = $"第{index + 1}路水冷机";
            InitializeComponent();
        }
        private ushort status;
        public ushort Status
        {
            get => status;
            set
            {
                Set(ref status, value);
            }
        }
        private int totalTime;
        private string labelContent = "吹水中";
        public string LabelContent
        {
            get => labelContent;
            set
            {
                Set(ref labelContent, value);
            }
        }
        private void InitTimer(int time)
        {
            if (time <= 0)
            {
                time = 240;
            }
            totalTime = time;
            LabelContent = $"吹水中\r\n剩{totalTime}s...";
            timer = new Timer();
            timer.Interval = 1000;
            timer.Elapsed += Timer_Elapsed;
            timer.Enabled = true;
        }
        private void Timer_Elapsed(object sender, ElapsedEventArgs e)
        {
            try
            {
                timer.AutoReset = false;
                if (totalTime > 0)
                {
                    totalTime -= 1;
                    LabelContent = $"吹水中\r\n剩{totalTime}s...";
                }
                else
                {
                    if (S7Context.WriteData("", $"Cooler{index + 1}_Status", 0, out string errMsg))
                    {
                        Status = 0;
                        Dispatcher.Invoke(() =>
                        {
                            startBtn.IsEnabled = true;
                        });
                    }
                    else
                    {
                        Dispatcher.Invoke(() =>
                        {
                            ToastHelper.Error(errMsg);
                        });
                    }
                    Release();
                }
            }
            catch (Exception ex)
            {
            }
            finally
            {
                if (timer?.Enabled == true) timer.AutoReset = true;
            }
        }
        private void Start_Click(object sender, RoutedEventArgs e)
        {
            if (timer != null) return;
            var btn = sender as Button;
            int totalTime = 240;
            try
            {
                var p = ParameterManager.GetCommonParameterByName("吹水时间")?.Value;
                if (!string.IsNullOrEmpty(p)) totalTime = int.Parse(p);
            }
            catch (Exception ex)
            {
            }
            if (MsgBoxHelper2.WarnChoose($"第 [{index + 1}] è·¯æ°´å†·æœºç¡®å®šè¦{btn.Content}吗?") == MessageBoxResult.OK)
            {
                try
                {
                    if (S7Context.WriteData("", $"Cooler{index + 1}_Status", 2, out string errMsg))
                    {
                        Status = 2;
                        InitTimer(totalTime);
                        btn.IsEnabled = false;
                    }
                    else
                    {
                        ToastHelper.Error(errMsg);
                    }
                }
                catch (Exception ex)
                {
                    ToastHelper.Error(ex.Message);
                }
            }
        }
        private void Stop_Click(object sender, RoutedEventArgs e)
        {
            var btn = sender as Button;
            if (MsgBoxHelper2.WarnChoose($"第 [{index + 1}] è·¯æ°´å†·æœºç¡®å®šè¦{btn.Content}吗?") == MessageBoxResult.OK)
            {
                try
                {
                    if (timer != null)
                    {
                        timer.Enabled = false;
                        timer.Dispose();
                        timer = null;
                    }
                    if (S7Context.WriteData("", $"Cooler{index + 1}_Status", 0, out string errMsg))
                    {
                        Status = 0;
                        startBtn.IsEnabled = true;
                    }
                    else
                    {
                        ToastHelper.Error(errMsg);
                    }
                }
                catch (Exception ex)
                {
                    ToastHelper.Error(ex.Message);
                }
            }
        }
        public void Release()
        {
            if (timer != null)
            {
                timer.Enabled = false;
                timer.Dispose();
                timer = null;
            }
        }
    }
}
Plugin.TestResult/CoolerStatus.xaml
New file
@@ -0,0 +1,25 @@
<pu:WindowX x:Class="Plugin.TestResult.CoolerStatus"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:Plugin.TestResult"
        WindowStartupLocation="CenterScreen"
        FontSize="20"
        mc:Ignorable="d"
        Style="{StaticResource ModalWindow}"
        xmlns:hb="clr-namespace:HMI.Base;assembly=HMI.Base"
        xmlns:uic="clr-namespace:HMI.UI.Converter;assembly=HMI.UI"
        xmlns:pw="https://opensource.panuon.com/wpf"
        xmlns:pu="https://opensource.panuon.com/wpf-ui"
        xmlns:dp="clr-namespace:HMI.UI.DpUtil;assembly=HMI.UI"
        xmlns:cc="clr-namespace:HMI.Core;assembly=HMI.Core"
        InteropOwnersMask="False"
        pu:WindowXModalDialog.Buttons="{x:Null}"
        Closed="WindowX_Closed"
        Loaded="WindowX_Loaded"
        Width="600" Height="400">
    <Window.Resources>
    </Window.Resources>
    <Grid Margin="10" x:Name="mainGrid"></Grid>
</pu:WindowX>
Plugin.TestResult/CoolerStatus.xaml.cs
New file
@@ -0,0 +1,95 @@
using Panuon.WPF.UI;
using PLCHelper;
using System;
using System.Collections.Generic;
using System.Timers;
using System.Windows;
using System.Windows.Controls;
namespace Plugin.TestResult
{
    /// <summary>
    /// CoolerStatus.xaml çš„交互逻辑
    /// </summary>
    public partial class CoolerStatus : WindowX
    {
        private int ovenIndex;
        private int columns;
        private Timer timer;
        private List<Cooler> coolers = new List<Cooler>();
        public CoolerStatus(int ovenIndex, int columns, string title)
        {
            DataContext = this;
            this.ovenIndex = ovenIndex;
            this.columns = columns;
            Title = title;
            timer = new Timer();
            timer.Interval = 1000;
            timer.Elapsed += Timer_Elapsed;
            InitializeComponent();
            RefreshUI();
            RefreshStatus();
        }
        private void Timer_Elapsed(object sender, ElapsedEventArgs e)
        {
            RefreshStatus();
        }
        private void RefreshStatus()
        {
            foreach (var cooler in coolers)
            {
                try
                {
                    if (S7Context.GetData("", $"Cooler{cooler.index + 1}_Status", out object val))
                    {
                        cooler.Dispatcher.Invoke(() =>
                        {
                            cooler.Status = (ushort)val;
                        });
                    }
                }
                catch (Exception ex)
                {
                }
            }
        }
        private void RefreshUI()
        {
            mainGrid.Children.Clear();
            mainGrid.ColumnDefinitions.Clear();
            for (int i = 0; i < this.columns; i++)
            {
                ColumnDefinition newCol = new ColumnDefinition();
                newCol.Width = new GridLength(1, GridUnitType.Star);
                mainGrid.ColumnDefinitions.Add(newCol);
                var cooler = new Cooler(ovenIndex * columns + i);
                Grid.SetColumn(cooler, i);
                mainGrid.Children.Add(cooler);
                coolers.Add(cooler);
            }
        }
        private void WindowX_Closed(object sender, EventArgs e)
        {
            timer.Enabled = false;
            timer.Dispose();
            foreach (var cooler in coolers)
            {
                cooler.Release();
            }
        }
        private void WindowX_Loaded(object sender, RoutedEventArgs e)
        {
            timer.Enabled = true;
            this.Loaded -= WindowX_Loaded;
        }
    }
}
Plugin.TestResult/DataTable.xaml
@@ -10,6 +10,7 @@
xmlns:pu="https://opensource.panuon.com/wpf-ui"
xmlns:ui="clr-namespace:HMI.UI;assembly=HMI.UI"
xmlns:dp="clr-namespace:HMI.UI.DpUtil;assembly=HMI.UI"
xmlns:dc="clr-namespace:HMI.UI.Converter;assembly=HMI.UI"
             mc:Ignorable="d"
             Background="#FFF"
             BorderBrush="Black"
@@ -19,6 +20,7 @@
             d:DesignHeight="450" d:DesignWidth="800">
    <UserControl.Resources>
        <local:FontSizeConverter x:Key="FontSizeConverter"/>
        <dc:ReverseBoolConverter x:Key="reverseConverter"/>
    </UserControl.Resources>
    <Grid x:Name="grid">
        <Grid.RowDefinitions>
@@ -49,6 +51,7 @@
            <ComboBox Grid.Row="1" FontSize="{Binding ActualWidth,RelativeSource={RelativeSource AncestorType=UserControl}, 
Converter={StaticResource FontSizeConverter}, ConverterParameter='15,940'}"
                      Style="{StaticResource FormComboxStyle}"
                      IsEnabled="{Binding IsTesting,Converter={StaticResource reverseConverter}}"
                      pu:ComboBoxHelper.ClearButtonVisibility="Collapsed"
                      BorderBrush="Black"
                      Height="26"
@@ -79,7 +82,7 @@
                </ItemsPanelTemplate>
            </StatusBar.ItemsPanel>
            <StatusBarItem DockPanel.Dock="Left">
                <Button Style="{StaticResource LinkButton}" Click="Button_Click_1">扫码枪设置</Button>
                <Button Style="{StaticResource LinkButton}" Click="Button_Click_1" Content="{DynamicResource App.ScannerSetting}"/>
            </StatusBarItem>
            <StatusBarItem DockPanel.Dock="Right">
@@ -108,6 +111,17 @@
                </StackPanel>
            </StatusBarItem>
            <StatusBarItem DockPanel.Dock="Right">
                <Button Click="Manual_Cooler_Opt" x:Name="coolerSetting">
                    <Button.Style>
                        <Style TargetType="Button" BasedOn="{StaticResource LinkButton}">
                            <Setter Property="Content" Value="{DynamicResource Tr.CoolerSetting}"/>
                            <Setter Property="Foreground" Value="{DynamicResource PrimaryColor}"/>
                        </Style>
                    </Button.Style>
                </Button>
            </StatusBarItem>
            <StatusBarItem >
                <TextBox IsReadOnly="True" Background="Transparent" BorderThickness="0" Text="{Binding statusText}"/>
            </StatusBarItem>
Plugin.TestResult/DataTable.xaml.cs
@@ -1,19 +1,17 @@
using HMI.Core.Util;
using HMI.Core.Setting;
using HMI.Core.Util;
using HMI.UI.Util;
using HMI.Util;
using Plugin.TestResult;
using Plugin.TestResult.Util;
using Plugin.TestResult_WPF.Model;
using Plugin.TestResult_WPF.Util;
using SuperSocket.SocketBase.Config;
using SuperSocket.SocketBase.Protocol;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.IO;
using System.Net.WebSockets;
using System.Runtime.CompilerServices;
using System.Threading.Tasks;
using System.Timers;
using System.Windows;
using System.Windows.Controls;
@@ -64,6 +62,16 @@
            set => RaiseAndSetIfchanged(ref _isTesting, value);
        }
        private ushort coolerStatus;
        public ushort CoolerStatus
        {
            get => coolerStatus;
            set
            {
                RaiseAndSetIfchanged(ref coolerStatus, value);
            }
        }
        private string tcpServerStatus;
        public string TcpServerStatus
@@ -79,17 +87,15 @@
            get { return tcpServerInfo; }
            set { RaiseAndSetIfchanged(ref tcpServerInfo, value); }
        }
        private static ICodeParser codeParser;
        private readonly int index;
        public int index { get; private set; }
        private readonly int cellCount;
        private readonly string chartTitle;
        private readonly TestResultView parent;
        private BaseConfig config;
        private Chart chart;
        private Chart multiChart;
        private SingleCell[] cells;
        private LiveChart chart;
        private LiveChart multiChart;
        public SingleCell[] cells { get; private set; }
        private TcpServer tcpServer;
        private string CountIniPath;
@@ -114,12 +120,12 @@
            this.title = title;
            this.cellCount = config.PositionCount;
            this.cells = new SingleCell[cellCount];
            this.chartTitle = config.MainChartTitle;
            this.chartTitle = this.lang("Tr.AvgTemp");
            DataContext = this;
            InitializeComponent();
            mainGrid.Columns = config.PositionColumn;
            this.chart = new Chart(this.chartTitle, false, config.MaxSize, config.RefreshInterval);
            this.multiChart = new Chart(config.DetailChartTitle, true, config.MaxSize, config.RefreshInterval)
            this.chart = new LiveChart("平均温度,平均温度(℃)", false, true);
            this.multiChart = new LiveChart(",详细温度(℃)", true)
            {
                BorderThickness = new Thickness(0)
            };
@@ -138,19 +144,14 @@
                cells[i] = cell;
            }
            if (config.CodeParserType == "JK01")
            {
                codeParser = new JKCodeParser();
            }
            else
            {
                codeParser = new CommonCodeParser();
            }
            ScannerParser.Init(config.CodeParserType);
            ReadCount();
            testTimeTimer = new Timer();
            testTimeTimer.Interval = 10000;
            testTimeTimer.AutoReset = true;
            testTimeTimer.Elapsed += TestTimeTimer_Elapsed;
            if (!ParamSetting.ShowCoolerSetting) coolerSetting.Visibility = Visibility.Collapsed;
        }
        private void TestTimeTimer_Elapsed(object sender, ElapsedEventArgs e)
@@ -159,7 +160,7 @@
            var now = DateTime.Now;
            Dispatcher.BeginInvoke(new Action(() =>
            {
                SetConsumeTime((now - testStartTime).Value.TotalSeconds);
                //SetConsumeTime((now - testStartTime).Value.TotalSeconds);
            }));
        }
@@ -182,23 +183,25 @@
        {
            infoTable.temperature = t;
            tempratures.Add(t);
            chart.AddData(t);
            chart.AddDynamicData("平均温度", "平均温度(℃)", DateTime.Now, t);
        }
        public void SetTemperature(string name, double t)
        {
            List<double> list;
            if (detailTempratures.ContainsKey(name))
            {
                list = detailTempratures[name];
            }
            else
            {
                list = new List<double>();
                detailTempratures.Add(name, list);
            }
            list.Add(t);
            multiChart.AddData(name, t);
            //List<double> list;
            //if (detailTempratures.ContainsKey(name))
            //{
            //    list = detailTempratures[name];
            //}
            //else
            //{
            //    list = new List<double>();
            //    detailTempratures.Add(name, list);
            //}
            //list.Add(t);
            multiChart.AddDynamicData(name, "详细温度(℃)", DateTime.Now, t);
            //multiChart.AddData(name, t);
        }
        public void SetStatus(string status)
@@ -224,20 +227,20 @@
                }
                infoTable.status = status;
                if (lastStatus != "testing" && status == "testing")
                {
                    testStartTime = DateTime.Now;
                    SetStartTime(testStartTime?.ToString("yyyy-MM-dd HH:mm:ss"));
                    testTimeTimer.Start();
                }
                if (lastStatus == "testing" && status != "testing")
                {
                    testTimeTimer.Stop();
                    var now = DateTime.Now;
                    SetConsumeTime((now - testStartTime).Value.TotalSeconds);
                    SetEndTime(now.ToString("yyyy-MM-dd HH:mm:ss"));
                    testStartTime = null;
                }
                //if (lastStatus != "testing" && status == "testing")
                //{
                //    testStartTime = DateTime.Now;
                //    SetStartTime(testStartTime?.ToString("yyyy-MM-dd HH:mm:ss"));
                //    testTimeTimer.Start();
                //}
                //if (lastStatus == "testing" && status != "testing")
                //{
                //    testTimeTimer.Stop();
                //    var now = DateTime.Now;
                //    infoTable.UpdateConsumeTime((now - testStartTime).Value.TotalSeconds, null);
                //    SetEndTime(now.ToString("yyyy-MM-dd HH:mm:ss"));
                //    testStartTime = null;
                //}
            }));
        }
@@ -261,9 +264,9 @@
            infoTable.endTimeStr = endTime;
        }
        public void SetConsumeTime(double consumeTime)
        public void UpdateConsumeTime(double consumeTime, double? leftTime)
        {
            infoTable.consumeTime = consumeTime;
            infoTable.UpdateConsumeTime(consumeTime, leftTime);
        }
        private ChartWindow window;
@@ -301,7 +304,7 @@
        {
            if (IsTesting)
            {
                if (MsgBoxHelper2.WarnChoose($"确实停止老化炉[{title}]的测试吗") == MessageBoxResult.OK)
                if (MsgBoxHelper2.WarnChoose(this.lang("Tr.MakeSureStopOvenTest", title)) == MessageBoxResult.OK)
                {
                    parent.SetStartFlag(this.index, false);
                }
@@ -317,7 +320,7 @@
        {
            if (!parent.IsRunning)
            {
                MsgBoxHelper.WarnMessage(this, "请先点击右侧启动按钮启动测试程序!", null, MessageBoxButton.OK);
                MsgBoxHelper.WarnMessage(this, this.lang("Tr.StartSeqFirst"), null, MessageBoxButton.OK);
                return;
            }
@@ -327,7 +330,8 @@
            }
            else
            {
                scanner = new Scanner(this.lang("Tr.ScanTitle", title))
                int rows = config.CellCount / config.PositionColumn + 1;
                scanner = new Scanner(this.index, this.lang("Tr.ScanTitle", title), CbProduct.SelectedItem?.ToString(), mainGrid.Columns, rows)
                {
                    Owner = Window.GetWindow(this),
                    Tag = title
@@ -355,32 +359,33 @@
        {
            if (parent.SequenceContext == null) return;
            CellInfo cellInfo = codeParser.GetCellInfoByCode(e.positionCode);
            int rows = (config.CellCount / config.PositionColumn) + 1;
            CellInfo cellInfo = ScannerParser.GetCellInfoByCode(CbProduct.SelectedItem?.ToString(), mainGrid.Columns, rows, e.positionCode);
            string positionCode = e.positionCode, snrCode = e.snrCode;
            //将读到的条码写入到SN中
            int dutNo = this.index * this.cellCount + cellInfo.Index;
            string LookupStr = $"StationState.SN[{dutNo}]";
            cellInfo.LookUpStr = LookupStr;
            ViewControl.Logger.Debug($"PositionCode: [{e.positionCode}], SNR: [{e.snrCode}], LookUpStr: [{LookupStr}]");
            ViewControl.Logger.Debug($"OvenName: [{cellInfo.OvenName}], CellIndex: [{cellInfo.Index}]");
            var cell = parent.nameTables[cellInfo.OvenName].GetSingleCell(cellInfo.Index);
            var cell = TestResultView.nameTables[cellInfo.OvenName].GetSingleCell(cellInfo.Index);
            if (snrCode == null)
            {
                string oldLookUp = $"StationState.SN[{e.oldIndex}]";
                var oldCellInfo = codeParser.GetCellInfoByCode(e.oldPosition);
                var oldCell = parent.nameTables[oldCellInfo.OvenName].GetSingleCell(oldCellInfo.Index);
                var oldCellInfo = e.lastInfo;
                var oldCell = TestResultView.nameTables[oldCellInfo.OvenName].GetSingleCell(oldCellInfo.Index);
                if (oldCell.status != "hadCode")
                {
                    throw new Exception($"穴位[{e.oldPosition}]当前不允许清除条码!");
                    throw new Exception(this.lang("Tr.PositionCantClearSNR", oldCellInfo.OriginCode));
                }
                // ç§»é™¤æ¡ç 
                parent.engine.Globals.SetValString(oldLookUp, 1, "");
                parent.engine.Globals.SetValString(oldCellInfo.LookUpStr, 1, "");
                parent.engine.CommitGlobalsToDisk(promptOnSaveConflicts: false);
                oldCell.SetStatus("waiting");
                oldCell.sn = "";
                oldCell.ClearSN();
                return;
            }
@@ -395,9 +400,18 @@
            parent.engine.Globals.SetValString(LookupStr, 1, snrCode);
            parent.engine.CommitGlobalsToDisk(promptOnSaveConflicts: false);
            parent.nameTables[cellInfo.OvenName].GetSingleCell(cellInfo.Index).SetStatus("hadCode");
            parent.nameTables[cellInfo.OvenName].GetSingleCell(cellInfo.Index).sn = snrCode;
            Scanner.InsertNewCode(snrCode, positionCode, dutNo);
            TestResultView.nameTables[cellInfo.OvenName].GetSingleCell(cellInfo.Index).SetStatus("hadCode");
            TestResultView.nameTables[cellInfo.OvenName].GetSingleCell(cellInfo.Index).sn = snrCode;
            Scanner.InsertNewCode(snrCode, cellInfo);
            var light = $"Oven{this.index + 1}_Cell{cell.index + 1}_Light_OK";
            if (cell.LightGreen(true, out string msg))
            {
                ViewControl.Logger.Debug($"Open Light [{light}] ON.");
            }
            else
            {
                ViewControl.Logger.Debug($"Open Light [{light}] Error.{msg}");
            }
        }
@@ -536,10 +550,18 @@
        public void RefreshCount(int ok, int ng)
        {
            infoTable.UpdateNumber(infoTable.okCount + ok, infoTable.ngCount + ng);
            if (ParamSetting.ProbeByModel)
            {
            }
            else
            {
            IniFileHelper.WriteIniData($"Oven_{index}", "Pass", infoTable.okCount.ToString(),
                this.CountIniPath);
            IniFileHelper.WriteIniData($"Oven_{index}", "Fail", infoTable.ngCount.ToString(),
                this.CountIniPath);
            }
        }
        /// <summary>
@@ -595,7 +617,7 @@
                using (FileStream fs = new FileStream(filePath, FileMode.Create, FileAccess.Write))
                using (StreamWriter sw = new StreamWriter(fs, System.Text.Encoding.UTF8))
                {
                    string title = string.Join(",", detailTempratures.Keys) + ",平均值";
                    string title = string.Join(",", detailTempratures.Keys) + "," + this.lang("Tr.AvgTemp");
                    sw.WriteLine(title);
                    for (int i = 0; i < tempratures.Count; i++)
@@ -644,23 +666,45 @@
            {
                parent.SetOvenProduct(index, "");
            }
        }
        public void ClearElectricData()
        {
            foreach (var cell in cells)
            {
                cell.ClearElectricData();
                cell.RefreshProbe();
                cell.RefreshCharts();
            }
        }
        public void ClearVData()
        public void ClearCellData()
        {
            foreach (var cell in cells)
            {
                cell.ClearVData();
                cell.ClearChart();
            }
        }
        //public void ClearElectricData()
        //{
        //    foreach (var cell in cells)
        //    {
        //        cell.ClearElectricData();
        //    }
        //}
        //public void ClearVData()
        //{
        //    foreach (var cell in cells)
        //    {
        //        cell.ClearVData();
        //    }
        //}
        //public void ClearWaterData()
        //{
        //    foreach (var cell in cells)
        //    {
        //        cell.ClearWaterData();
        //    }
        //}
        private void Button_Click_1(object sender, RoutedEventArgs e)
        {
@@ -671,12 +715,42 @@
            setting.Open(true, this.title);
        }
        private void Manual_Cooler_Opt(object sender, RoutedEventArgs e)
        {
            //var btn = (Button)sender;
            //var target = CoolerStatus == 2 ? 0 : 2;
            //if (MsgBoxHelper2.WarnChoose($"确定要进行{btn.Content}吗?") == MessageBoxResult.OK)
            //{
            //    if (S7Context.WriteData("1", $"Oven{index + 1}_CoolerStatus", (ushort)target, out string msg))
            //    {
            //        CoolerStatus = (ushort)target;
            //        ToastHelper.Success("Success");
            //    }
            //    else
            //    {
            //        ToastHelper.Error($"{msg}");
            //    }
            //}
            if (parent.IsRunning)
            {
                MsgBoxHelper2.Warn(this.lang("Tr.CantOptCooler"));
                return;
            }
            var columns = mainGrid.Columns;
            var window = new CoolerStatus(this.index, columns, title + this.lang("Tr.CoolerSetting"))
            {
                Owner = Window.GetWindow(this)
            };
            window.ShowDialog();
        }
        private void ClearAllSnr_Click(object sender, RoutedEventArgs e)
        {
            var str = $"StationState.DoorClose[{index}]";
            if (parent.engine.Globals.GetValBoolean(str, 0) == true)
            {
                MsgBoxHelper.Error(Window.GetWindow(this), "程序运行中,不能清空条码");
                MsgBoxHelper.Error(Window.GetWindow(this), this.lang("Tr.CantClearSNR"));
                return;
            }
@@ -708,7 +782,7 @@
            var str = $"StationState.DoorClose[{this.index}]";
            if (parent.engine.Globals.GetValBoolean(str, 0) == true)
            {
                MsgBoxHelper.Error(Window.GetWindow(this), "程序运行中,不能清空条码");
                MsgBoxHelper.Error(Window.GetWindow(this), this.lang("Tr.CantClearSNR"));
                return;
            }
            ClearCellSN(cellIndex);
@@ -720,16 +794,16 @@
            int dutNo = this.index * this.cellCount + index;
            string LookupStr = $"StationState.SN[{dutNo}]";
            var lastSN = cell.sn;
            cell.sn = "";
            cell.SetStatus("waiting");
            parent.engine.Globals.SetValString(LookupStr, 1, "");
            parent.engine.CommitGlobalsToDisk(promptOnSaveConflicts: false);
            if (!string.IsNullOrEmpty(lastSN)) Scanner.RemoveSNR(lastSN);
            cell.ClearSN();
        }
        private void Button_Click_2(object sender, RoutedEventArgs e)
        {
            if (MsgBoxHelper.WarnMessage(Window.GetWindow(this), "确定要停止该炉位的老化测试吗?") == MessageBoxResult.OK)
            if (MsgBoxHelper.WarnMessage(Window.GetWindow(this), this.lang("Tr.MakeSureStopOvenTest", title)) == MessageBoxResult.OK)
            {
                parent.SetStartFlag(this.index, false);
            }
Plugin.TestResult/InfoTable.xaml.cs
@@ -114,7 +114,16 @@
            set
            {
                RaiseAndSetIfchanged(ref _consumeTime, value);
                RaisePropertyChanged("consumeTimeStr");
            }
        }
        private double? _leftTime;
        public double? leftTime
        {
            get => _leftTime;
            set
            {
                RaiseAndSetIfchanged(ref _leftTime, value);
            }
        }
@@ -122,9 +131,45 @@
        {
            get
            {
                if (consumeTime < 60) return $"{consumeTime.ToString("f2")}s";
                else if (consumeTime < 3600) return $"{Math.Floor(consumeTime / 60)}m{(consumeTime % 60).ToString("f2")}s";
                return $"{Math.Floor(consumeTime / 3600)}h{Math.Floor((consumeTime % 3600) / 60)}m{(consumeTime % 60).ToString("f2")}s";
                var str1 = ConvertDurtion(consumeTime);
                if (leftTime != null)
                {
                    str1 += $"/{ConvertDurtion(leftTime.Value)}";
                }
                return str1;
            }
        }
        private string ConvertDurtion(double seconds)
        {
            if (seconds <= 0)
            {
                return "0s";
            }
            if (seconds <= 60)
            {
                return $"{seconds.ToString("f2")}s";
            }
            else if (seconds <= 3600)
            {
                var min = Math.Floor(seconds / 60);
                seconds = seconds % 60;
                if (seconds > 0)
                {
                    return $"{min}m{seconds.ToString("f2")}s";
                }
                return $"{min}m";
            }
            else
            {
                var hour = Math.Floor(seconds / 3600);
                var min = Math.Floor((seconds % 3600) / 60);
                seconds = seconds % 60;
                if (seconds > 0)
                {
                    return $"{hour}h{min}m{seconds.ToString("f2")}s";
                }
                return $"{hour}h{min}m";
            }
        }
@@ -144,6 +189,13 @@
            RaisePropertyChanged("countStr");
        }
        public void UpdateConsumeTime(double consumeTime, double? leftTime)
        {
            this.consumeTime = consumeTime;
            this.leftTime = leftTime;
            RaisePropertyChanged("consumeTimeStr");
        }
        public InfoTable()
        {
            this.DataContext = this;
Plugin.TestResult/InfoWindow.xaml
@@ -23,8 +23,9 @@
    <Grid x:Name="mainGrid">
        <Grid.RowDefinitions>
            <RowDefinition Height="500"/>
            <RowDefinition Height="150"/>
            <RowDefinition Height="150"/>
            <RowDefinition Height="*"/>
            <RowDefinition Height="*"/>
            <RowDefinition Height="*"/>
            <RowDefinition Height="25"/>
        </Grid.RowDefinitions>
        <DataGrid ItemsSource="{Binding dataSource}" AutoGenerateColumns="False"
@@ -34,6 +35,9 @@
              ColumnWidth="*"
              VirtualizingStackPanel.VirtualizationMode="Standard"
              FontSize="16">
            <DataGrid.Resources>
                <Style TargetType="ScrollBar" BasedOn="{StaticResource ScrollStyle_Mobile}"/>
            </DataGrid.Resources>
            <DataGrid.Columns>
                <!--<DataGridTemplateColumn Header="#" CanUserResize="False" Width="Auto">
                    <DataGridTemplateColumn.CellTemplate>
@@ -43,22 +47,50 @@
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>-->
                <DataGridTextColumn Header="测试项" Binding="{Binding step}"/>
                <DataGridTextColumn Header="测试值" Binding="{Binding value}"/>
                <DataGridTextColumn Header="上限" Binding="{Binding limitUp}"/>
                <DataGridTextColumn Header="下限" Binding="{Binding limitDown}"/>
                <DataGridTextColumn Header="单位" Binding="{Binding unit}"/>
                <DataGridTextColumn Header="测试结果" Binding="{Binding result}"/>
                <DataGridTextColumn Header="更新时间" Binding="{Binding updateTime}"/>
                <DataGridTextColumn Binding="{Binding step}">
                    <DataGridTextColumn.Header>
                        <TextBlock Text="{DynamicResource Test.Name}"/>
                    </DataGridTextColumn.Header>
                </DataGridTextColumn>
                <DataGridTextColumn Binding="{Binding value}">
                    <DataGridTextColumn.Header>
                        <TextBlock Text="{DynamicResource Test.Value}"/>
                    </DataGridTextColumn.Header>
                </DataGridTextColumn>
                <DataGridTextColumn Binding="{Binding limitUp}">
                    <DataGridTextColumn.Header>
                        <TextBlock Text="{DynamicResource Test.LimitUp}"/>
                    </DataGridTextColumn.Header>
                </DataGridTextColumn>
                <DataGridTextColumn Binding="{Binding limitDown}">
                    <DataGridTextColumn.Header>
                        <TextBlock Text="{DynamicResource Test.LimitDown}"/>
                    </DataGridTextColumn.Header>
                </DataGridTextColumn>
                <DataGridTextColumn Binding="{Binding unit}">
                    <DataGridTextColumn.Header>
                        <TextBlock Text="{DynamicResource Test.Unit}"/>
                    </DataGridTextColumn.Header>
                </DataGridTextColumn>
                <DataGridTextColumn Binding="{Binding result}">
                    <DataGridTextColumn.Header>
                        <TextBlock Text="{DynamicResource Test.Result}"/>
                    </DataGridTextColumn.Header>
                </DataGridTextColumn>
                <DataGridTextColumn Binding="{Binding updateTime}">
                    <DataGridTextColumn.Header>
                        <TextBlock Text="{DynamicResource Test.TestTime}"/>
                    </DataGridTextColumn.Header>
                </DataGridTextColumn>
            </DataGrid.Columns>
        </DataGrid>
        <Grid Background="#f1eded" Grid.Row="3">
        <Grid Background="#f1eded" Grid.Row="4">
            <DockPanel>
                <StackPanel DockPanel.Dock="Right" Orientation="Horizontal" Margin="0,0,30,0">
                    <Label Padding="0" FontSize="12" 
VerticalAlignment="Center"
VerticalContentAlignment="Center" Content="探针使用次数:"/>
VerticalContentAlignment="Center" Content="{DynamicResource Ts.ProbeCount}"/>
                    <Label Padding="0" FontSize="12"  Margin="0,0,15,0"
VerticalAlignment="Center"
VerticalContentAlignment="Center" Content="{Binding ProbeCount}"/>
@@ -66,7 +98,7 @@
                    <Label x:Name="alarmLabel" Padding="0" FontSize="12" 
VerticalAlignment="Center"
VerticalContentAlignment="Center" Content="预警次数:"/>
VerticalContentAlignment="Center" Content="{DynamicResource Ts.ProbeAlarmCount}"/>
                    <Label x:Name="alarmValue" Padding="0" FontSize="12" 
VerticalAlignment="Center"
VerticalContentAlignment="Center" Content="{Binding ProbeWarn}"/>
@@ -76,7 +108,7 @@
                <Label x:Name="probeCountAlarm" Visibility="Collapsed" DockPanel.Dock="Left" Padding="30,0" FontSize="12" Foreground="Red"
VerticalAlignment="Center"
VerticalContentAlignment="Center" Content="探针使用已达到预警次数,请注意!"/>
VerticalContentAlignment="Center" Content="{DynamicResource Ts.ProbeAlarm}"/>
            </DockPanel>
        </Grid>
    </Grid>
Plugin.TestResult/InfoWindow.xaml.cs
@@ -1,14 +1,9 @@
using HMI.Core.Api;
using HMI.Core.Entity;
using HMI.Core.Manager;
using HMI.Core.Util;
using HMI.Core.Util;
using HMI.UI.Util;
using Panuon.WPF.UI;
using Plugin.TestResult_WPF.Model;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
@@ -34,46 +29,72 @@
            get => _dataSource == null ? new ObservableCollection<Info>() : _dataSource;
            set => Set(ref _dataSource, value);
        }
        private Chart electricChart;
        private Chart vChart;
        public InfoWindow(string title, ObservableCollection<Info> infos, Chart electricChart, Chart vChart, int probeCount)
        private LiveChart waterChart;
        private LiveChart electricChart;
        private LiveChart vChart;
        //public InfoWindow(string title, ObservableCollection<Info> infos, Chart waterChart, Chart electricChart, Chart vChart, int probeCount, int probeWarn)
        //{
        //    this.title = title;
        //    this.dataSource = infos;
        //    DataContext = this;
        //    Topmost = false;
        //    this.ProbeWarn = probeWarn;
        //    InitializeComponent();
        //    UpdateProbeCount(probeCount,probeWarn);
        //    if (waterChart != null)
        //    {
        //        this.waterChart = waterChart;
        //        mainGrid.Children.Add(waterChart);
        //        Grid.SetRow(waterChart, 1);
        //    }
        //    this.electricChart = electricChart;
        //    mainGrid.Children.Add(electricChart);
        //    Grid.SetRow(electricChart, 2);
        //    this.vChart = vChart;
        //    mainGrid.Children.Add(vChart);
        //    Grid.SetRow(vChart, 3);
        //}
        public InfoWindow(string title, ObservableCollection<Info> infos, LiveChart[] charts, int probeCount, int probeWarn)
        {
            this.title = title;
            this.dataSource = infos;
            DataContext = this;
            Topmost = false;
            this.ProbeWarn = probeWarn;
            InitializeComponent();
            if (AlarmProbeCount < 0)
            UpdateProbeCount(probeCount, probeWarn);
            int row = 1;
            foreach (var chart in charts)
            {
                alarmLabel.Visibility = Visibility.Collapsed;
                alarmValue.Visibility = Visibility.Collapsed;
            }
            UpdateProbeCount(probeCount);
            this.electricChart = electricChart;
            mainGrid.Children.Add(electricChart);
            Grid.SetRow(electricChart, 1);
            this.vChart = vChart;
            mainGrid.Children.Add(vChart);
            Grid.SetRow(vChart, 2);
                if (chart == null) return;
                mainGrid.Children.Add(chart);
                Grid.SetRow(chart, row++);
        }
        private static int AlarmProbeCount;
        static InfoWindow()
        {
            int probeWarn = -1;
            try
            {
                probeWarn = Convert.ToInt32(ParameterManager.GetCommonParameter<List<ParameterData>>()
                    .FirstOrDefault(x => x.Name == "ProbeWarn")?.Value);
            }
            catch (Exception ex)
            {
                probeWarn = -1;
            }
            AlarmProbeCount = probeWarn;
            //if (waterChart != null)
            //{
            //    this.waterChart = waterChart;
            //    mainGrid.Children.Add(waterChart);
            //    Grid.SetRow(waterChart, 1);
            //}
            //this.electricChart = electricChart;
            //mainGrid.Children.Add(electricChart);
            //Grid.SetRow(electricChart, 2);
            //this.vChart = vChart;
            //mainGrid.Children.Add(vChart);
            //Grid.SetRow(vChart, 3);
        }
        public event EventHandler ClearProbeCountEvent;
@@ -90,21 +111,28 @@
        public int ProbeWarn
        {
            get => AlarmProbeCount;
            set { }
            get;
            set;
        }
        public void UpdateProbeCount(int count)
        public void UpdateProbeCount(int count, int warn)
        {
            Dispatcher.Invoke(() =>
            {
                ProbeCount = count;
                if (AlarmProbeCount >= 0)
                ProbeWarn = warn;
                if (ProbeWarn < 0)
                {
                    probeCountAlarm.Visibility = (ProbeCount >= AlarmProbeCount) ? Visibility.Visible : Visibility.Collapsed;
                    alarmLabel.Visibility = Visibility.Collapsed;
                    alarmValue.Visibility = Visibility.Collapsed;
                }
                else
                {
                    probeCountAlarm.Visibility = (ProbeCount >= ProbeWarn) ? Visibility.Visible : Visibility.Collapsed;
                }
            });
        }
        public void UpdateSource(ObservableCollection<Info> infos)
        {
@@ -123,6 +151,7 @@
        protected override void OnClosed(EventArgs e)
        {
            waterChart = null;
            electricChart = null;
            vChart = null;
            mainGrid.Children.Clear();
@@ -139,7 +168,7 @@
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            if (MsgBoxHelper.WarnMessage(this, "确定要清空探针使用次数吗?") == MessageBoxResult.OK)
            if (MsgBoxHelper.WarnMessage(this, this.lang("Ts.MakeSureToClearProbeCount")) == MessageBoxResult.OK)
            {
                ClearProbeCountEvent?.Invoke(this, null);
            }
Plugin.TestResult/LiveChart.xaml
New file
@@ -0,0 +1,30 @@
<hb:NotifyControl x:Class="Plugin.TestResult_WPF.LiveChart"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:local="clr-namespace:Plugin.TestResult_WPF"
             xmlns:ScottPlot="clr-namespace:ScottPlot.WPF;assembly=ScottPlot.WPF"
             mc:Ignorable="d"
             xmlns:hb="clr-namespace:HMI.Base;assembly=HMI.Base"
             xmlns:lvc="clr-namespace:LiveChartsCore.SkiaSharpView.WPF;assembly=LiveChartsCore.SkiaSharpView.WPF"
             Loaded="UserControl_Loaded"
             Unloaded="UserControl_Unloaded"
             SizeChanged="UserControl_SizeChanged"
             d:DesignHeight="450" d:DesignWidth="800">
    <Grid>
        <lvc:CartesianChart Series="{Binding Series}" BorderThickness="1" BorderBrush="Black"
                            Padding="0"
                            Margin="2"
                            SyncContext="{Binding Sync}"
                            XAxes="{Binding XAxes}"
                            YAxes="{Binding YAxes}"
                            TooltipTextPaint="{Binding TooltipTextPaint}"
                            TooltipTextSize="{Binding TooltipTextSize}"
                            DrawMarginFrame="{Binding DrawMarginFrame}"
                            x:Name="chart">
        </lvc:CartesianChart>
    </Grid>
</hb:NotifyControl>
Plugin.TestResult/LiveChart.xaml.cs
New file
@@ -0,0 +1,519 @@
using HMI.Base;
using LiveChartsCore;
using LiveChartsCore.Defaults;
using LiveChartsCore.Drawing;
using LiveChartsCore.Drawing.Layouts;
using LiveChartsCore.Kernel.Sketches;
using LiveChartsCore.SkiaSharpView;
using LiveChartsCore.SkiaSharpView.Drawing;
using LiveChartsCore.SkiaSharpView.Drawing.Geometries;
using LiveChartsCore.SkiaSharpView.Drawing.Layouts;
using LiveChartsCore.SkiaSharpView.Painting;
using LiveChartsCore.SkiaSharpView.SKCharts;
using SkiaSharp;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
namespace Plugin.TestResult_WPF
{
    public class SeriesConfig
    {
        public static readonly float FontSize = 12;
        /// <summary>
        /// æ•°æ®å
        /// </summary>
        public string Name { get; set; }
        public string YAxesName { get; set; }
        public int YAxesIndex { get; set; }
    }
    public class CustomLegend : SKDefaultLegend
    {
        protected override Layout<SkiaSharpDrawingContext> GetLayout(LiveChartsCore.Chart chart)
        {
            var stackLayout = new StackLayout
            {
                Orientation = ContainerOrientation.Horizontal,
                Padding = new Padding(0, 10, 0, 0),
                HorizontalAlignment = Align.Start,
                VerticalAlignment = Align.Middle,
            };
            foreach (var series in chart.Series.Where(x => x.IsVisibleAtLegend))
            {
                stackLayout.Children.Add(new LegendItem(series));
            }
            return stackLayout;
        }
    }
    public class LegendItem : StackLayout
    {
        public LegendItem(ISeries series)
        {
            Orientation = ContainerOrientation.Horizontal;
            Padding = new Padding(0);
            VerticalAlignment = Align.Start;
            HorizontalAlignment = Align.Middle;
            Opacity = series.IsVisible ? 1 : 0.5f;
            var miniature = (IDrawnElement<SkiaSharpDrawingContext>)series.GetMiniatureGeometry(null);
            Children = new List<IDrawnElement<SkiaSharpDrawingContext>> {
                miniature,
            new LabelGeometry
            {
                Text = series.Name,
                TextSize = SeriesConfig.FontSize,
                Paint = new SolidColorPaint(SKColors.Black){
                    SKTypeface = SKFontManager.Default.MatchCharacter('汉')
                },
                Padding = new Padding(5,0,10,0),
                VerticalAlign = Align.Middle,
                HorizontalAlign = Align.Start
            }};
        }
    }
    public partial class LiveChart : NotifyControl
    {
        private static SKColor[] colors = new SKColor[] {
            //new SKColor(229, 84, 62),
            //new SKColor(72, 143, 239),
            //new SKColor(147, 196, 83),
            new SKColor(255, 0, 0),
            new SKColor(0, 0, 255),
            new SKColor(0, 255, 0),
            new SKColor(76, 184, 210),
            new SKColor(246, 198, 50),
        };
        private DateTime startTime;
        private string configText;
        private bool showLegend;
        private bool enableResize;
        private SolidColorPaint tooltipTextPaint = new SolidColorPaint(SKColors.Black)
        {
            SKTypeface = SKFontManager.Default.MatchCharacter('汉')
        };
        public SolidColorPaint TooltipTextPaint
        {
            get => tooltipTextPaint;
            set
            {
                Set(ref tooltipTextPaint, value);
            }
        }
        private double tooltipTextSize = SeriesConfig.FontSize;
        public double TooltipTextSize
        {
            get => tooltipTextSize;
            set
            {
                Set(ref tooltipTextSize, value);
            }
        }
        private Dictionary<string, SeriesConfig> configCache = new Dictionary<string, SeriesConfig>();
        private Dictionary<string, ISeries> seriesCache = new Dictionary<string, ISeries>();
        private Dictionary<string, List<DateTimePoint>> valueCache = new Dictionary<string, List<DateTimePoint>>();
        private Dictionary<string, double> minValueCache = new Dictionary<string, double>();
        private Dictionary<string, double> maxValueCache = new Dictionary<string, double>();
        private ObservableCollection<ISeries> series = new ObservableCollection<ISeries>();
        public ObservableCollection<ISeries> Series
        {
            get => series;
            set
            {
                Set(ref series, value);
            }
        }
        public ObservableCollection<ICartesianAxis> YAxes { get; set; } = new ObservableCollection<ICartesianAxis>();
        private Axis[] xAxes;
        public Axis[] XAxes
        {
            get => xAxes; set
            {
                Set(ref xAxes, value);
            }
        }
        public DrawMarginFrame DrawMarginFrame => new DrawMarginFrame()
        {
            Fill = new SolidColorPaint(new SKColor(223, 223, 223)),
            Stroke = new SolidColorPaint(new SKColor(180, 180, 180), 1)
        };
        public object Sync { get; } = new object();
        private int CreateYAxis(string name)
        {
            for (int i = 0; i < YAxes.Count; i++)
            {
                if (YAxes[i].Name == name)
                {
                    return i;
                }
            }
            if (YAxes.Count == 0)
            {
                YAxes.Add(new Axis
                {
                    Name = name,
                    MinStep = 1,
                    TextSize = SeriesConfig.FontSize,
                    NameTextSize = SeriesConfig.FontSize,
                    NamePaint = new SolidColorPaint(new SKColor(0, 0, 0))
                    {
                        SKTypeface = SKFontManager.Default.MatchCharacter('汉')
                    },
                    Padding = new Padding(0, 0, 5, 0),
                    LabelsPaint = new SolidColorPaint(new SKColor(0, 0, 0)),
                    SeparatorsPaint = new SolidColorPaint
                    {
                        Color = SKColors.Black.WithAlpha(30),
                        StrokeThickness = 0.5f
                    },
                    TicksPaint = new SolidColorPaint
                    {
                        Color = SKColor.Empty,
                        StrokeThickness = 0
                    },
                });
            }
            else
            {
                YAxes.Add(new Axis
                {
                    Name = name,
                    Position = LiveChartsCore.Measure.AxisPosition.End,
                    MinStep = 1,
                    TextSize = SeriesConfig.FontSize,
                    NameTextSize = SeriesConfig.FontSize,
                    NamePaint = new SolidColorPaint(new SKColor(0, 0, 0))
                    {
                        SKTypeface = SKFontManager.Default.MatchCharacter('汉')
                    },
                    Padding = new Padding(5, 0, 0, 0),
                    LabelsPaint = new SolidColorPaint(new SKColor(0, 0, 0)),
                    TicksPaint = new SolidColorPaint
                    {
                        Color = SKColor.Empty,
                        StrokeThickness = 0
                    },
                    ShowSeparatorLines = false,
                });
            }
            return YAxes.Count - 1;
        }
        public void RefreshConfig(string configStr)
        {
            configText = configStr;
            configCache.Clear();
            seriesCache.Clear();
            valueCache.Clear();
            minValueCache.Clear();
            maxValueCache.Clear();
            Series.Clear();
            YAxes.Clear();
            startTime = DateTime.MinValue;
            try
            {
                string[] arr = configStr.Split(';');
                for (int i = 0; i < arr.Length; i++)
                {
                    var config = arr[i];
                    string[] datas = config.Split(',');
                    var sConfig = new SeriesConfig();
                    if (datas.Length >= 2)
                    {
                        sConfig.YAxesName = datas[1];
                    }
                    else
                    {
                        sConfig.YAxesName = datas[0];
                    }
                    sConfig.Name = datas[0];
                    sConfig.YAxesIndex = CreateYAxis(sConfig.YAxesName);
                    if (!string.IsNullOrEmpty(sConfig.Name))
                    {
                        configCache[sConfig.Name] = sConfig;
                        var values = new List<DateTimePoint>();
                        valueCache[sConfig.Name] = values;
                        var ls = new LineSeries<DateTimePoint>
                        {
                            Name = sConfig.Name,
                            Values = values,
                            ScalesYAt = sConfig.YAxesIndex,
                            Fill = null,
                            GeometryFill = null,
                            GeometryStroke = null,
                            LineSmoothness = 0,
                            Stroke = new SolidColorPaint(GetColor(i)) { StrokeThickness = 0.8f },
                        };
                        seriesCache[sConfig.Name] = ls;
                        Series.Add(ls);
                    }
                }
                if (showLegend)
                {
                    chart.LegendPosition = LiveChartsCore.Measure.LegendPosition.Top;
                    chart.Legend = new CustomLegend();
                }
                chart.TooltipTextPaint = new SolidColorPaint(SKColors.Black)
                {
                    SKTypeface = SKFontManager.Default.MatchCharacter('汉')
                };
            }
            catch (Exception ex)
            {
            }
        }
        public LiveChart(string configStr, bool showLegend = true, bool enableResize = false)
        {
            DataContext = this;
            this.showLegend = showLegend;
            this.enableResize = enableResize;
            var xAxis = new DateTimeAxis(TimeSpan.FromSeconds(10), Formatter)
            {
                Padding = new Padding(0),
                TextSize = SeriesConfig.FontSize,
                NameTextSize = SeriesConfig.FontSize,
                CustomSeparators = GetSeparators(),
                AnimationsSpeed = TimeSpan.FromMilliseconds(0),
                SeparatorsPaint = new SolidColorPaint(SKColors.Black.WithAlpha(30)),
            };
            XAxes = new Axis[] { xAxis };
            InitializeComponent();
            RefreshConfig(configStr);
        }
        private double[] GetSeparators()
        {
            if (valueCache.Count <= 0)
            {
                return new double[] { DateTime.Now.Ticks };
            }
            if (valueCache.Values.First().Count <= 5)
            {
                //return new double[] { now.Ticks };
                return valueCache.Values.First().Select(e => (double)e.DateTime.Ticks).ToArray();
            }
            var now = valueCache.Values.First().Last().DateTime;
            var step = (now - startTime).TotalSeconds / 6;
            return
            new double[] {
                now.AddSeconds(-5*step).Ticks,
                now.AddSeconds(-4*step).Ticks,
                now.AddSeconds(-3*step).Ticks,
                now.AddSeconds(-2*step).Ticks,
                now.AddSeconds(-step).Ticks,
            };
        }
        private static string Formatter(DateTime date)
        {
            //var secsAgo = (DateTime.Now - date).TotalSeconds;
            //return secsAgo < 1
            //    ? "now"
            //    : $"{secsAgo:N0}s ago";
            return date.ToString("HH:mm:ss");
        }
        private void RefreshChart()
        {
            XAxes[0].CustomSeparators = GetSeparators();
        }
        private double GetMaxByName(string name)
        {
            return maxValueCache.ContainsKey(name) ? maxValueCache[name] : double.MinValue;
        }
        private double GetMinByName(string name)
        {
            return minValueCache.ContainsKey(name) ? minValueCache[name] : double.MaxValue;
        }
        //public void AddData(string name, double value)
        //{
        //    var now = DateTime.Now;
        //    if (valueCache.ContainsKey(name))
        //    {
        //        var config = configCache[name];
        //        valueCache[name].Add(new DateTimePoint(now, value));
        //        minValueCache[config.YAxesName] = Math.Min(GetMinByName(config.YAxesName), value);
        //        maxValueCache[config.YAxesName] = Math.Max(GetMaxByName(config.YAxesName), value);
        //        YAxes[config.YAxesIndex].MinLimit = minValueCache[config.YAxesName] - 1;
        //        YAxes[config.YAxesIndex].MaxLimit = maxValueCache[config.YAxesName] + 1;
        //        RefreshChart();
        //    }
        //    if (startTime == DateTime.MinValue)
        //    {
        //        startTime = now;
        //    }
        //}
        private SKColor GetColor(int index)
        {
            if (index >= colors.Length)
            {
                return colors[index % colors.Length];
            }
            return colors[index];
        }
        private void AddNewSeries(string name, string YName)
        {
            var config = new SeriesConfig
            {
                Name = name,
                YAxesName = YName,
                YAxesIndex = CreateYAxis(YName)
            };
            configCache[name] = config;
            var values = new List<DateTimePoint>();
            valueCache[name] = values;
            var ls = new LineSeries<DateTimePoint>
            {
                Name = name,
                Values = values,
                ScalesYAt = config.YAxesIndex,
                Fill = null,
                GeometryFill = null,
                GeometryStroke = null,
                LineSmoothness = 0,
                Stroke = new SolidColorPaint(GetColor(Series.Count)) { StrokeThickness = 0.8f },
            };
            seriesCache[Name] = ls;
            Series.Add(ls);
        }
        public void AddDynamicData(string name, string YName, DateTime now, double value)
        {
            if (!valueCache.ContainsKey(name))
            {
                AddNewSeries(name, YName);
            }
            var config = configCache[name];
            valueCache[name].Add(new DateTimePoint(now, value));
            minValueCache[config.YAxesName] = Math.Min(GetMinByName(config.YAxesName), value);
            maxValueCache[config.YAxesName] = Math.Max(GetMaxByName(config.YAxesName), value);
            YAxes[config.YAxesIndex].MinLimit = minValueCache[config.YAxesName] - 1;
            YAxes[config.YAxesIndex].MaxLimit = maxValueCache[config.YAxesName] + 1;
            RefreshChart();
            if (startTime == DateTime.MinValue)
            {
                startTime = now;
            }
        }
        public void AddData(string name, DateTime now, double value)
        {
            if (valueCache.ContainsKey(name))
            {
                var config = configCache[name];
                valueCache[name].Add(new DateTimePoint(now, value));
                minValueCache[config.YAxesName] = Math.Min(GetMinByName(config.YAxesName), value);
                maxValueCache[config.YAxesName] = Math.Max(GetMaxByName(config.YAxesName), value);
                YAxes[config.YAxesIndex].MinLimit = minValueCache[config.YAxesName] - 1;
                YAxes[config.YAxesIndex].MaxLimit = maxValueCache[config.YAxesName] + 1;
                RefreshChart();
            }
            if (startTime == DateTime.MinValue)
            {
                startTime = now;
            }
        }
        public void Clear()
        {
            RefreshConfig(configText);
        }
        public bool CanHandle(string name)
        {
            return configCache.ContainsKey(name);
        }
        public List<double> GetSingleData(string name)
        {
            if (valueCache.ContainsKey(name))
            {
                return valueCache[name].Select(d => d.Value.Value).ToList();
            }
            return null;
        }
        private void UserControl_Loaded(object sender, System.Windows.RoutedEventArgs e)
        {
            //refreshTimer.Start();
            //timer?.Start();
        }
        private void UserControl_Unloaded(object sender, System.Windows.RoutedEventArgs e)
        {
            //timer?.Stop();
        }
        private void UserControl_SizeChanged(object sender, System.Windows.SizeChangedEventArgs e)
        {
            if (enableResize)
            {
                var size = FontSizeConverter.CountFontSize(12, ActualHeight, 92);
                foreach (var y in YAxes)
                {
                    y.TextSize = size;
                    y.NameTextSize = size;
                }
                foreach (var x in XAxes)
                {
                    x.TextSize = size;
                    x.NameTextSize = size;
                }
                TooltipTextSize = size;
                //TooltipTextPaint = new SolidColorPaint(SKColors.Black)
                //{
                //    SKTypeface = SKFontManager.Default.MatchCharacter('汉')
                //};
            }
        }
    }
}
Plugin.TestResult/Model/BaseConfig.cs
@@ -1,4 +1,7 @@
using System.Collections;
using HMI.Core.Entity;
using HMI.Core.Manager;
using System;
using System.Collections;
using System.Configuration;
using System.Runtime.CompilerServices;
@@ -7,6 +10,12 @@
    public class BaseConfig
    {
        private static Hashtable customConfig = (Hashtable)ConfigurationManager.GetSection("TestResultConfig");
        private string GetValue([CallerMemberName] string propertyName = null)
        {
            return (customConfig != null && customConfig.ContainsKey(propertyName)) ? customConfig[propertyName].ToString() : null;
        }
        /// <summary>
        /// é¦–页布局行数
        /// </summary>
@@ -18,11 +27,10 @@
                var data = GetValue();
                return data == null ? row : int.Parse(data);
            }
        }
        private string GetValue([CallerMemberName] string propertyName = null)
            set
        {
            return (customConfig != null && customConfig.ContainsKey(propertyName)) ? customConfig[propertyName].ToString() : null;
                customConfig[nameof(Row)] = value;
            }
        }
        /// <summary>
@@ -35,6 +43,10 @@
            {
                var data = GetValue();
                return data == null ? column : int.Parse(data);
            }
            set
            {
                customConfig[nameof(Column)] = value;
            }
        }
@@ -49,6 +61,10 @@
                var data = GetValue();
                return data == null ? cellCount : int.Parse(data);
            }
            set
            {
                customConfig[nameof(CellCount)] = value;
            }
        }
        /// <summary>
@@ -61,6 +77,10 @@
            {
                var data = GetValue();
                return data == null ? positionColumn : int.Parse(data);
            }
            set
            {
                customConfig[nameof(PositionColumn)] = value;
            }
        }
@@ -75,6 +95,10 @@
                var data = GetValue();
                return data == null ? positionCount : int.Parse(data);
            }
            set
            {
                customConfig[nameof(PositionCount)] = value;
            }
        }
        /// <summary>
@@ -87,6 +111,10 @@
            {
                var data = GetValue();
                return data == null ? maxSize : int.Parse(data);
            }
            set
            {
                customConfig[nameof(MaxSize)] = value;
            }
        }
@@ -101,6 +129,10 @@
                var data = GetValue();
                return data == null ? refreshInterval : int.Parse(data);
            }
            set
            {
                customConfig[nameof(RefreshInterval)] = value;
            }
        }
        /// <summary>
@@ -114,31 +146,9 @@
                var data = GetValue();
                return data == null ? nameStr : data;
            }
        }
        /// <summary>
        /// é»˜è®¤å±•示的图表标题
        /// </summary>
        private string mainChartTitle = "平均温度";
        public string MainChartTitle
            set
        {
            get
            {
                var data = GetValue();
                return data == null ? mainChartTitle : data;
            }
        }
        /// <summary>
        /// åŒå‡»æ‰“开的详细图表标题
        /// </summary>
        private string detailChartTitle = "详细温度";
        public string DetailChartTitle
        {
            get
            {
                var data = GetValue();
                return data == null ? detailChartTitle : data;
                customConfig[nameof(NameStr)] = value;
            }
        }
@@ -153,6 +163,10 @@
                var data = GetValue();
                return data == null ? cellListMaxSize : int.Parse(data);
            }
            set
            {
                customConfig[nameof(CellListMaxSize)] = value;
            }
        }
        private int portStart = 6660;
@@ -163,6 +177,10 @@
                var data = GetValue();
                return data == null ? portStart : int.Parse(data);
            }
            set
            {
                customConfig[nameof(PortStart)] = value;
            }
        }
        private string codeParserType;
Plugin.TestResult/Model/CellInfo.cs
@@ -2,8 +2,16 @@
{
    public class CellInfo
    {
        public string OriginCode { get; set; }
        public string MachineName { get; set; }
        /// <summary>
        /// ç‚‰å
        /// </summary>
        public string OvenName { get; set; }
        /// <summary>
        /// ç©´ä½ä¸‹æ ‡
        /// </summary>
        public int Index { get; set; }
        public string LookUpStr { get; set; }
    }
}
Plugin.TestResult/Plugin.TestResult.csproj
@@ -76,8 +76,23 @@
    <Reference Include="HarfBuzzSharp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756, processorArchitecture=MSIL">
      <HintPath>..\WPFProject\packages\HarfBuzzSharp.7.3.0.3\lib\net462\HarfBuzzSharp.dll</HintPath>
    </Reference>
    <Reference Include="HslCommunication">
      <HintPath>..\Libs\HslCommunication.dll</HintPath>
    </Reference>
    <Reference Include="LiveChartsCore, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc92a3e13d40c573, processorArchitecture=MSIL">
      <HintPath>..\WPFProject\packages\LiveChartsCore.2.0.0-rc5.4\lib\net462\LiveChartsCore.dll</HintPath>
    </Reference>
    <Reference Include="LiveChartsCore.SkiaSharpView, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc92a3e13d40c573, processorArchitecture=MSIL">
      <HintPath>..\WPFProject\packages\LiveChartsCore.SkiaSharpView.2.0.0-rc5.4\lib\net462\LiveChartsCore.SkiaSharpView.dll</HintPath>
    </Reference>
    <Reference Include="LiveChartsCore.SkiaSharpView.WPF, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc92a3e13d40c573, processorArchitecture=MSIL">
      <HintPath>..\WPFProject\packages\LiveChartsCore.SkiaSharpView.WPF.2.0.0-rc5.4\lib\net462\LiveChartsCore.SkiaSharpView.WPF.dll</HintPath>
    </Reference>
    <Reference Include="log4net, Version=3.0.4.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a, processorArchitecture=MSIL">
      <HintPath>..\WPFProject\packages\log4net.3.0.4\lib\net462\log4net.dll</HintPath>
    </Reference>
    <Reference Include="Microsoft.Bcl.AsyncInterfaces, Version=8.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
      <HintPath>..\WPFProject\packages\Microsoft.Bcl.AsyncInterfaces.8.0.0\lib\net462\Microsoft.Bcl.AsyncInterfaces.dll</HintPath>
    </Reference>
    <Reference Include="NationalInstruments.TestStand.Interop.API, Version=20.0.0.49158, Culture=neutral, PublicKeyToken=ad9244eb3b825cd8, processorArchitecture=MSIL">
      <SpecificVersion>False</SpecificVersion>
@@ -87,10 +102,6 @@
    <Reference Include="NationalInstruments.TestStand.Interop.UI.AxControls, Version=20.0.0.49158, Culture=neutral, PublicKeyToken=ad9244eb3b825cd8, processorArchitecture=MSIL">
      <SpecificVersion>False</SpecificVersion>
      <HintPath>..\Libs\NationalInstruments.TestStand.Interop.UI.AxControls.dll</HintPath>
    </Reference>
    <Reference Include="NationalInstruments.TestStand.Utility, Version=25.0.0.49152, Culture=neutral, processorArchitecture=AMD64">
      <SpecificVersion>False</SpecificVersion>
      <HintPath>..\..\..\..\Program Files\National Instruments\TestStand 2020\API\DotNET\Assemblies\CurrentVersion\NationalInstruments.TestStand.Utility.dll</HintPath>
    </Reference>
    <Reference Include="OpenTK, Version=3.3.1.0, Culture=neutral, PublicKeyToken=bad199fe84eb3df4, processorArchitecture=MSIL">
      <HintPath>..\WPFProject\packages\OpenTK.3.3.1\lib\net20\OpenTK.dll</HintPath>
@@ -149,8 +160,17 @@
    <Reference Include="System.Numerics.Vectors, Version=4.1.4.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
      <HintPath>..\WPFProject\packages\System.Numerics.Vectors.4.5.0\lib\net46\System.Numerics.Vectors.dll</HintPath>
    </Reference>
    <Reference Include="System.Runtime.CompilerServices.Unsafe, Version=4.0.4.1, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
      <HintPath>..\WPFProject\packages\System.Runtime.CompilerServices.Unsafe.4.5.3\lib\net461\System.Runtime.CompilerServices.Unsafe.dll</HintPath>
    <Reference Include="System.Runtime.CompilerServices.Unsafe, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
      <HintPath>..\WPFProject\packages\System.Runtime.CompilerServices.Unsafe.6.0.0\lib\net461\System.Runtime.CompilerServices.Unsafe.dll</HintPath>
    </Reference>
    <Reference Include="System.Text.Encodings.Web, Version=8.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
      <HintPath>..\WPFProject\packages\System.Text.Encodings.Web.8.0.0\lib\net462\System.Text.Encodings.Web.dll</HintPath>
    </Reference>
    <Reference Include="System.Text.Json, Version=8.0.0.5, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
      <HintPath>..\WPFProject\packages\System.Text.Json.8.0.5\lib\net462\System.Text.Json.dll</HintPath>
    </Reference>
    <Reference Include="System.Threading.Tasks.Extensions, Version=4.2.0.1, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
      <HintPath>..\WPFProject\packages\System.Threading.Tasks.Extensions.4.5.4\lib\net461\System.Threading.Tasks.Extensions.dll</HintPath>
    </Reference>
    <Reference Include="System.ValueTuple, Version=4.0.3.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
      <HintPath>..\WPFProject\packages\System.ValueTuple.4.5.0\lib\net47\System.ValueTuple.dll</HintPath>
@@ -172,10 +192,20 @@
    <Reference Include="WindowsFormsIntegration" />
  </ItemGroup>
  <ItemGroup>
    <Compile Include="LiveChart.xaml.cs">
      <DependentUpon>LiveChart.xaml</DependentUpon>
    </Compile>
    <Compile Include="ChartWindow.xaml.cs">
      <DependentUpon>ChartWindow.xaml</DependentUpon>
    </Compile>
    <Compile Include="Constant\CommonConstant.cs" />
    <Compile Include="Cooler.xaml.cs">
      <DependentUpon>Cooler.xaml</DependentUpon>
    </Compile>
    <Compile Include="CoolerStatus.xaml.cs">
      <DependentUpon>CoolerStatus.xaml</DependentUpon>
    </Compile>
    <Compile Include="CSVPrinter.cs" />
    <Compile Include="Model\BaseConfig.cs" />
    <Compile Include="Model\CellInfo.cs" />
    <Compile Include="Model\Info.cs" />
@@ -187,6 +217,10 @@
    <Compile Include="ScannerSetting.xaml.cs">
      <DependentUpon>ScannerSetting.xaml</DependentUpon>
    </Compile>
    <Compile Include="Util\ModelCodeParser.cs" />
    <Compile Include="Util\PNUtil.cs" />
    <Compile Include="Util\RunTimeVariablePool.cs" />
    <Compile Include="Util\ScannerParser.cs" />
    <Compile Include="Util\ICodeParser.cs" />
    <Compile Include="Util\JKCodeParser.cs" />
    <Compile Include="Util\CommonCodeParser.cs" />
@@ -194,11 +228,23 @@
    <Compile Include="ViewControl.xaml.cs">
      <DependentUpon>ViewControl.xaml</DependentUpon>
    </Compile>
    <Page Include="LiveChart.xaml">
      <Generator>MSBuild:Compile</Generator>
      <SubType>Designer</SubType>
    </Page>
    <Page Include="Chart.xaml">
      <SubType>Designer</SubType>
      <Generator>MSBuild:Compile</Generator>
    </Page>
    <Page Include="ChartWindow.xaml">
      <SubType>Designer</SubType>
      <Generator>MSBuild:Compile</Generator>
    </Page>
    <Page Include="Cooler.xaml">
      <SubType>Designer</SubType>
      <Generator>MSBuild:Compile</Generator>
    </Page>
    <Page Include="CoolerStatus.xaml">
      <SubType>Designer</SubType>
      <Generator>MSBuild:Compile</Generator>
    </Page>
@@ -275,6 +321,7 @@
      <Generator>ResXFileCodeGenerator</Generator>
      <LastGenOutput>Resources.Designer.cs</LastGenOutput>
    </EmbeddedResource>
    <None Include="app.config" />
    <None Include="Config\log4net.config" />
    <None Include="Config\log4net.unix.config" />
    <None Include="packages.config" />
@@ -327,6 +374,10 @@
      <Project>{AFEA100A-9223-448D-AB10-3015D93DD98C}</Project>
      <Name>HMI.Util</Name>
    </ProjectReference>
    <ProjectReference Include="..\PLCHelper\PLCHelper.csproj">
      <Project>{c3f17e03-ef05-4203-8d29-3ad984f3bd9c}</Project>
      <Name>PLCHelper</Name>
    </ProjectReference>
    <ProjectReference Include="..\Plugin.TsSupport\Plugin.TsSupport.csproj">
      <Project>{3068124e-f12b-473e-99a0-2da5a0385d05}</Project>
      <Name>Plugin.TsSupport</Name>
Plugin.TestResult/Scanner.xaml
@@ -15,7 +15,7 @@
        xmlns:pu="https://opensource.panuon.com/wpf-ui"
        xmlns:dp="clr-namespace:HMI.UI.DpUtil;assembly=HMI.UI"
        xmlns:cc="clr-namespace:HMI.Core;assembly=HMI.Core"
        InteropOwnersMask="True"
        InteropOwnersMask="False"
        SizeToContent="Height"
        pu:WindowXModalDialog.Buttons="{x:Null}"
        Title="{Binding title}" Width="600">
Plugin.TestResult/Scanner.xaml.cs
@@ -1,9 +1,12 @@
using HMI.Core.Util;
using HMI.UI.MDI;
using HMI.Core.Manager;
using HMI.Core.Setting;
using HMI.Core.Util;
using HMI.UI.Util;
using HMI.Util;
using Panuon.WPF.UI;
using Plugin.TestResult.Model;
using Plugin.TestResult.Util;
using Plugin.TestResult_WPF.Model;
using System;
using System.Collections.Generic;
using System.ComponentModel;
@@ -18,16 +21,14 @@
        public string name { get; private set; }
        public string positionCode { get; private set; }
        public string snrCode { get; private set; }
        public string oldPosition { get; private set; }
        public int oldIndex { get; private set; }
        public CellInfo lastInfo { get; private set; }
        public BarcodeEventArg(string name, string positionCode, string snrCode, string oldPosition, int oldIndex)
        public BarcodeEventArg(string name, string positionCode, string snrCode, CellInfo lastInfo)
        {
            this.name = name;
            this.positionCode = positionCode;
            this.snrCode = snrCode;
            this.oldPosition = oldPosition;
            this.oldIndex = oldIndex;
            this.lastInfo = lastInfo;
        }
    }
@@ -47,14 +48,21 @@
        public event EventHandler<BarcodeEventArg> FinishBarcode;
        public event EventHandler<RoutedEventArgs> ComplateClick;
        private static Dictionary<string, string> snrCache = new Dictionary<string, string>();
        private static Dictionary<string, int> snrIndex = new Dictionary<string, int>();
        private DataTable dataTable;
        private static Dictionary<string, CellInfo> snrCache = new Dictionary<string, CellInfo>();
        SerialPort serialPort;
        public Scanner(string title)
        private string model;
        private int columns;
        private int rows;
        private int ovenIndex;
        private CellInfo targetCellInfo;
        public Scanner(int index, string title, string model, int columns, int rows)
        {
            this.ovenIndex = index;
            this.title = title;
            this.model = model;
            this.columns = columns;
            this.rows = rows;
            this.DataContext = this;
            InitializeComponent();
            Loaded += Scanner_Loaded;
@@ -62,8 +70,16 @@
        private void Scanner_Loaded(object sender, RoutedEventArgs e)
        {
            try
            {
            InitScanner();
            Loaded -= Scanner_Loaded;
            }
            catch (Exception ex)
            {
                ViewControl.Logger.Error("Open Scanner Window Error.", ex);
                MsgBoxHelper.Error(this, $"{ex.Message}");
            }
        }
        /// <summary>
@@ -127,7 +143,7 @@
            try
            {
                SerialPort sp = (SerialPort)sender;
                string barcode = ReadDataFrom(sp);
                string barcode = ReadDataFrom(sp).Trim();
                //string barcode = 
                Dispatcher.Invoke(() =>
@@ -139,10 +155,24 @@
                    }
                    else
                    {
                        try
                        {
                            this.targetCellInfo = ScannerParser.GetCellInfoByCode(this.model, this.columns, this.rows, barcode);
                            if (!TestResultView.nameTables.ContainsKey(targetCellInfo.OvenName))
                            {
                                MsgBoxHelper2.Error($"老化炉 [{targetCellInfo.OvenName}] ä¸å­˜åœ¨ï¼Œè¯·æ£€æŸ¥é…ç½®");
                                return;
                            }
                        positionText.Text = barcode;
                        //positionText.Focus();
                        //snrText.Text = "";
                        snrText.Focus();
                        }
                        catch (Exception ex)
                        {
                            ViewControl.Logger.Error("Parse Position Code Error.", ex);
                            MsgBoxHelper2.Error($"穴位号 [{barcode}] è§£æžå¤±è´¥: {ex.Message}");
                        }
                    }
                });
            }
@@ -153,31 +183,28 @@
            }
        }
        public static void InsertNewCode(string snr, string position, int index)
        public static void InsertNewCode(string snr, CellInfo info)
        {
            snrCache[snr] = position;
            snrIndex[snr] = index;
            snrCache[snr] = info;
        }
        public static void RemoveSNR(string snr)
        {
            snrCache.Remove(snr);
            snrIndex.Remove(snr);
        }
        private void SendCode(string tag, string position, string snr)
        {
            if (snrCache.ContainsKey(snr))
            {
                var oldPosition = snrCache[snr];
                string oldPosition = snrCache[snr].OriginCode;
                if (MsgBoxHelper2.WarnChoose($"条码[{snr}]已放置于[{oldPosition}]中,是否清除?") == MessageBoxResult.OK)
                {
                    try
                    {
                        FinishBarcode.Invoke(this, new BarcodeEventArg(tag, position, null, oldPosition, snrIndex[snr]));
                        FinishBarcode.Invoke(this, new BarcodeEventArg(tag, position, null, snrCache[snr]));
                        snrCache.Remove(snr);
                        snrIndex.Remove(snr);
                        FinishBarcode.Invoke(this, new BarcodeEventArg(tag, position, snr, null, -1));
                        FinishBarcode.Invoke(this, new BarcodeEventArg(tag, position, snr, null));
                    }
                    catch (Exception ex)
                    {
@@ -187,7 +214,7 @@
            }
            else
            {
                FinishBarcode.Invoke(this, new BarcodeEventArg(tag, position, snr, null, -1));
                FinishBarcode.Invoke(this, new BarcodeEventArg(tag, position, snr, null));
            }
        }
@@ -196,6 +223,46 @@
            Dispatcher.Invoke(() =>
            {
                string position = positionText.Text, snr = snrText.Text;
                try
                {
                    var EnableMes = ParameterManager.GetCommonParameterByName<bool>("EnableMes", false);
                    if (ParamSetting.CustomerCode == "LIXUN" && EnableMes)
                    {
                        if (PNUtil.GetPN(ParamSetting.MesAddress, snr, out string pn, out string msg))
                        {
                            var table = TestResultView.tables[this.ovenIndex];
                            string currentPn = table.CbProduct.Text;
                            if (pn != currentPn)
                            {
                                TestResultView.tables[this.ovenIndex].GetSingleCell(targetCellInfo.Index).LightRed(true, out _);
                                MsgBoxHelper2.Error($"当前测试料号为 [{currentPn}],扫码产品料号为 [{pn}] ä¸å…è®¸æµ‹è¯•");
                                snrText.Text = string.Empty;
                                snrText.Focus();
                                return;
                            }
                        }
                        else
                        {
                            TestResultView.tables[this.ovenIndex].GetSingleCell(targetCellInfo.Index).LightRed(true, out _);
                            MsgBoxHelper2.Error($"检查产品条码异常:{msg}");
                            snrText.Text = string.Empty;
                            snrText.Focus();
                            return;
                        }
                    }
                    //var _ = ScannerParser.GetCellInfoByCode(this.model, this.columns, this.rows, snr);
                    //ToastHelper.Warning(this, "产品码格式异常");
                    //snrText.Text = string.Empty;
                    //snrText.Focus();
                    //return;
                }
                catch (Exception ex)
                {
                    ViewControl.Logger.Error("Scanner Check Error.", ex);
                    MsgBoxHelper2.Error($"扫码检查异常:{ex.Message}");
                    return;
                }
                if (string.IsNullOrEmpty(position) || string.IsNullOrEmpty(snr))
                {
                    ToastHelper.Warning(this, this.lang("Tr.PleaseInputSnrs"));
@@ -264,7 +331,8 @@
        {
            try
            {
                serialPort.Close();
                targetCellInfo = null;
                serialPort.Dispose();
                serialPort = null;
            }
            catch (Exception ex)
@@ -285,7 +353,41 @@
                    }
                    else
                    {
                        if (ParamSetting.CustomerCode != "LIXUN")
                        {
                        snrText.Focus();
                            return;
                        }
                        string barcode = positionText.Text;
                        try
                        {
                            targetCellInfo = ScannerParser.GetCellInfoByCode(this.model, this.columns, this.rows, barcode);
                            if (!TestResultView.nameTables.ContainsKey(targetCellInfo.OvenName))
                            {
                                MsgBoxHelper2.Error($"老化炉 [{targetCellInfo.OvenName}] ä¸å­˜åœ¨ï¼Œè¯·æ£€æŸ¥é…ç½®");
                                positionText.Text = string.Empty;
                                positionText.Focus();
                                targetCellInfo = null;
                                return;
                            }
                            var oven = TestResultView.nameTables[targetCellInfo.OvenName];
                            if (oven.cells.Length < targetCellInfo.Index + 1)
                            {
                                MsgBoxHelper2.Error($"穴位下标 [{targetCellInfo.Index}] è¶…出索引");
                                positionText.Text = string.Empty;
                                positionText.Focus();
                                targetCellInfo = null;
                                return;
                            }
                            snrText.Focus();
                        }
                        catch (Exception ex)
                        {
                            positionText.Text = string.Empty;
                            positionText.Focus();
                            ViewControl.Logger.Error("Parse Position Code Error.", ex);
                            MsgBoxHelper2.Error($"穴位号 [{barcode}] è§£æžå¤±è´¥: {ex.Message}");
                        }
                    }
                });
            }
Plugin.TestResult/SingleCell.xaml
@@ -22,7 +22,8 @@
    <UserControl.ContextMenu>
        <ContextMenu>
            <!--<MenuItem IsCheckable="True" IsChecked="{Binding CellIsDisabled,Mode=TwoWay}"  Header="禁用"/>-->
            <MenuItem IsCheckable="False" x:Name="clearSNRItem" Click="MenuItem_Click" Header="清除条码"/>
            <MenuItem IsCheckable="False" x:Name="clearSNRItem" Click="MenuItem_Click" Header="{DynamicResource Tr.ClearSNR}"/>
            <MenuItem IsCheckable="False" x:Name="exportCSVItem" Click="MenuItem_Click" Header="{DynamicResource App.ExportCSV}"/>
        </ContextMenu>
    </UserControl.ContextMenu>
@@ -72,7 +73,7 @@
            <ColumnDefinition Width="Auto"/>
        </Grid.ColumnDefinitions>
        <StackPanel Orientation="Horizontal" Background="LightGray" Grid.Row="1" Grid.Column="1" VerticalAlignment="Top"  HorizontalAlignment="Right">
            <TextBlock Foreground="Red" Text="探针预警">
            <TextBlock Foreground="Red" Text="{DynamicResource Ts.ProbeAlarm}">
                <TextBlock.Style>
                    <Style TargetType="TextBlock">
                        <Setter Property="Visibility" Value="Collapsed"/>
@@ -87,7 +88,7 @@
            <TextBlock Margin="0">
                <Run Text="{Binding ProbeCount}"/>
                <Run Text="/"/>
                <Run Text="{Binding probeWarn}"/>
                <Run Text="{Binding ProbeWarn}"/>
            </TextBlock>
        </StackPanel>
        <Label Grid.Row="0" Grid.Column="0" HorizontalContentAlignment="Left" VerticalContentAlignment="Top" Padding="0" Margin="5,5,0,0" 
Plugin.TestResult/SingleCell.xaml.cs
@@ -1,7 +1,11 @@
using HMI.Core.Manager;
using CSVHelper;
using HMI.Core.Entity;
using HMI.Core.Manager;
using HMI.Core.Setting;
using HMI.Core.Util;
using HMI.UI.Util;
using HMI.Util;
using PLCHelper;
using Plugin.TestResult.Util;
using Plugin.TestResult_WPF.Constant;
using Plugin.TestResult_WPF.Model;
using System;
@@ -38,40 +42,12 @@
        }
        #endregion
        private static readonly HashSet<string> IgnoreTestItem = new HashSet<string> {
            "产品条码","checkin","预检电流","precheckresult","checkout",
        };
        private InfoWindow window;
        private int maxSize;
        private static string dataLogPath;
        private static int ProbeWarn;
        static SingleCell()
        {
            try
            {
                var value = ParameterManager.GetCommonParameterByName("TS_DataLogPath");
                dataLogPath = value?.Value ?? Path.Combine(PathHelper.ConfigFolder, "DataBoard");
            }
            catch
            {
                dataLogPath = Path.Combine(PathHelper.ConfigFolder, "DataBoard");
            }
            try
            {
                var value = ParameterManager.GetCommonParameterByName("ProbeWarn");
                ProbeWarn = value != null ? int.Parse(value.Value) : 1000;
            }
            catch
            {
                ProbeWarn = 1000;
            }
        }
        public SingleCell()
        {
            DataContext = this;
            InitializeComponent();
        }
        private DataTable table;
@@ -82,10 +58,79 @@
            this.index = index;
            this.maxSize = maxSize;
            this.countIniPath = iniFile;
            this.probeWarn = ProbeWarn;
            DataContext = this;
            InitializeComponent();
            LoadProbeCount();
            RefreshProbe();
        }
        public void RefreshProbe()
        {
            try
            {
                string key = string.Empty;
                ParameterData value;
                if (ParamSetting.ProbeByModel)
                {
                    string model = table.CbProduct?.SelectedItem?.ToString();
                    key = $"{title}_{model}";
                    value = ProductManager.GetParameterByProductAndName(model, "ProbeWarn");
                    if (value == null)
                    {
                        value = ParameterManager.GetCommonParameterByName("ProbeWarn");
                    }
                    ProbeWarn = value != null ? int.Parse(value.Value) : 1000;
                }
                else
                {
                    key = $"{title}";
                    value = ParameterManager.GetCommonParameterByName("ProbeWarn");
                    ProbeWarn = value != null ? int.Parse(value.Value) : 1000;
                }
                string temp = IniFileHelper.ReadIniData(key, "ProbeCount", "0", countIniPath);
                int count = Convert.ToInt32(temp);
                ProbeCount = count;
            }
            catch
            {
                ProbeWarn = 1000;
            }
            if (window != null) window.UpdateProbeCount(ProbeCount, ProbeWarn);
        }
        public void RefreshCharts()
        {
            charts = new LiveChart[3];
            try
            {
                ParameterData value;
                string model = table.CbProduct?.SelectedItem?.ToString();
                for (int i = 0; i < charts.Length; i++)
                {
                    value = ProductManager.GetParameterByProductAndName(model, $"ChartConfig_{i}");
                    if (value == null)
                    {
                        value = ParameterManager.GetCommonParameterByName($"ChartConfig_{i}");
                    }
                    var config = value != null ? value.Value : null;
                    if (string.IsNullOrEmpty(config))
                    {
                        charts[i] = null;
                    }
                    else
                    {
                        charts[i] = new LiveChart(config) //new string[] { "温度(℃)", "流量(L/m)" }
                        {
                            MinHeight = 120
                        };
                    }
                }
            }
            catch
            {
                charts = new LiveChart[0];
            }
        }
        private string _sn;
@@ -133,7 +178,7 @@
        }
        private int _probeWarn;
        public int probeWarn
        public int ProbeWarn
        {
            get => _probeWarn;
            set
@@ -193,7 +238,7 @@
            set
            {
                RaiseAndSetIfchanged(ref probeCount, value);
                probeAlarm = value >= probeWarn;
                probeAlarm = value >= ProbeWarn;
            }
        }
@@ -207,28 +252,24 @@
            }
        }
        public void LoadProbeCount()
        {
            string temp = IniFileHelper.ReadIniData($"{title}", "ProbeCount", "", countIniPath);
            if (!string.IsNullOrEmpty(temp))
            {
                int count = Convert.ToInt32(temp);
                ProbeCount = count;
            }
        }
        private void UpdateProbeCount(int count)
        {
            ProbeCount = count;
            IniFileHelper.WriteIniData($"{title}", "ProbeCount", ProbeCount.ToString(), countIniPath);
            if (window != null) window.UpdateProbeCount(ProbeCount);
            string key = $"{title}";
            if (ParamSetting.ProbeByModel)
            {
                string model = table?.CbProduct?.SelectedItem?.ToString();
                key = $"{title}_{model}";
            }
            IniFileHelper.WriteIniData(key, "ProbeCount", ProbeCount.ToString(), countIniPath);
            if (window != null) window.UpdateProbeCount(ProbeCount, ProbeWarn);
        }
        private void UserControl_MouseDoubleClick(object sender, MouseButtonEventArgs e)
        {
            if (window == null)
            {
                window = new InfoWindow(title, infos, electricChart, vChart, ProbeCount);
                window = new InfoWindow(title, infos, charts, ProbeCount, ProbeWarn);
                window.Closed += Window_Closed;
                window.ClearProbeCountEvent += Window_ClearProbeCountEvent;
                window.Owner = Window.GetWindow(this);
@@ -250,6 +291,9 @@
            this.window = null;
        }
        private string visualTestId;
        private Sqlite3Helper helper;
        public void SetStatus(string status)
        {
            var oldStatus = this.status;
@@ -257,12 +301,83 @@
            if (oldStatus != "testing" && status == "testing")
            {
                UpdateProbeCount(ProbeCount + 1);
                var now = DateTime.Now;
                string dateStr = now.ToString("yyyyMMdd");
                visualTestId = $"{title}_{now.ToString("yyyyMMddHHmmssfff")}";
                helper = CheckSqlHelper(dateStr);
            }
            if (oldStatus != "ok" && status == "ok")
            {
                SaveInfoToDB();
            }
            if (oldStatus != "ng" && status == "ng")
            {
                SaveInfoToDB();
            }
        }
        public void WriteCSV(Info info)
        {
            try
            {
                if (ParamSetting.CustomerCode != "LIXUN")
                {
                    return;
                }
                string fileName = this.sn?.Replace("/", "#")?.Replace("\\", "#") + ".csv";
                string dir = Path.Combine(ParamSetting.DataLogFolder, "csv", this.title);
                string title = $"{this.lang("Test.Name")},{this.lang("Test.Value")},{this.lang("Test.LimitDown")},{this.lang("Test.LimitUp")},{this.lang("Test.Unit")},{this.lang("Test.Result")},{this.lang("Test.TestTime")}";
                string line = $"{info.step},{info.value},{info.limitDown},{info.limitUp},{info.unit},{info.result},{info.updateTime}";
                CSVPrinter.Print(dir, fileName, title, line);
                // ReverseCSV(Path.Combine(dir, fileName));
            }
            catch (Exception ex)
            {
            }
        }
        public void SendToChart(Info info)
        {
            try
            {
                foreach (var chart in charts)
                {
                    if (chart?.CanHandle(info.step) == true)
                    {
                        chart.AddData(info.step, DateTime.Parse(info.updateTime), double.Parse(info.value));
                    }
                }
                //if (electricChart.CanHandle(info.step))
                //{
                //    electricChart.AddData(info.step, DateTime.Parse(info.updateTime), double.Parse(info.value));
                //}
                //if (vChart.CanHandle(info.step))
                //{
                //    vChart.AddData(info.step, DateTime.Parse(info.updateTime), double.Parse(info.value));
                //}
                //if (waterChart?.CanHandle(info.step) == true)
                //{
                //    waterChart?.AddData(info.step, DateTime.Parse(info.updateTime), double.Parse(info.value));
                //}
            }
            catch (Exception ex)
            {
            }
        }
        public void SetInfos(Info info)
        {
            string sql = string.Empty;
            try
            {
            allInfos.Add(info);
                SendToChart(info);
                WriteCSV(info);
            if (queue.Count >= maxSize)
            {
                queue.TryDequeue(out var first);
@@ -287,7 +402,37 @@
                        this.infos.Add(info);
                    });
                }
                return;
                }
                Dispatcher.Invoke(() =>
                {
                    string dateStr = string.Empty;
                    try
                    {
                        dateStr = DateTime.Parse(info.updateTime).ToString("yyyy-MM-dd HH:mm:ss");
                    }
                    catch
                    {
                        dateStr = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                    }
                    try
                    {
                        string model = table?.CbProduct?.SelectedItem?.ToString();
                        sql = $@"INSERT INTO serialData (sn,model,station,position,step,limitDown,limitUp,unit,value,status,finalStatus,time,resultId)
VALUES ('{sn}','{model}','','{this.title}','{info.step}','{info.limitDown}','{info.limitUp}','{info.unit}','{info.value}','{info.result}',
NULL,'{dateStr}','{visualTestId}');";
                        helper.Execute(sql);
                    }
                    catch (Exception ex)
                    {
                        ViewControl.Logger.Error($"Save DB Test Data Error. {sql}", ex);
                    }
                });
            }
            catch (Exception ex)
            {
                ViewControl.Logger.Error($"Add Test Data Error. {sql}", ex);
            }
        }
@@ -300,41 +445,80 @@
            if (window != null) window.UpdateSource(this.infos);
        }
        private Chart electricChart = new Chart("电流曲线(A)", false, 20)
        //private Chart waterChart = null;
        //private Chart electricChart = new Chart(LangUtil.Get("Tr.CurrentChart"), false, 20)
        //{
        //    Height = 120
        //};
        //private Chart vChart = new Chart(LangUtil.Get("Tr.VoltChart"), false, 20)
        //{
        //    Height = 120
        //};
        private LiveChart[] charts = new LiveChart[0];
        //private LiveChart waterChart = null;
        //private LiveChart electricChart = new LiveChart("子板电流,电流(A);母板电流,电流(A)") //new string[] { "子板电流", "模板电流" }
        //{
        //    MinHeight = 120
        //};
        //private LiveChart vChart = new LiveChart("子板电压,电压(V);母板电压,电压(V)") //new string[] { "子板电压", "模板电压" }
        //{
        //    MinHeight = 120
        //};
        public void AddWaterData(double temp, double backTemp, double pressure)
        {
            Height = 150
        };
            //waterChart?.AddData(0, "水箱温度", temp);
            //waterChart?.AddData(0, "回水温度", backTemp);
            //waterChart?.AddData(1, "流量", pressure);
            //waterChart?.AddData("水箱温度", temp);
            //waterChart?.AddData("回水温度", backTemp);
            //waterChart?.AddData("流量", pressure);
        }
        public void AddElectricData(double data)
        {
            electricChart.AddData(data);
            //electricChart.AddData("", data);
        }
        public void ClearElectricData()
        {
            electricChart.Clear();
        }
        private Chart vChart = new Chart("电压曲线(V)", false, 20)
        {
            Height = 150
        };
        public void AddVData(double data)
        {
            vChart.AddData(data);
            //vChart.AddData("", data);
        }
        public void ClearVData()
        public void ClearChart()
        {
            vChart.Clear();
            foreach (var chart in charts)
            {
                chart?.Clear();
        }
        }
        //public void ClearWaterData()
        //{
        //    waterChart?.Clear();
        //}
        //public void ClearElectricData()
        //{
        //    electricChart.Clear();
        //}
        //public void ClearVData()
        //{
        //    vChart.Clear();
        //}
        public void SaveElectricDataToCSV(string filePath)
        {
            try
            {
                List<double> datas = electricChart?.GetSingleData();
                List<double> datas = charts[1]?.GetSingleData("");
                FileInfo fi = new FileInfo(filePath);
                if (!fi.Directory.Exists)
@@ -345,7 +529,7 @@
                using (FileStream fs = new FileStream(filePath, FileMode.Create, FileAccess.Write))
                using (StreamWriter sw = new StreamWriter(fs, System.Text.Encoding.UTF8))
                {
                    string title = "电流数据(A)";
                    string title = this.lang("Tr.CurrentChart");
                    sw.WriteLine(title);
                    if (datas != null)
                    {
@@ -366,7 +550,7 @@
        {
            try
            {
                List<double> datas = vChart?.GetSingleData();
                List<double> datas = charts[2]?.GetSingleData("");
                FileInfo fi = new FileInfo(filePath);
                if (!fi.Directory.Exists)
@@ -377,7 +561,7 @@
                using (FileStream fs = new FileStream(filePath, FileMode.Create, FileAccess.Write))
                using (StreamWriter sw = new StreamWriter(fs, System.Text.Encoding.UTF8))
                {
                    string title = "电压数据(V)";
                    string title = this.lang("Tr.VoltChart");
                    sw.WriteLine(title);
                    if (datas != null)
                    {
@@ -394,11 +578,7 @@
            }
        }
        /// <summary>
        /// ä¿å­˜æµ‹è¯•数据到CSV
        /// </summary>
        /// <param name="filePath"></param>
        public void SaveInfoToCSV(string filePath)
        private void NormalCSV(string filePath)
        {
            try
            {
@@ -411,7 +591,7 @@
                using (FileStream fs = new FileStream(filePath, FileMode.Create, FileAccess.Write))
                using (StreamWriter sw = new StreamWriter(fs, System.Text.Encoding.UTF8))
                {
                    string title = "测试项,测试值,下限,上限,单位,结果,测试时间";
                    string title = $"{this.lang("Test.Name")},{this.lang("Test.Value")},{this.lang("Test.LimitDown")},{this.lang("Test.LimitUp")},{this.lang("Test.Unit")},{this.lang("Test.Result")},{this.lang("Test.TestTime")}";
                    sw.WriteLine(title);
                    foreach (var info in allInfos)
                    {
@@ -426,16 +606,165 @@
            }
        }
        private SqliteHelper CheckSqlHelper()
        private void ReverseCSV(string filePath)
        {
            string today = DateTime.Now.ToString("yyyyMMdd");
            string dbPath = Path.Combine(dataLogPath, $"Data_{today}.db");
            try
            {
                if (allInfos == null || allInfos.Count < 4) return;
                Dictionary<string, int> columnMap = new Dictionary<string, int>();
                int colPoint = 0;
                List<string> titleRow = new List<string>();
                List<string[]> datas = new List<string[]>();
                void AddTitle(string title)
                {
                    if (titleRow.IndexOf(title) < 0)
                    {
                        titleRow.Add(title);
                    }
                }
                // å…ˆè®¾ç½®è¡¨å¤´
                for (int row = 0; row < allInfos.Count; row++)
                {
                    var info = allInfos[row];
                    if (IgnoreTestItem.Contains(info.step.ToLower()))
                    {
                        continue;
                    }
                    string title = $"{info.step}{(string.IsNullOrEmpty(info.unit) ? "" : $"({info.unit})")}";
                    AddTitle("测试时间");
                    AddTitle(title);
                    if (!string.IsNullOrEmpty(info.limitDown))
                    {
                        string key2 = $"{info.step}下限";
                        AddTitle(key2);
                    }
                    if (!string.IsNullOrEmpty(info.limitUp))
                    {
                        string key2 = $"{info.step}上限";
                        AddTitle(key2);
                    }
                    if (!string.IsNullOrEmpty(info.limitUp))
                    {
                        string key2 = $"{info.step}测试结果";
                        AddTitle(key2);
                    }
                    //if (!string.IsNullOrEmpty(info.updateTime))
                    //{
                    //    string key2 = $"{info.step}测试时间";
                    //    AddTitle(key2);
                    //}
                }
                int rowPoint = -1;
                for (int row = 0; row < allInfos.Count; row++)
                {
                    var info = allInfos[row];
                    if (IgnoreTestItem.Contains(info.step.ToLower()))
                    {
                        continue;
                    }
                    string title = $"{info.step}{(string.IsNullOrEmpty(info.unit) ? "" : $"({info.unit})")}";
                    int col = titleRow.IndexOf(title);
                    if (col == 1)
                    {
                        rowPoint++;
                    }
                    if (datas.Count <= rowPoint)
                    {
                        datas.Add(new string[titleRow.Count]);
                    }
                    var arr = datas[rowPoint];
                    arr[col] = info.value;
                    if (!string.IsNullOrEmpty(info.limitDown))
                    {
                        string key2 = $"{info.step}下限";
                        int col2 = titleRow.IndexOf(key2);
                        arr[col2] = info.limitDown;
                    }
                    if (!string.IsNullOrEmpty(info.limitUp))
                    {
                        string key2 = $"{info.step}上限";
                        int col2 = titleRow.IndexOf(key2);
                        arr[col2] = info.limitUp;
                    }
                    if (!string.IsNullOrEmpty(info.limitUp))
                    {
                        string key2 = $"{info.step}测试结果";
                        int col2 = titleRow.IndexOf(key2);
                        arr[col2] = info.result;
                    }
                    if (!string.IsNullOrEmpty(info.updateTime))
                    {
                        string key2 = "测试时间";// $"{info.step}测试时间";
                        int col2 = titleRow.IndexOf(key2);
                        arr[col2] = info.updateTime;
                    }
                }
                FileInfo fi = new FileInfo(filePath);
                if (!fi.Directory.Exists)
                {
                    fi.Directory.Create();  //文件不存在,创建文件
                }
                using (FileStream fs = new FileStream(filePath, FileMode.Create, FileAccess.Write))
                using (StreamWriter sw = new StreamWriter(fs, System.Text.Encoding.UTF8))
                {
                    string title = string.Join(",", titleRow);
                    sw.WriteLine(title);
                    foreach (var info in datas)
                    {
                        string row = string.Join(",", info);
                        sw.WriteLine(row);
                    }
                }
            }
            catch (Exception ex)
            {
                ViewControl.Logger.Error($"Cell[{title}] SaveInfoToCSV Error.", ex);
            }
        }
        /// <summary>
        /// ä¿å­˜æµ‹è¯•数据到CSV
        /// </summary>
        /// <param name="filePath"></param>
        public void SaveInfoToCSV(string filePath)
        {
            if (ParamSetting.ReverseCSV)
            {
                ReverseCSV(filePath);
            }
            else
            {
                NormalCSV(filePath);
            }
        }
        private Sqlite3Helper CheckSqlHelper(string dateStr = null)
        {
            dateStr = string.IsNullOrEmpty(dateStr) ? DateTime.Now.ToString("yyyyMMdd") : dateStr;
            string dbPath = Path.Combine(ParamSetting.DataLogFolder, $"Data_{dateStr}.db");
            if (!File.Exists(dbPath))
            {
                SqliteHelper.CreateDatabase(dbPath);
                Sqlite3Helper.CreateDatabase(dbPath);
            }
            var sqliteHelper = new SqliteHelper(dbPath);
            sqliteHelper.ExecuteSql(@"CREATE TABLE IF NOT EXISTS serialData (
            var sqliteHelper = new Sqlite3Helper(dbPath);
            sqliteHelper.Execute(@"CREATE TABLE IF NOT EXISTS serialData (
                    id INTEGER PRIMARY KEY AUTOINCREMENT,
                    sn TEXT NOT NULL,
                    model TEXT,
@@ -451,8 +780,9 @@
                    finalStatus TEXT,
                    consumeTime TEXT, 
                    totalConsumeTime TEXT, 
                    resultId TEXT,
                    time DATETIME NOT NULL);");
            sqliteHelper.ExecuteSql(@"CREATE TABLE IF NOT EXISTS testResult (
            sqliteHelper.Execute(@"CREATE TABLE IF NOT EXISTS testResult (
                    id INTEGER PRIMARY KEY AUTOINCREMENT,
                    sn TEXT NOT NULL,
                    model TEXT,
@@ -460,7 +790,16 @@
                    position TEXT,
                    status TEXT,
                    result TEXT NOT NULL, 
                    resultId TEXT,
                    time DATETIME NOT NULL);");
            if (!sqliteHelper.HasData("SELECT 1 FROM pragma_table_info('serialData') WHERE name = 'resultId';"))
            {
                sqliteHelper.Execute("ALTER TABLE serialData ADD resultId TEXT;");
            }
            if (!sqliteHelper.HasData("SELECT 1 FROM pragma_table_info('testResult') WHERE name = 'resultId';"))
            {
                sqliteHelper.Execute("ALTER TABLE testResult ADD resultId TEXT;");
            }
            return sqliteHelper;
        }
@@ -470,26 +809,34 @@
        /// <param name="filePath"></param>
        public void SaveInfoToDB()
        {
            Dispatcher.BeginInvoke(new Action(() =>
            {
            try
            {
                using (var helper = CheckSqlHelper())
                {
                    List<string> sqls = new List<string>();
                    var timestr = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                    foreach (var info in allInfos)
                    {
                        string sql = $@"INSERT INTO serialData (sn,station,step,limitDown,limitUp,unit,value,status,finalStatus,time)
VALUES ('{sn}','','{info.step}','{info.limitDown}','{info.limitUp}','{info.unit}','{info.value}','{info.result}','{this.status}','{timestr}');";
                        sqls.Add(sql);
                    }
                    sqls.Add($"INSERT INTO testResult (sn,station,position,result,time) VALUES ('{sn}','','{title}','{this.status}','{timestr}');");
                    helper.ExecuteBatchSql(sqls);
                }
                    var sql = $"INSERT INTO testResult (sn,station,position,result,time,resultId) VALUES ('{sn}','','{title}','{this.status}','{timestr}','{visualTestId}');";
                    helper.Execute(sql);
                    helper.Dispose();
                    helper = null;
                    //                using (var helper = CheckSqlHelper())
                    //                {
                    //                    List<string> sqls = new List<string>();
                    //                    var timestr = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                    //                    foreach (var info in allInfos)
                    //                    {
                    //                        string sql = $@"INSERT INTO serialData (sn,station,step,limitDown,limitUp,unit,value,status,finalStatus,time)
                    //VALUES ('{sn}','','{info.step}','{info.limitDown}','{info.limitUp}','{info.unit}','{info.value}','{info.result}','{this.status}','{timestr}');";
                    //                        sqls.Add(sql);
                    //                    }
                    //                    sqls.Add($"INSERT INTO testResult (sn,station,position,result,time) VALUES ('{sn}','','{title}','{this.status}','{timestr}');");
                    //                    helper.ExecuteBatchSql(sqls);
                    //                }
            }
            catch (Exception ex)
            {
                ViewControl.Logger.Error($"Cell[{title}] SaveToDB Error.", ex);
            }
            }));
        }
        private void MenuItem_Click(object sender, RoutedEventArgs e)
@@ -500,9 +847,43 @@
                case "clearSNRItem":
                    table.TryClearCellSN(this.index);
                    break;
                case "exportCSVItem":
                    TryExportCSV();
                    break;
                default:
                    break;
            }
        }
        private void TryExportCSV()
        {
            System.Windows.Forms.SaveFileDialog sfd = new System.Windows.Forms.SaveFileDialog
            {
                Filter = "CSV (*.csv)|*.csv"
            };
            if (sfd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                this.SaveInfoToCSV(sfd.FileName);
            }
        }
        public void ClearSN()
        {
            sn = string.Empty;
            LightGreen(false, out _);
            LightRed(false, out _);
        }
        public bool LightGreen(bool on, out string msg)
        {
            return S7Context.WriteData(RunTimeVariablePool.DEFAULT_PLC_NAME,
                $"Oven{table.index + 1}_Cell{index + 1}_Light_OK", on, out msg);
        }
        public bool LightRed(bool on, out string msg)
        {
            return S7Context.WriteData(RunTimeVariablePool.DEFAULT_PLC_NAME,
                $"Oven{table.index + 1}_Cell{index + 1}_Light_NG", on, out msg);
        }
    }
}
Plugin.TestResult/TestResultView.xaml.cs
@@ -1,8 +1,9 @@
using HMI.Core.Util;
using HMI.Core.Entity;
using HMI.Core.Manager;
using HMI.Core.Util;
using HMI.UI.Util;
using NationalInstruments.TestStand.Interop.API;
using NationalInstruments.TestStand.Interop.UI.Ax;
using NationalInstruments.TestStand.Utility;
using Plugin.TestResult_WPF.Model;
using Plugin.TsSupport;
using System;
@@ -20,11 +21,13 @@
        private int rowCount;
        private int colCount;
        private int cellCount;
        private DataTable[] tables;
        public Dictionary<string, DataTable> nameTables { get; private set; }
        public static DataTable[] tables { get; private set; }
        public static Dictionary<string, DataTable> nameTables { get; private set; } = new Dictionary<string, DataTable>();
        private readonly BaseConfig config;
        public AxApplicationMgr testApp;
        public string testModelFile;
        public string testSeqFile;
        /// <summary>
        /// æµ‹è¯•序列
@@ -48,8 +51,73 @@
        public bool IsRunning { get; set; } = false;
        public void RefreshCooler()
        {
        }
        private void RefreshNumberConfig(BaseConfig config)
        {
            ParameterData value = null;
            try
            {
                value = ParameterManager.GetCommonParameterByName("BurnInOvenCount");
                string[] datas = value.Value.Trim().Split(',');
                config.Row = int.Parse(datas[0]);
                config.Column = int.Parse(datas[1]);
            }
            catch (Exception ex)
            {
            }
            try
            {
                value = ParameterManager.GetCommonParameterByName("BurnInOvenName");
                config.NameStr = value.Value;
            }
            catch (Exception ex)
            {
            }
            try
            {
                value = ParameterManager.GetCommonParameterByName("BurnInOvenPort");
                config.PortStart = int.Parse(value.Value);
            }
            catch (Exception ex)
            {
            }
            try
            {
                value = ParameterManager.GetCommonParameterByName("BurnInCellCount");
                string[] datas = value.Value.Trim().Split(',');
                config.PositionColumn = int.Parse(datas[0]);
                config.PositionCount = int.Parse(datas[1]);
            }
            catch (Exception ex)
            {
            }
        }
        public TestResultView(BaseConfig config)
        {
            try
            {
                var value = ParameterManager.GetCommonParameterByName("TsModelPath");
                testModelFile = value?.Value ?? @"C:\Users\Public\Documents\National Instruments\TestStand 2020 (64-bit)\Components\Models\ParallelModel.seq";
            }
            catch
            {
                //@"C:\Program Files\National Instruments\TestStand 2020\Components\Models\TestStandModels\ParallelModel.seq"
                testModelFile = @"C:\Users\Public\Documents\National Instruments\TestStand 2020 (64-bit)\Components\Models\ParallelModel.seq";
            }
            RefreshNumberConfig(config);
            this.rowCount = config.Row;
            this.colCount = config.Column;
            this.config = config;
@@ -83,6 +151,9 @@
        {
        }
        /// <summary>
        /// æŽ¢é’ˆè®¡æ•°é…ç½®è·¯å¾„
        /// </summary>
        private string CountIniPath;
        public void SetCountIniPath(string countIniPath)
        {
@@ -137,7 +208,7 @@
                this.testApp.IsEditor = true;
                this.testApp.LoginOnStart = false;
                this.testApp.Start();
                this.modeSeq = this.engine.GetSequenceFileEx(@"C:\Program Files\National Instruments\TestStand 2020\Components\Models\TestStandModels\ParallelModel.seq");
                this.modeSeq = this.engine.GetSequenceFileEx(testModelFile);
            }
            catch (Exception ex)
            {
@@ -186,7 +257,7 @@
        private void axApplicationMgr_ExitApplication(object sender, EventArgs e)
        {
            Environment.ExitCode = testApp.ExitCode;
            TSHelper.DoSynchronousGCForCOMObjectDestruction();
            //TSHelper.DoSynchronousGCForCOMObjectDestruction();
        }
        private void axApplicationMgr_ExecutionClosed(object sender, _ApplicationMgrEvents_ExecutionClosedEvent e)
@@ -249,13 +320,19 @@
                    strData = e.uiMsg.StringData;
                    string[] datas_10014 = strData.Split(';');
                    int ovenIndex = int.Parse(datas_10014[0]);
                    string startTime = datas_10014[1];
                    string consumeTime = datas_10014[2];
                    string planEndTime = datas_10014[3];
                    tables[ovenIndex].SetStartTime(startTime);
                    tables[ovenIndex].SetConsumeTime(double.Parse(consumeTime));
                    tables[ovenIndex].SetEndTime(planEndTime);
                    double? leftTime = null;
                    /// ä¸ºäº†å…¼å®¹æ—§ç‰ˆæœ¬ï¼Œå¦‚果有剩余时间就传,没有就传null
                    if (datas_10014.Length >= 5)
                    {
                        leftTime = double.Parse(datas_10014[4]);
                    }
                    tables[ovenIndex].UpdateConsumeTime(double.Parse(consumeTime), leftTime);
                    return;
                }
                if (MethodCode == 4)
@@ -371,13 +448,16 @@
                    tables[ovenIndex].GetSingleCell(cellIndex).AddElectricData(eData);
                    return;
                }
                if (MethodCode == 14)
                {
                    /// æ¸…空电流和电压数据
                    strData = e.uiMsg.StringData;
                    int ovenIndex = int.Parse(strData);
                    tables[ovenIndex].ClearElectricData();
                    tables[ovenIndex].ClearVData();
                    tables[ovenIndex].ClearCellData();
                    //tables[ovenIndex].ClearElectricData();
                    //tables[ovenIndex].ClearVData();
                    //tables[ovenIndex].ClearWaterData();
                    return;
                }
@@ -395,7 +475,7 @@
                if (MethodCode == 16)
                {
                    /// æ·»åŠ ç”µåŽ‹æ•°æ®
                    /// æ·»åŠ ç”µåŽ‹å›¾è¡¨æ•°æ®
                    strData = e.uiMsg.StringData;
                    string[] datas = strData.Split(';');
                    int ovenIndex = int.Parse(datas[0]);
@@ -449,6 +529,20 @@
                    return;
                }
                if (MethodCode == 21)
                {
                    /// æ·»åŠ æ°´æµå›¾è¡¨æ•°æ®
                    strData = e.uiMsg.StringData;
                    string[] datas = strData.Split(';');
                    int ovenIndex = int.Parse(datas[0]);
                    int cellIndex = int.Parse(datas[1]);
                    double waterTemp = double.Parse(datas[2]);
                    double backWaterTemp = double.Parse(datas[3]);
                    double waterPressure = double.Parse(datas[4]);
                    tables[ovenIndex].GetSingleCell(cellIndex).AddWaterData(waterTemp, backWaterTemp, waterPressure);
                    return;
                }
                if (MethodCode == 99)
                {
                    strData = e.uiMsg.StringData;
Diff truncated after the above file
Plugin.TestResult/Util/CommonCodeParser.cs Plugin.TestResult/Util/ICodeParser.cs Plugin.TestResult/Util/JKCodeParser.cs Plugin.TestResult/Util/ModelCodeParser.cs Plugin.TestResult/Util/PNUtil.cs Plugin.TestResult/Util/RunTimeVariablePool.cs Plugin.TestResult/Util/ScannerParser.cs Plugin.TestResult/ViewControl.xaml Plugin.TestResult/ViewControl.xaml.cs Plugin.TestResult/app.config Plugin.TestResult/packages.config Plugin.TsExecution/Plugin.TsExecution.csproj Plugin.TsExecution/SingleControl.xaml Plugin.TsExecution/SingleControl.xaml.cs Plugin.TsExecution/TsExecution.xaml Plugin.TsExecution/TsExecution.xaml.cs Plugin.TsExecution/WorkOrderWin.xaml Plugin.TsExecution/WorkOrderWin.xaml.cs Plugin.TsSupport/Plugin.TsSupport.csproj Plugin.TsSupport/TestAppManager.cs SimpleUtil/HMI.Simple.Util/AlarmUtil.cs SimpleUtil/HMI.Simple.Util/HMI.Simple.Util.csproj SimpleUtil/HMI.Util.Base/AlarmUtil.cs (deleted) SimpleUtil/HMI.Util.Base/HMI.Util.Base.csproj WPFProject/App.config WPFProject/Controls/MainTabControl.xaml WPFProject/Controls/MainTabControl.xaml.cs WPFProject/Icon/LoginLogo.png WPFProject/Lang/en-US/AlarmInfoManage.json WPFProject/Lang/en-US/TestExecution.json WPFProject/Lang/en-US/TestResult.json WPFProject/Lang/en-US/app.json WPFProject/Lang/en-US/setting.json WPFProject/Lang/zh-CN/AlarmInfoManage.json WPFProject/Lang/zh-CN/TestExecution.json WPFProject/Lang/zh-CN/TestResult.json WPFProject/Lang/zh-CN/app.json WPFProject/Lang/zh-CN/setting.json WPFProject/Libs/Static/Static Resource.txt (deleted) WPFProject/Libs/echarts.min.js (deleted) WPFProject/LoadingWindow.xaml WPFProject/LoadingWindow.xaml.cs WPFProject/Login.xaml WPFProject/Login.xaml.cs WPFProject/MainWindow.xaml (deleted) WPFProject/MainWindow.xaml.cs (deleted) WPFProject/PanuonWindow.xaml WPFProject/PanuonWindow.xaml.cs WPFProject/TestWindow.xaml (deleted) WPFProject/TestWindow.xaml.cs (deleted) WPFProject/WPFProject.csproj WPFProject/WPFProject.sln WPFProject/Window1.xaml (deleted) WPFProject/Window1.xaml.cs (deleted) WPFProject/x86/SQLite.Interop.dll WPFProject/变更记录/2025-12-24.txt