using System.Configuration; using System.Data; using System.IO; using System.Linq; using System.Text; using System.Windows; namespace DrillTools { /// /// Interaction logic for App.xaml /// public partial class App : System.Windows.Application { protected override void OnStartup(StartupEventArgs e) { base.OnStartup(e); Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); string? filePath = null; if (e.Args.Length > 0) { filePath = e.Args[0]; if (!IsValidDrillTapeFile(filePath)) filePath = null; } if (filePath == null) { ShowMainWindow(null); return; } // 防止选择窗口关闭后触发 OnLastWindowClose 导致应用退出 ShutdownMode = ShutdownMode.OnExplicitShutdown; bool canClearParameters = CanClearDrillTapeParameters(filePath); var selectionWindow = new StartupSelectionWindow(filePath, canClearParameters); selectionWindow.ShowDialog(); switch (selectionWindow.SelectedAction) { case StartupAction.AdjustToolOrder: ShutdownMode = ShutdownMode.OnLastWindowClose; ShowMainWindow(filePath); break; case StartupAction.ExportHoleCount: PerformHeadlessExport(filePath); Shutdown(); break; case StartupAction.ClearParameters: PerformParameterCleanup(filePath); Shutdown(); break; default: Shutdown(); break; } } private static void ShowMainWindow(string? filePath) { try { MainWindow mainWindow = new MainWindow(filePath); mainWindow.Show(); } catch (Exception ex) { System.Windows.MessageBox.Show($"创建MainWindow时发生异常:\n{ex.GetType().Name} - {ex.Message}\n\n{ex.StackTrace}", "启动失败", MessageBoxButton.OK, MessageBoxImage.Error); throw; } } private static void PerformHeadlessExport(string filePath) { try { var viewModel = new MainWindowViewModel(); string content = CommandTypeFileReader.ReadAllText(filePath); viewModel.OriginalFilePath = filePath; viewModel.LoadToolsFromDrillTape(content); if (viewModel.Tools.Count == 0) { System.Windows.MessageBox.Show("钻带文件中未找到有效的刀具数据,无法导出孔数报表。", "提示", MessageBoxButton.OK, MessageBoxImage.Warning); return; } viewModel.ExportDrillUsageReport(); } catch (OperationCanceledException) { } catch (Exception ex) { System.Windows.MessageBox.Show($"导出孔数报表失败:\n{ex.Message}", "错误", MessageBoxButton.OK, MessageBoxImage.Error); } } private static bool CanClearDrillTapeParameters(string filePath) { try { string content = CommandTypeFileReader.ReadAllText(filePath); return DrillTapeParameterCleaner.CanClearParameters(content); } catch { return false; } } private static void PerformParameterCleanup(string filePath) { try { DrillTapeParameterCleaner.ClearParametersAndSave(filePath); System.Windows.MessageBox.Show( $"参数已清空,原文件已备份为:\n{Path.GetFileName(filePath)}.bak", "清空参数完成", MessageBoxButton.OK, MessageBoxImage.Information); } catch (Exception ex) { System.Windows.MessageBox.Show($"清空参数失败:\n{ex.Message}", "错误", MessageBoxButton.OK, MessageBoxImage.Error); } } /// /// 验证是否为有效的钻带文件 /// /// 文件路径 /// 是否为有效钻带文件 private static bool IsValidDrillTapeFile(string filePath) { if (string.IsNullOrEmpty(filePath)) return false; if (!File.Exists(filePath)) return false; // 检查文件扩展名是否为支持的钻带文件格式 string extension = Path.GetExtension(filePath).ToLowerInvariant(); string[] supportedExtensions = { ".txt", ".drl", ".dr2", ".dpin" }; return supportedExtensions.Contains(extension); } } }