using Microsoft.Win32; using Sunny.UI; using System; using System.Collections.Generic; using System.IO; using System.Text; 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 头罩视野.Views { /// /// RecordDate.xaml 的交互逻辑 /// /// public partial class RecordDate : Page { // 数据存储列表 private List LeftEyeDataList = new List(); private List RightEyeDataList = new List(); // 长按清除用 private bool _isClearPressed = false; private Thread _clearThread; public RecordDate() { InitializeComponent(); DynamicHeader(); // 2. 调用(名字和上面的变量一致) AddDataRow(dataGrid1, LeftEyeDataList, 64); AddDataRow(dataGrid2, RightEyeDataList, 64); // 测试数据 /// /// 给表格添加一行数据(自动存起来,用于保存) /// /// 目标表格 /// 数据存储列表 /// 通道数量 64/32 void AddDataRow(DataGrid dg, List dataList, int channelCount) { // 创建一行数据 dynamic row = new System.Dynamic.ExpandoObject(); var dict = (IDictionary)row; // 固定列 dict["Id"] = dataList.Count + 1; dict["Time"] = DateTime.Now.ToString("HH:mm:ss"); dict["Date"] = DateTime.Now.ToString("yyyy-MM-dd"); // 通道列(Ch1 ~ Ch64) for (int i = 1; i <= channelCount; i++) { dict[$"Ch{i}"] = 0; // 这里你可以替换成真实数据 } // 存起来 + 显示 dataList.Add(row); dg.Items.Add(row); } } //动态生成表头 void DynamicHeader() { // 2. 循环生成 64 个 ch 列 for (int i = 1; i <= 64; i++) { dataGrid1.Columns.Add(new DataGridTextColumn { Header = $"ch.{i}", Binding = new System.Windows.Data.Binding($"Ch{i}") }); dataGrid2.Columns.Add(new DataGridTextColumn { Header = $"ch.{i}", Binding = new System.Windows.Data.Binding($"Ch{i}") }); } } //#endregion // 保存左眼 private void btnSaveLeft_Click(object sender, RoutedEventArgs e) { SaveToCsv(LeftEyeDataList, $"左眼数据_{DateTime.Now:yyyyMMddHHmmss}.csv"); } // 保存右眼 private void btnSaveRight_Click(object sender, RoutedEventArgs e) { SaveToCsv(RightEyeDataList, $"右眼数据_{DateTime.Now:yyyyMMddHHmmss}.csv"); } private void SaveToCsv(List dataList, string defaultFileName) { if (dataList == null || dataList.Count == 0) { MessageBox.Show("无数据可保存"); return; } // 打开文件夹选择框 var folderDialog = new OpenFolderDialog(); if (folderDialog.ShowDialog() != true) return; string folder = folderDialog.FolderName; string path = System.IO.Path.Combine(folder, defaultFileName); // 写入 CSV using (var sw = new StreamWriter(path, false, Encoding.UTF8)) { var first = (IDictionary)dataList[0]; sw.WriteLine(string.Join(",", first.Keys)); foreach (var item in dataList) { var dict = (IDictionary)item; sw.WriteLine(string.Join(",", dict.Values)); } } MessageBox.Show("保存成功:\n" + path); } private void btnClear_MouseDown(object sender, MouseButtonEventArgs e) { _isClearPressed = true; _clearThread = new Thread(() => { Thread.Sleep(500); // 长按1秒触发 if (_isClearPressed) { Application.Current.Dispatcher.Invoke(() => ClearAllData()); } }); _clearThread.Start(); } // 清除所有数据 private void ClearAllData() { LeftEyeDataList.Clear(); dataGrid1.Items.Clear(); RightEyeDataList.Clear(); dataGrid2.Items.Clear(); MessageBox.Show("数据已清除"); } private void btnClear_MouseUp(object sender, MouseButtonEventArgs e) { _isClearPressed = false; _clearThread?.Join(100); // 等待线程结束最多100毫秒,然后强制结束 } private void GoHome(object s, RoutedEventArgs e) => NavigationService.Content = null; private void GoTest(object s, RoutedEventArgs e) => NavigationService.Content = new Views.PageTest(); private void GoRecord(object s, RoutedEventArgs e) => NavigationService.Content = new Views.RecordDate(); private void GoView(object s, RoutedEventArgs e) => NavigationService.Content = new Views.RecordPage(); //NavigationService.Navigate(new Views.RecordDate()); 页面相互跳转 } }