From e57938fbda9bff702004038f76d009422968bff5 Mon Sep 17 00:00:00 2001
From: alielie <alielie@git.com>
Date: 星期五, 06 十一月 2026 18:05:07 +0800
Subject: [PATCH] 提交代码
---
DeviceService/MainWindow.xaml.cs | 218 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 218 insertions(+), 0 deletions(-)
diff --git a/DeviceService/MainWindow.xaml.cs b/DeviceService/MainWindow.xaml.cs
new file mode 100644
index 0000000..3ca094d
--- /dev/null
+++ b/DeviceService/MainWindow.xaml.cs
@@ -0,0 +1,218 @@
+using DeviceService.Core;
+using DeviceService.Device;
+using DeviceService.Driver;
+using DeviceService.Logging;
+using DeviceService.Service;
+using System.Collections.ObjectModel;
+using System.IO;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Controls.Primitives;
+using System.Windows.Threading;
+
+namespace DeviceService;
+
+/// <summary>
+/// 璁惧鏍戝垎缁勮妭鐐癸紙鎸� IDevice.Type 鍒嗙粍锛夈��
+/// </summary>
+public class DeviceGroupNode
+{
+ public DeviceGroupNode(string type, IEnumerable<DeviceNode> children)
+ {
+ Type = type;
+ Children = new ObservableCollection<DeviceNode>(children);
+ }
+
+ public string Type { get; }
+
+ public ObservableCollection<DeviceNode> Children { get; }
+}
+
+/// <summary>
+/// 璁惧鏍戝彾瀛愯妭鐐广��
+/// </summary>
+public class DeviceNode
+{
+ public DeviceNode(IDevice device)
+ {
+ Device = device;
+ }
+
+ public IDevice Device { get; }
+
+ public string DisplayName => $"{Device.DeviceId}锛坽Device.Brand}锛�";
+}
+
+/// <summary>
+/// Interaction logic for MainWindow.xaml
+/// </summary>
+public partial class MainWindow : Window
+{
+ private readonly DriverManager _manager = DriverManager.Instance;
+ private readonly ObservableCollection<DeviceGroupNode> _groups = new ObservableCollection<DeviceGroupNode>();
+
+ public MainWindow()
+ {
+ InitializeComponent();
+ DeviceTree.ItemsSource = _groups;
+ Loaded += MainWindow_Loaded;
+ }
+
+ private void MainWindow_Loaded(object sender, RoutedEventArgs e)
+ {
+ // 鍔犺浇椹卞姩鍖咃紝渚涜澶� Init 鏃舵煡鎵鹃┍鍔�
+ _manager.Scan(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Driver"), s => { });
+
+ // 鎵弿 DeviceDesc 娉ㄨВ锛屽~鍏� AllDeviceType
+ DeviceHelper.ScanDeviceTypes();
+
+ // 浠ユ暟鎹簱涓哄噯鎭㈠璁惧鍒楄〃锛堜笉璋冪敤 Init锛岄伩鍏嶅惎鍔ㄥ嵆鍗犵敤纭欢锛�
+ ReloadDeviceList();
+
+ RefreshDeviceTree();
+ }
+
+ private void RefreshButton_Click(object sender, RoutedEventArgs e)
+ {
+ RefreshDeviceTree();
+ }
+
+ private void AddDeviceButton_Click(object sender, RoutedEventArgs e)
+ {
+ var dialog = new AddDeviceWindow { Owner = this };
+ if (dialog.ShowDialog() != true || dialog.Device == null)
+ {
+ return;
+ }
+
+ IDevice device = dialog.Device;
+ if (!DeviceHelper.SaveDevice(device))
+ {
+ HeaderText.Text = $"璁惧 {device.DeviceId} 淇濆瓨澶辫触";
+ return;
+ }
+
+ // 淇濆瓨鎴愬姛鍚庝粠鏁版嵁搴撻噸鏂拌鍙栬澶囧垪琛紝鑰屼笉鏄妸寮圭獥閲屾柊寤虹殑瀹炰緥鐩存帴濉炶繘鍒楄〃
+ ReloadDeviceList();
+ RefreshDeviceTree();
+
+ HeaderText.Text = $"宸叉坊鍔犺澶� {device.DeviceId}";
+ }
+
+ /// <summary>浠� Config\Devices.db 涓哄噯鍒锋柊鍐呭瓨涓殑璁惧鍒楄〃锛堜笉璋冪敤 Init锛夈��</summary>
+ private static void ReloadDeviceList()
+ {
+ DeviceManager.Refresh(DeviceHelper.LoadDevices());
+ }
+
+ private void StartService_Click(object sender, RoutedEventArgs e)
+ {
+ // 杩愯涓偣鍑诲嵆涓衡�滃仠姝⑩��
+ if (ServiceStateMachine.GlobalState.State == ServiceStatus.Running)
+ {
+ ServiceManager.Stop();
+ HeaderText.Text = "鏈嶅姟宸插仠姝�";
+ return;
+ }
+
+ try
+ {
+ ServiceManager.Start();
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show(ex.Message);
+ }
+ }
+
+ private void DebugWindowButton_Click(object sender, RoutedEventArgs e)
+ {
+ var debug = new DebugWindow { Owner = this };
+ debug.Show();
+ }
+
+ private void LogWindowButton_Click(object sender, RoutedEventArgs e)
+ {
+ var log = new LogWindow { Owner = this };
+ log.Show();
+ }
+
+ private void DeviceTree_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
+ {
+ if (e.NewValue is DeviceNode node)
+ {
+ ShowDeviceConfig(node.Device);
+ }
+ else
+ {
+ ConfigHost.Content = null;
+ HeaderText.Text = "璁惧閰嶇疆";
+ }
+ }
+
+ private void ShowDeviceConfig(IDevice device)
+ {
+ HeaderText.Text = $"{device.Type} - {device.DeviceId}";
+
+ UserControl? control = DeviceConfigControlFactory.Create(device);
+ if (control == null)
+ {
+ // 鏈寜鍛藉悕瑙勫垯鎵惧埌瀵瑰簲閰嶇疆鎺т欢
+ ConfigHost.Content = new TextBlock
+ {
+ Text = $"鏈壘鍒� {device.GetType().Name}ConfigControl锛屾棤娉曟樉绀鸿璁惧鐨勯厤缃晫闈€��",
+ Margin = new Thickness(8),
+ TextWrapping = TextWrapping.Wrap,
+ TextAlignment = TextAlignment.Center,
+ VerticalAlignment = VerticalAlignment.Center
+ };
+ return;
+ }
+
+ control.DataContext = device;
+ ConfigHost.Content = control;
+ }
+
+ private void RefreshDeviceTree()
+ {
+ string? selectedId = (DeviceTree.SelectedItem as DeviceNode)?.Device.DeviceId;
+
+ _groups.Clear();
+ foreach (var group in DeviceManager.Devices
+ .GroupBy(d => d.Type)
+ .OrderBy(g => g.Key, StringComparer.Ordinal))
+ {
+ _groups.Add(new DeviceGroupNode(group.Key, group.Select(d => new DeviceNode(d))));
+ }
+
+ // 瀹瑰櫒鍦ㄦ湰娆″竷灞�涔嬪悗鎵嶇敓鎴愶紝寤跺悗灞曞紑锛岀‘淇濇柊澧炶妭鐐硅兘鏄剧ず鍑烘潵
+ Dispatcher.BeginInvoke(new Action(ExpandAllGroups), DispatcherPriority.Loaded);
+ }
+
+ /// <summary>灞曞紑鎵�鏈夊垎缁勮妭鐐广��</summary>
+ private void ExpandAllGroups()
+ {
+ if (DeviceTree.ItemContainerGenerator.Status != GeneratorStatus.ContainersGenerated)
+ {
+ EventHandler? handler = null;
+ handler = (s, e) =>
+ {
+ if (DeviceTree.ItemContainerGenerator.Status == GeneratorStatus.ContainersGenerated)
+ {
+ DeviceTree.ItemContainerGenerator.StatusChanged -= handler;
+ ExpandAllGroups();
+ }
+ };
+ DeviceTree.ItemContainerGenerator.StatusChanged += handler;
+ return;
+ }
+
+ for (int i = 0; i < DeviceTree.Items.Count; i++)
+ {
+ if (DeviceTree.ItemContainerGenerator.ContainerFromIndex(i) is TreeViewItem item)
+ {
+ item.IsExpanded = true;
+ }
+ }
+ }
+}
--
Gitblit v1.9.1