Files
hoodFieldOfView/头罩视野slove/头罩视野/Views/RecordDate.xaml.cs
2026-04-22 10:24:28 +08:00

187 lines
5.8 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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
{
/// <summary>
/// RecordDate.xaml 的交互逻辑
/// </summary>
///
public partial class RecordDate : Page
{
// 数据存储列表
private List<dynamic> LeftEyeDataList = new List<dynamic>();
private List<dynamic> RightEyeDataList = new List<dynamic>();
// 长按清除用
private bool _isClearPressed = false;
private Thread _clearThread;
public RecordDate()
{
InitializeComponent();
DynamicHeader();
// 2. 调用(名字和上面的变量一致)
AddDataRow(dataGrid1, LeftEyeDataList, 64);
AddDataRow(dataGrid2, RightEyeDataList, 64);
// 测试数据
/// <summary>
/// 给表格添加一行数据(自动存起来,用于保存)
/// </summary>
/// <param name="dg">目标表格</param>
/// <param name="dataList">数据存储列表</param>
/// <param name="channelCount">通道数量 64/32</param>
void AddDataRow(DataGrid dg, List<dynamic> dataList, int channelCount)
{
// 创建一行数据
dynamic row = new System.Dynamic.ExpandoObject();
var dict = (IDictionary<string, object>)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<dynamic> 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<string, object>)dataList[0];
sw.WriteLine(string.Join(",", first.Keys));
foreach (var item in dataList)
{
var dict = (IDictionary<string, object>)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()); 页面相互跳转
}
}