UCMonitorData2.xaml.cs 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925
  1. using MV485.db;
  2. using MV485.Dlg;
  3. using MV485.helper;
  4. using MV485.model;
  5. using System;
  6. using System.Collections.Generic;
  7. using System.Collections.ObjectModel;
  8. using System.Collections.Specialized;
  9. using System.ComponentModel;
  10. using System.IO;
  11. using System.Linq;
  12. using System.Text;
  13. using System.Text.RegularExpressions;
  14. using System.Threading.Tasks;
  15. using System.Windows;
  16. using System.Windows.Controls;
  17. using System.Windows.Data;
  18. using System.Windows.Documents;
  19. using System.Windows.Input;
  20. using System.Windows.Media;
  21. using System.Windows.Media.Imaging;
  22. using System.Windows.Navigation;
  23. using System.Windows.Shapes;
  24. namespace MV485.uc
  25. {
  26. /// <summary>
  27. /// UCMonitorData2.xaml 的交互逻辑
  28. /// </summary>
  29. public partial class UCMonitorData2 : UserControl,INotifyPropertyChanged
  30. {
  31. public event PropertyChangedEventHandler PropertyChanged;
  32. protected void OnPropertyChanged(string propertyName)
  33. {
  34. PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
  35. }
  36. private PollingManager _pollingManager;
  37. public int[] PageSizeOptions = new int[] { 10, 20, 50 };
  38. public ObservableCollection<TSlave> _slaveList { get; set; }
  39. public ObservableCollection<TSlaveDetail> _slaveDetailList { get; set; }
  40. public RWRunConfig _rwRunConfig; // = new RWRunConfig();
  41. public int SlaveRecords
  42. {
  43. get => _slaveList.Count();
  44. }
  45. private TSlave _selectedTSlave;
  46. public TSlave SelectedTSlave
  47. {
  48. get => _selectedTSlave;
  49. set
  50. {
  51. if(_selectedTSlave != value)
  52. {
  53. _selectedTSlave = value;
  54. OnPropertyChanged(nameof(SelectedTSlave));
  55. //改变明细数据
  56. DetailPage.InitDefaulValue();
  57. LoadSlaveDetailList(_selectedTSlave.SlaveId);
  58. ChangeSlaveInfo(_selectedTSlave);
  59. }
  60. }
  61. }
  62. private void ChangeSlaveInfo(TSlave slave)
  63. {
  64. if(slave == null)
  65. {
  66. txtSlaveInfo.Text = "";
  67. }
  68. else
  69. {
  70. txtSlaveInfo.Text = $"{slave.PortName} - {slave.BaudRate} 地址:{slave.Address}";
  71. }
  72. }
  73. private int _slaveDetailRecords;
  74. public int SlaveDetailRecords
  75. {
  76. get => _slaveDetailRecords;
  77. set
  78. {
  79. if(_slaveDetailRecords != value)
  80. {
  81. _slaveDetailRecords = value;
  82. OnPropertyChanged(nameof(SlaveDetailRecords));
  83. }
  84. }
  85. }
  86. private TSlaveDetail _selectedTSlaveDetail;
  87. public TSlaveDetail SelectedTSlaveDetail
  88. {
  89. get => _selectedTSlaveDetail;
  90. set
  91. {
  92. if(_selectedTSlaveDetail != value)
  93. {
  94. _selectedTSlaveDetail = value;
  95. OnPropertyChanged(nameof(SelectedTSlaveDetail));
  96. }
  97. }
  98. }
  99. public PageModel DetailPage { get; set; }
  100. private int _curPageSize;
  101. public int CurPageSize
  102. {
  103. get => _curPageSize;
  104. set
  105. {
  106. if(_curPageSize != value)
  107. {
  108. _curPageSize = value;
  109. OnPropertyChanged(nameof(CurPageSize));
  110. DetailPage.InitDefaulValue(CurPageSize);
  111. LoadSlaveDetailList(SelectedTSlave?.SlaveId ?? null);
  112. ConfigManager.Instance.UpdateConfig(ConfigKey.PageSize, _curPageSize.ToString());
  113. }
  114. }
  115. }
  116. public UCMonitorData2()
  117. {
  118. InitializeComponent();
  119. _slaveList = new ObservableCollection<TSlave>();
  120. dgSlave.ItemsSource = _slaveList;
  121. _slaveDetailList = new ObservableCollection<TSlaveDetail>();
  122. dgSlaveDetail.ItemsSource = _slaveDetailList;
  123. cmbPageSize.ItemsSource = PageSizeOptions;
  124. this.DataContext = this;
  125. _slaveList.CollectionChanged += _slaveList_CollectionChanged;
  126. //LoadSlaveList();
  127. if(int.TryParse(ConfigManager.Instance.GetConfigValue(ConfigKey.PageSize, "20"),out int curPageSize))
  128. {
  129. _curPageSize = curPageSize;
  130. }
  131. else
  132. {
  133. _curPageSize = 20;
  134. }
  135. DetailPage = new PageModel()
  136. {
  137. PageSize = _curPageSize,
  138. PageNumber = 1
  139. };
  140. ChangeSlaveInfo(null);
  141. //设置左侧的宽度
  142. string sLeftWidth = ConfigManager.Instance.GetConfigValue(ConfigKey.DataLeftWidth, "500");
  143. if(int.TryParse(sLeftWidth,out int leftWidth))
  144. {
  145. MainGrid.ColumnDefinitions[0].Width = new GridLength(leftWidth, GridUnitType.Pixel);
  146. }
  147. _rwRunConfig = new RWRunConfig();
  148. _rwRunConfig.RWLog += _rwRunConfig_RWLog;
  149. _rwRunConfig.SerialConnected += _rwRunConfig_SerialConnected;
  150. _rwRunConfig.SerialStatusChanged += _rwRunConfig_SerialStatusChanged;
  151. //string strAutoListenData = ConfigManager.Instance.GetConfigValue(ConfigKey.AutoListenData, "true");
  152. //bool isAutoListenData = bool.Parse(strAutoListenData);
  153. //chkAutoListenData.IsChecked = isAutoListenData;
  154. //_pollingManager = new PollingManager(!isAutoListenData);
  155. _pollingManager = new PollingManager(true);
  156. _pollingManager.SlaveDetailAdded += _pollingManager_OnAddSlaveDetail;
  157. _pollingManager.SlaveStatusChanged += _pollingManager_SlaveStatusChanged;
  158. //_pollingManager.StartPolling();
  159. LoadSlaveList();
  160. if(bool.TryParse(ConfigManager.Instance.GetConfigValue(ConfigKey.AutoListenData,"True"),out bool isAutoListen))
  161. {
  162. chkAutoListenData.IsChecked = isAutoListen;
  163. }
  164. }
  165. //设备的变化
  166. private void _slaveList_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
  167. {
  168. //throw new NotImplementedException();
  169. switch (e.Action)
  170. {
  171. case NotifyCollectionChangedAction.Add:
  172. foreach (TSlave item in e.NewItems)
  173. {
  174. //Console.WriteLine($"新增:{item}");
  175. //_pollingManager.AddDevice(item);
  176. }
  177. break;
  178. case NotifyCollectionChangedAction.Remove:
  179. foreach (TSlave item in e.OldItems)
  180. {
  181. //Console.WriteLine($"移除:{item}");
  182. }
  183. break;
  184. case NotifyCollectionChangedAction.Replace:
  185. //Console.WriteLine("替换操作");
  186. break;
  187. case NotifyCollectionChangedAction.Reset:
  188. //Console.WriteLine("集合被清空");
  189. break;
  190. }
  191. }
  192. //已经读到数据了
  193. private void _pollingManager_OnAddSlaveDetail(TSlaveDetail detail)
  194. {
  195. if (detail != null)
  196. {
  197. RefreshSlave(detail.SlaveId);
  198. }
  199. if (SelectedTSlave == null || detail == null || SelectedTSlave.SlaveId != detail.SlaveId) return;
  200. Dispatcher.BeginInvoke(new Action(() =>
  201. {
  202. if (DetailPage.PageNumber == 1)
  203. {
  204. _slaveDetailList.Insert(0, detail);
  205. SlaveDetailRecords++;
  206. DetailPage.PageCount = (int)Math.Ceiling(((double)SlaveDetailRecords / DetailPage.PageSize));
  207. if (_slaveDetailList.Count > DetailPage.PageSize)
  208. {
  209. for (int i = _slaveDetailList.Count - 1; i >= DetailPage.PageSize; i--)
  210. {
  211. _slaveDetailList.Remove(_slaveDetailList[i]);
  212. }
  213. }
  214. for(int i = 0; i < _slaveDetailList.Count; i++)
  215. {
  216. _slaveDetailList[i].Index = i + 1;
  217. }
  218. }
  219. }));
  220. }
  221. private void _pollingManager_SlaveStatusChanged(string slaveId, RunStatusType runStatus)
  222. {
  223. var device = _slaveList.FirstOrDefault(t => t.SlaveId == slaveId);
  224. if (device != null)
  225. {
  226. device.RunStatus = runStatus;
  227. }
  228. }
  229. private void _rwRunConfig_SerialStatusChanged(bool blConnected,string portName,int baudrate,byte address)
  230. {
  231. }
  232. private void _rwRunConfig_SerialConnected(bool blStatusChanged,string portName,int baudrate,byte address)
  233. {
  234. }
  235. private void _rwRunConfig_RWLog(string message)
  236. {
  237. Logger.Info(message);
  238. }
  239. private async void LoadSlaveList()
  240. {
  241. _slaveList.Clear();
  242. _pollingManager.RemoveAllDevice();
  243. try
  244. {
  245. var slaveList = await Task.Run(() =>
  246. {
  247. return DBSlave.GetAllTSlaves();
  248. });
  249. int index = 0;
  250. foreach(var slave in slaveList)
  251. {
  252. index++;
  253. slave.Index = index;
  254. _slaveList.Add(slave);
  255. }
  256. OnPropertyChanged(nameof(SlaveRecords));
  257. //await Dispatcher.BeginInvoke(new Action(() =>
  258. //{
  259. // _pollingManager.AddDevice(_slaveList); //加入所有
  260. //}));
  261. await Task.Run(() => _pollingManager.AddDevice(_slaveList));
  262. }
  263. catch(Exception ex)
  264. {
  265. MessageBox.Show(Application.Current.MainWindow,
  266. $"加载数据时发生错误:{ex.Message}", "错误", MessageBoxButton.OK, MessageBoxImage.Error);
  267. }
  268. }
  269. private async void LoadSlaveDetailList(string slaveId)
  270. {
  271. _slaveDetailList.Clear();
  272. if (slaveId == null) return;
  273. try
  274. {
  275. var result = await Task.Run(() =>
  276. {
  277. //return DBSlaveDetail.GetSlaveDetailBySlaveId(slaveId);
  278. return DBSlaveDetail.GetPagedTSlaveDetails(DetailPage.PageNumber, DetailPage.PageSize, slaveId);
  279. });
  280. SlaveDetailRecords = result.Item1;
  281. DetailPage.PageCount = result.Item2;
  282. var detailList = result.Item3;
  283. int index = 0;
  284. foreach(var detail in detailList)
  285. {
  286. index++;
  287. detail.Index = index + ((DetailPage.PageNumber - 1) * DetailPage.PageSize);
  288. _slaveDetailList.Add(detail);
  289. }
  290. //OnPropertyChanged(nameof(SlaveDetailRecords));
  291. }catch(Exception ex)
  292. {
  293. MessageBox.Show(Application.Current.MainWindow,
  294. $"加载数据时发生错误:{ex.Message}", "错误", MessageBoxButton.OK, MessageBoxImage.Error);
  295. }
  296. }
  297. private void BtnAddDevice_Click(object sender, RoutedEventArgs e)
  298. {
  299. DlgAddDevice dlg = new DlgAddDevice()
  300. {
  301. Owner = Application.Current.MainWindow,
  302. WindowStartupLocation = WindowStartupLocation.CenterOwner
  303. };
  304. if(dlg.ShowDialog() == true)
  305. {
  306. //添加到列表中
  307. if(dlg.NewSlaveList != null && dlg.NewSlaveList.Count > 0)
  308. {
  309. foreach(var slave in dlg.NewSlaveList)
  310. {
  311. slave.Index = _slaveList.Count + 1;
  312. _slaveList.Add(slave);
  313. _pollingManager?.AddDevice(slave);
  314. }//foreach
  315. OnPropertyChanged(nameof(SlaveRecords));
  316. }
  317. }
  318. }
  319. private void BtnRefreshSlave_Click(object sender, RoutedEventArgs e)
  320. {
  321. LoadSlaveList();
  322. }
  323. private void DgSlave_LoadingRow(object sender, DataGridRowEventArgs e)
  324. {
  325. // 设置第一列显示的行号,从 1 开始
  326. e.Row.Header = (e.Row.GetIndex() + 1).ToString();
  327. }
  328. private void BtnDelSlave_Click(object sender, RoutedEventArgs e)
  329. {
  330. Button button = sender as Button;
  331. if (button == null) return;
  332. DataGridRow row = Tools.FindAncestor<DataGridRow>(button);
  333. if (row == null) return;
  334. //获取当前行绑定的数据项
  335. TSlave slave = row.Item as TSlave;
  336. DeleteSelectedSlave(slave);
  337. }
  338. private async void DeleteSelectedSlave(TSlave slave)
  339. {
  340. if (slave == null) return;
  341. MessageBoxResult result = MessageBox.Show("确定要删除此条目吗?", "确认删除", MessageBoxButton.YesNo, MessageBoxImage.Question);
  342. if (result != MessageBoxResult.Yes) return;
  343. string titleInfo = "正在删除,请稍后...";
  344. WaitWindow waitWindow = new WaitWindow(titleInfo)
  345. {
  346. Owner = Application.Current.MainWindow,
  347. WindowStartupLocation = WindowStartupLocation.CenterOwner
  348. };
  349. waitWindow.Show();
  350. try
  351. {
  352. bool deleteSuccess = false;
  353. await Task.Run(() =>
  354. {
  355. deleteSuccess = DBSlave.DeleteSlaveAndDetails(slave.SlaveId);
  356. });
  357. if (deleteSuccess)
  358. {
  359. int index = _slaveList.IndexOf(slave);
  360. _slaveList.Remove(slave);
  361. for(int i = index; i < _slaveList.Count; i++)
  362. {
  363. _slaveList[i].Index = i+1;
  364. }
  365. //改变它后面的Index
  366. SelectedTSlave = null;
  367. _pollingManager?.RemoveDevice(slave.SlaveId);
  368. }
  369. }
  370. catch (Exception ex)
  371. {
  372. MessageBox.Show(Application.Current.MainWindow, $"删除失败:{ex.Message}", "错误",
  373. MessageBoxButton.OK, MessageBoxImage.Error);
  374. }
  375. finally
  376. {
  377. waitWindow.Close();
  378. }
  379. }
  380. private async void BtnClearData_Click(object sender, RoutedEventArgs e)
  381. {
  382. if (SelectedTSlave == null) return;
  383. MessageBoxResult result = MessageBox.Show("确定要清空所有数据吗?", "确认", MessageBoxButton.YesNo, MessageBoxImage.Question);
  384. if (result != MessageBoxResult.Yes) return;
  385. string titleInfo = "正在清空数据,请稍后...";
  386. WaitWindow waitWindow = new WaitWindow(titleInfo)
  387. {
  388. Owner = Application.Current.MainWindow,
  389. WindowStartupLocation = WindowStartupLocation.CenterOwner
  390. };
  391. waitWindow.Show();
  392. try
  393. {
  394. bool deleteSuccess = false;
  395. await Task.Run(() =>
  396. {
  397. deleteSuccess = DBSlaveDetail.DeleteSlaveDetailBySlaveId(SelectedTSlave.SlaveId);
  398. });
  399. if (deleteSuccess)
  400. {
  401. DetailPage.InitDefaulValue();
  402. _slaveDetailList.Clear();
  403. SlaveDetailRecords = 0;
  404. //RefreshSlaveCount(SelectedTSlave.SlaveId);
  405. RefreshSlave(SelectedTSlave.SlaveId);
  406. }
  407. }
  408. catch (Exception ex)
  409. {
  410. MessageBox.Show(Application.Current.MainWindow, $"删除失败:{ex.Message}", "错误",
  411. MessageBoxButton.OK, MessageBoxImage.Error);
  412. }
  413. finally
  414. {
  415. waitWindow.Close();
  416. }
  417. }
  418. private async void RefreshSlaveCount(string slaveId)
  419. {
  420. TSlave slave = await Task.Run(() =>
  421. {
  422. return DBSlave.GetVSlaveBySlaveId(slaveId);
  423. });
  424. if(slave != null)
  425. {
  426. var result = _slaveList.FirstOrDefault(s => s.SlaveId == slaveId);
  427. if (result != null)
  428. {
  429. result.DetailCount = slave.DetailCount;
  430. }
  431. }
  432. }
  433. private async void RefreshSlave(string slaveId)
  434. {
  435. TSlave newSlave = await Task.Run(() =>
  436. {
  437. return DBSlave.GetVSlaveBySlaveId(slaveId);
  438. });
  439. if (newSlave != null)
  440. {
  441. var oldSlave = _slaveList.FirstOrDefault(s => s.SlaveId == slaveId);
  442. var oldRunStatus = oldSlave.RunStatus;
  443. if (oldSlave != null)
  444. {
  445. //result.DetailCount = slave.DetailCount;
  446. //ObjectHelper.CopyMatchingFields(newSlave, oldSlave);
  447. //oldSlave.RunStatus = oldRunStatus;
  448. oldSlave.ReadInterval = newSlave.ReadInterval;
  449. oldSlave.ReadImageFlag = newSlave.ReadImageFlag;
  450. oldSlave.RunFlag = newSlave.RunFlag;
  451. oldSlave.LastReadTime = newSlave.LastReadTime;
  452. oldSlave.DetailCount = newSlave.DetailCount;
  453. }
  454. }
  455. }
  456. private void BtnDataFirstPage_Click(object sender, RoutedEventArgs e)
  457. {
  458. if (SelectedTSlave == null) return;
  459. if(DetailPage.PageNumber > 1)
  460. {
  461. DetailPage.PageNumber = 1;
  462. LoadSlaveDetailList(SelectedTSlave.SlaveId);
  463. }
  464. }
  465. private void BtnDataPrePage_Click(object sender, RoutedEventArgs e)
  466. {
  467. if (SelectedTSlave == null) return;
  468. if(DetailPage.PageNumber > 1)
  469. {
  470. DetailPage.PageNumber -= 1;
  471. LoadSlaveDetailList(SelectedTSlave.SlaveId);
  472. }
  473. }
  474. private void BtnDataNextPage_Click(object sender, RoutedEventArgs e)
  475. {
  476. if (SelectedTSlave == null) return;
  477. if(DetailPage.PageNumber < DetailPage.PageCount)
  478. {
  479. DetailPage.PageNumber += 1;
  480. LoadSlaveDetailList(SelectedTSlave.SlaveId);
  481. }
  482. }
  483. private void BtnDataLastPage_Click(object sender, RoutedEventArgs e)
  484. {
  485. if (SelectedTSlave == null) return;
  486. if(DetailPage.PageNumber < DetailPage.PageCount)
  487. {
  488. DetailPage.PageNumber = DetailPage.PageCount;
  489. LoadSlaveDetailList(SelectedTSlave.SlaveId);
  490. }
  491. }
  492. private void BtnDataSpeciPage_Click(object sender, RoutedEventArgs e)
  493. {
  494. if (SelectedTSlave == null) return;
  495. if(!int.TryParse(txtDataPageNumber.Text,out int pageNumber))
  496. {
  497. return;
  498. }
  499. if (pageNumber != DetailPage.PageNumber &&
  500. pageNumber > 0 && pageNumber <= DetailPage.PageCount)
  501. {
  502. DetailPage.PageNumber = pageNumber;
  503. LoadSlaveDetailList(SelectedTSlave.SlaveId);
  504. }
  505. }
  506. private void TextBox_PreviewTextInput(object sender, TextCompositionEventArgs e)
  507. {
  508. // 只允许数字输入
  509. e.Handled = !Regex.IsMatch(e.Text, @"^\d$");
  510. //if (e.Text.All(char.IsDigit))
  511. //{
  512. // e.Handled = false; // 如果是数字,允许输入
  513. //}
  514. //else
  515. //{
  516. // // 如果当前输入的字符不是数字,并且是中文输入法的拼音或候选字,禁止输入
  517. // e.Handled = true;
  518. //}
  519. }
  520. private void BtnLogViewer_Click(object sender, RoutedEventArgs e)
  521. {
  522. }
  523. private void BtnDelSlaveDetail_Click(object sender, RoutedEventArgs e)
  524. {
  525. Button button = sender as Button;
  526. if (button == null) return;
  527. DataGridRow row = Tools.FindAncestor<DataGridRow>(button);
  528. if (row == null) return;
  529. //获取当前行绑定的数据项
  530. TSlaveDetail slaveDetail = row.Item as TSlaveDetail;
  531. DeleteSelectedSlaveDetail(slaveDetail);
  532. }
  533. private async void DeleteSelectedSlaveDetail(TSlaveDetail slaveDetail)
  534. {
  535. if (slaveDetail == null) return;
  536. MessageBoxResult result = MessageBox.Show("确定要删除此条目吗?", "确认删除", MessageBoxButton.YesNo, MessageBoxImage.Question);
  537. if (result != MessageBoxResult.Yes) return;
  538. string titleInfo = "正在删除,请稍后...";
  539. WaitWindow waitWindow = new WaitWindow(titleInfo)
  540. {
  541. Owner = Application.Current.MainWindow,
  542. WindowStartupLocation = WindowStartupLocation.CenterOwner
  543. };
  544. waitWindow.Show();
  545. try
  546. {
  547. bool deleteSuccess = false;
  548. await Task.Run(() =>
  549. {
  550. deleteSuccess = DBSlaveDetail.DeleteSlaveDetailByDetailId(slaveDetail.DetailId);
  551. });
  552. if (deleteSuccess)
  553. {
  554. //int index = _slaveList.IndexOf(slave);
  555. _slaveDetailList.Remove(slaveDetail);
  556. //for (int i = index; i < _slaveList.Count; i++)
  557. //{
  558. // _slaveList[i].Index = i + 1;
  559. //}
  560. //改变它后面的Index
  561. SelectedTSlaveDetail = null;
  562. }
  563. }
  564. catch (Exception ex)
  565. {
  566. MessageBox.Show(Application.Current.MainWindow, $"删除失败:{ex.Message}", "错误",
  567. MessageBoxButton.OK, MessageBoxImage.Error);
  568. }
  569. finally
  570. {
  571. waitWindow.Close();
  572. }
  573. }
  574. private void MeterImage_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
  575. {
  576. var image = sender as Image;
  577. if (image == null) return;
  578. var dataContext = image.DataContext as TSlaveDetail;
  579. if (dataContext == null) return;
  580. //var dialog = new ImageViewerWindow(dataContext.SourceImagePath)
  581. if (!File.Exists(dataContext.ImageFile)) return;
  582. //((MainWindow)Application.Current.MainWindow).overlay.Visibility = Visibility.Visible;
  583. DlgImage dialog = new DlgImage(dataContext.ImageFile)
  584. {
  585. Owner = Application.Current.MainWindow
  586. };
  587. //dialog.ShowDialog();
  588. dialog.Show();
  589. }
  590. private void BtnUpdateDevice_Click(object sender, RoutedEventArgs e)
  591. {
  592. if (SelectedTSlave == null) return;
  593. DlgUpdateDevice dlg = new DlgUpdateDevice(SelectedTSlave)
  594. {
  595. Owner = Application.Current.MainWindow,
  596. WindowStartupLocation = WindowStartupLocation.CenterOwner
  597. };
  598. if(dlg.ShowDialog() == true)
  599. {
  600. //TSlave对象已经被更改,会自动刷新,不需要调用函数刷新
  601. //RefreshSlave(SelectedTSlave.)
  602. }
  603. }
  604. private void BtnConnectTest_Click(object sender, RoutedEventArgs e)
  605. {
  606. TestConnect(SelectedTSlave);
  607. }
  608. //测试连接
  609. private async void TestConnect(TSlave slave)
  610. {
  611. if (slave == null) return;
  612. //开始通过xModem协议读取照片
  613. string titleInfo = "正在测试设备是否可连接";
  614. WaitWindow waitWindow = new WaitWindow(titleInfo)
  615. {
  616. Owner = Application.Current.MainWindow,
  617. WindowStartupLocation = WindowStartupLocation.CenterOwner
  618. };
  619. waitWindow.Show();
  620. string message = "";
  621. bool blConnected = false;
  622. try
  623. {
  624. blConnected = await Task.Run(() =>
  625. {
  626. return _rwRunConfig.ConnectTest(slave.PortName, slave.BaudRate, (byte)slave.Address, out message);
  627. });
  628. }
  629. catch { }
  630. finally
  631. {
  632. waitWindow.Close();
  633. }
  634. MessageBox.Show(Application.Current.MainWindow, message, "提示",
  635. MessageBoxButton.OK, blConnected ? MessageBoxImage.Information : MessageBoxImage.Error);
  636. }
  637. private bool _needImage = true;
  638. private async void BtnClearDataA_Click(object sender, RoutedEventArgs e)
  639. {
  640. if(SelectedTSlave == null)
  641. {
  642. return;
  643. }
  644. TSlaveDetail slaveDetail = new TSlaveDetail()
  645. {
  646. DetailId = Guid.NewGuid().ToString().Replace("-", ""),
  647. SlaveId = SelectedTSlave.SlaveId,
  648. DeviceSn = "12345678934",
  649. ReadTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
  650. SampleResult = 9872233,
  651. SampleTime = DateTime.Now.AddHours(-1).ToString("yyyy-MM-dd HH:mm:ss"),
  652. MeterType = 1,
  653. ImageFile = ""
  654. };
  655. if (_needImage)
  656. {
  657. _needImage = false;
  658. slaveDetail.ImageFile = @"C:\test_image\24050131011_20240808000918_B.jpg";
  659. }
  660. else
  661. {
  662. _needImage = true;
  663. }
  664. bool blInsert = await Task.Run(() =>
  665. {
  666. return DBSlaveDetail.InsertTSlaveDetail(slaveDetail);
  667. });
  668. if (blInsert)
  669. {
  670. _slaveDetailList.Insert(0,slaveDetail);
  671. SlaveDetailRecords++;
  672. DetailPage.PageCount = (int)Math.Ceiling(((double)SlaveDetailRecords / DetailPage.PageSize));
  673. //RefreshSlaveCount(SelectedTSlave.SlaveId);
  674. RefreshSlave(SelectedTSlave.SlaveId);
  675. }
  676. if(_slaveDetailList.Count > DetailPage.PageSize)
  677. {
  678. for(int i = _slaveDetailList.Count-1; i >= 10; i--)
  679. {
  680. _slaveDetailList.Remove(_slaveDetailList[i]);
  681. }
  682. }
  683. }
  684. private void GridSplitter_DragCompleted(object sender, System.Windows.Controls.Primitives.DragCompletedEventArgs e)
  685. {
  686. // 获取左侧和右侧列宽
  687. var leftWidth = MainGrid.ColumnDefinitions[0].Width;
  688. //var rightWidth = MainGrid.ColumnDefinitions[2].Width;
  689. // 如果是像素(不是*),可以这样获取实际值
  690. if (leftWidth.IsAbsolute)
  691. {
  692. double leftPixels = leftWidth.Value;
  693. //Console.WriteLine($"左宽度: {leftPixels}, 右宽度: {rightPixels}");
  694. // TODO: 保存这两个值(比如写入设置文件、数据库等)
  695. }
  696. //保存以上2个的值
  697. ConfigManager.Instance.UpdateConfig(ConfigKey.DataLeftWidth, leftWidth.Value.ToString());
  698. }
  699. private void BtnRefreshSlaveDetail_Click(object sender, RoutedEventArgs e)
  700. {
  701. if (SelectedTSlave == null) return;
  702. DetailPage.InitDefaulValue();
  703. LoadSlaveDetailList(SelectedTSlave.SlaveId);
  704. }
  705. private void MiConnectTest_Click(object sender, RoutedEventArgs e)
  706. {
  707. TestConnect(SelectedTSlave);
  708. }
  709. private void MiUpdateSlave_Click(object sender, RoutedEventArgs e)
  710. {
  711. if (SelectedTSlave == null) return;
  712. DlgUpdateDevice dlg = new DlgUpdateDevice(SelectedTSlave)
  713. {
  714. Owner = Application.Current.MainWindow,
  715. WindowStartupLocation = WindowStartupLocation.CenterOwner
  716. };
  717. if (dlg.ShowDialog() == true)
  718. {
  719. //TSlave对象已经被更改,会自动刷新,不需要调用函数刷新
  720. //RefreshSlave(SelectedTSlave.)
  721. }
  722. }
  723. private void MiDeleteSlave_Click(object sender, RoutedEventArgs e)
  724. {
  725. if (SelectedTSlave == null) return;
  726. DeleteSelectedSlave(SelectedTSlave);
  727. }
  728. private void MiDeleteSlaveDetail_Click(object sender, RoutedEventArgs e)
  729. {
  730. if (SelectedTSlaveDetail == null) return;
  731. DeleteSelectedSlaveDetail(SelectedTSlaveDetail);
  732. }
  733. private void UserControl_Unloaded(object sender, RoutedEventArgs e)
  734. {
  735. //停止数据的监听
  736. //_pollingManager?.StopAll();
  737. _pollingManager?.Pause();
  738. }
  739. private void UserControl_Loaded(object sender, RoutedEventArgs e)
  740. {
  741. //string strAutoListenData = ConfigManager.Instance.GetConfigValue(ConfigKey.AutoListenData, "true");
  742. //bool isAutoListenData = bool.Parse(strAutoListenData);
  743. //chkAutoListenData.IsChecked = isAutoListenData;
  744. if(_pollingManager!=null && chkAutoListenData.IsChecked == true)
  745. {
  746. _pollingManager?.Resume();
  747. }else if(_pollingManager != null && chkAutoListenData.IsChecked == false)
  748. {
  749. _pollingManager?.Pause();
  750. }
  751. }
  752. private void CheckBox_Checked(object sender, RoutedEventArgs e)
  753. {
  754. //if (_pollingManager != null)
  755. //{
  756. // _pollingManager?.Resume();
  757. // ConfigManager.Instance.UpdateConfig(ConfigKey.AutoListenData, true.ToString());
  758. //}
  759. }
  760. private void CheckBox_Unchecked(object sender, RoutedEventArgs e)
  761. {
  762. //if (_pollingManager != null)
  763. //{
  764. // _pollingManager?.Pause();
  765. // ConfigManager.Instance.UpdateConfig(ConfigKey.AutoListenData, false.ToString());
  766. //}
  767. }
  768. private void ChkAutoListenData_Click(object sender, RoutedEventArgs e)
  769. {
  770. //if (_pollingManager != null)
  771. //{
  772. if (chkAutoListenData.IsChecked == true)
  773. {
  774. _pollingManager?.Resume();
  775. }
  776. else
  777. {
  778. _pollingManager?.Pause();
  779. }
  780. ConfigManager.Instance.UpdateConfig(ConfigKey.AutoListenData, chkAutoListenData.IsChecked.ToString());
  781. //}
  782. }
  783. private void BtnSetImagePath_Click(object sender, RoutedEventArgs e)
  784. {
  785. DlgSaveImagePath dlgSave = new DlgSaveImagePath()
  786. {
  787. Owner = Application.Current.MainWindow,
  788. WindowStartupLocation = WindowStartupLocation.CenterOwner
  789. };
  790. dlgSave.ShowDialog();
  791. }
  792. //----------------------------------------------------------
  793. }
  794. }