From f3413b42eedd01c9887f25ad38a354d80cf4b6cd Mon Sep 17 00:00:00 2001 From: Tyrone CT Date: Thu, 5 Mar 2026 10:20:43 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8E=A8=E9=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FATrace.App/frmMain.Designer.cs | 3 +- FATrace.App/frmMain.cs | 53 ++++-- FATrace.OEMApp/MainApp.Designer.cs | 36 +--- FATrace.OEMApp/MainApp.cs | 245 +++++++++++++++++--------- FATrace.OEMApp/MainApp.resx | 24 +-- FATrace.WPLApp/App.xaml.cs | 34 ++-- FATrace.WPLApp/Views/MainView.xaml | 2 +- FATrace.WPLApp/Views/MainView.xaml.cs | 37 +++- 8 files changed, 270 insertions(+), 164 deletions(-) diff --git a/FATrace.App/frmMain.Designer.cs b/FATrace.App/frmMain.Designer.cs index 0862f4d..11cb372 100644 --- a/FATrace.App/frmMain.Designer.cs +++ b/FATrace.App/frmMain.Designer.cs @@ -825,7 +825,7 @@ namespace FATrace.App btnRawName1.Name = "btnRawName1"; btnRawName1.Size = new Size(266, 48); btnRawName1.TabIndex = 1; - btnRawName1.Text = "YG05030013 瑞士乳杆菌GCL1815"; + btnRawName1.Text = "1121000265 瑞士乳杆菌GCL1815"; btnRawName1.UseVisualStyleBackColor = true; btnRawName1.Click += btnRawName1_Click; // @@ -1109,6 +1109,7 @@ namespace FATrace.App StartPosition = FormStartPosition.CenterScreen; Text = "管理界面"; WindowState = FormWindowState.Maximized; + FormClosing += frmMain_FormClosing; FormClosed += frmMain_FormClosed; Load += frmMain_Load; statusStrip1.ResumeLayout(false); diff --git a/FATrace.App/frmMain.cs b/FATrace.App/frmMain.cs index a457ec0..619626e 100644 --- a/FATrace.App/frmMain.cs +++ b/FATrace.App/frmMain.cs @@ -37,6 +37,11 @@ namespace FATrace.App // TouchSocket 版称重客户端 private TScalTcp? _scaleTcp; + /// + /// 关闭确认标记:用于避免重复弹窗(如关闭过程触发多次 FormClosing) + /// + private bool _closeConfirmed; + // 打印机连接参数(用于状态检测) private string _printerIp = "192.0.1.21"; private int _printerPort = 9100; @@ -251,7 +256,7 @@ namespace FATrace.App { new RawCtrInfo(){ RawName="瑞士乳杆菌GCL1815", - RawCode="YG05030013", + RawCode="1121000265", BtnControlName="btnRawName1", RawSource=RawSource.Japan }, @@ -993,20 +998,6 @@ namespace FATrace.App ShowError(); } - // 窗体关闭时,停止称重服务,释放网络连接 - protected override void OnFormClosed(FormClosedEventArgs e) - { - try - { - _scaleTcp?.StopAsync().GetAwaiter().GetResult(); - - } - catch - { - } - base.OnFormClosed(e); - } - /// private void btnLogin_Click(object sender, EventArgs e) { @@ -1443,5 +1434,37 @@ namespace FATrace.App MessageBox.Show($"保存配置失败:{ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); } } + + private void frmMain_FormClosing(object sender, FormClosingEventArgs e) + { + if (!_closeConfirmed && e.CloseReason == CloseReason.UserClosing) + { + try + { + var result = MessageBox.Show( + "确认退出系统?", + "退出确认", + MessageBoxButtons.YesNo, + MessageBoxIcon.Question, + MessageBoxDefaultButton.Button2); + + if (result != DialogResult.Yes) + { + e.Cancel = true; + logger.Info("已取消关闭"); + return; + } + + _closeConfirmed = true; + logger.Info("用户确认关闭,开始退出"); + } + catch (Exception ex) + { + // 弹窗异常时,为保证可关闭,默认继续退出,但记录日志 + logger.Error(ex, "关闭确认弹窗异常"); + _closeConfirmed = true; + } + } + } } } diff --git a/FATrace.OEMApp/MainApp.Designer.cs b/FATrace.OEMApp/MainApp.Designer.cs index 64a5ca8..c0ce1ce 100644 --- a/FATrace.OEMApp/MainApp.Designer.cs +++ b/FATrace.OEMApp/MainApp.Designer.cs @@ -63,7 +63,6 @@ namespace FATrace.OEMApp tabPage2 = new TabPage(); dataGridView1 = new DataGridView(); materialCard1 = new ReaLTaiizor.Controls.MaterialCard(); - btnStopHistoryPlay = new Button(); label4 = new Label(); txtSearchCode = new TextBox(); btnHistoryVideoSearch = new Button(); @@ -72,7 +71,6 @@ namespace FATrace.OEMApp label2 = new Label(); label1 = new Label(); PdtHistorySearchStart = new ReaLTaiizor.Controls.PoisonDateTime(); - videoView1 = new LibVLCSharp.WinForms.VideoView(); tabPage3 = new TabPage(); metroProgressBar1 = new ReaLTaiizor.Controls.MetroProgressBar(); DownloadProgressBar = new ProgressBar(); @@ -93,7 +91,6 @@ namespace FATrace.OEMApp tabPage2.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)dataGridView1).BeginInit(); materialCard1.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)videoView1).BeginInit(); tabPage3.SuspendLayout(); navPanel.SuspendLayout(); SuspendLayout(); @@ -365,6 +362,7 @@ namespace FATrace.OEMApp btnRawStopLoadVideo.TabIndex = 7; btnRawStopLoadVideo.Text = "停止下载"; btnRawStopLoadVideo.UseVisualStyleBackColor = true; + btnRawStopLoadVideo.Visible = false; btnRawStopLoadVideo.Click += btnRawStopLoadVideo_Click; // // btnTestAction @@ -375,6 +373,7 @@ namespace FATrace.OEMApp btnTestAction.TabIndex = 5; btnTestAction.Text = "结束操作"; btnTestAction.UseVisualStyleBackColor = true; + btnTestAction.Visible = false; btnTestAction.Click += btnTestAction_Click; // // label7 @@ -428,7 +427,6 @@ namespace FATrace.OEMApp // tabPage2.Controls.Add(dataGridView1); tabPage2.Controls.Add(materialCard1); - tabPage2.Controls.Add(videoView1); tabPage2.Font = new Font("Microsoft YaHei UI", 14.25F, FontStyle.Bold, GraphicsUnit.Point, 134); tabPage2.ImageKey = "Load.png"; tabPage2.Location = new Point(4, 5); @@ -445,13 +443,12 @@ namespace FATrace.OEMApp dataGridView1.Location = new Point(197, 235); dataGridView1.Name = "dataGridView1"; dataGridView1.ReadOnly = true; - dataGridView1.Size = new Size(835, 677); + dataGridView1.Size = new Size(1699, 677); dataGridView1.TabIndex = 11; // // materialCard1 // materialCard1.BackColor = Color.FromArgb(255, 255, 255); - materialCard1.Controls.Add(btnStopHistoryPlay); materialCard1.Controls.Add(label4); materialCard1.Controls.Add(txtSearchCode); materialCard1.Controls.Add(btnHistoryVideoSearch); @@ -467,20 +464,9 @@ namespace FATrace.OEMApp materialCard1.MouseState = ReaLTaiizor.Helper.MaterialDrawHelper.MaterialMouseState.HOVER; materialCard1.Name = "materialCard1"; materialCard1.Padding = new Padding(14); - materialCard1.Size = new Size(836, 194); + materialCard1.Size = new Size(1699, 194); materialCard1.TabIndex = 10; // - // btnStopHistoryPlay - // - btnStopHistoryPlay.Location = new Point(642, 132); - btnStopHistoryPlay.Name = "btnStopHistoryPlay"; - btnStopHistoryPlay.Size = new Size(116, 45); - btnStopHistoryPlay.TabIndex = 12; - btnStopHistoryPlay.Text = "停止播放"; - btnStopHistoryPlay.UseVisualStyleBackColor = true; - btnStopHistoryPlay.Visible = false; - btnStopHistoryPlay.Click += btnStopHistoryPlay_Click; - // // label4 // label4.AutoSize = true; @@ -558,16 +544,6 @@ namespace FATrace.OEMApp PdtHistorySearchStart.Size = new Size(131, 32); PdtHistorySearchStart.TabIndex = 0; // - // videoView1 - // - videoView1.BackColor = Color.Black; - videoView1.Location = new Point(1043, 24); - videoView1.MediaPlayer = null; - videoView1.Name = "videoView1"; - videoView1.Size = new Size(857, 888); - videoView1.TabIndex = 7; - videoView1.Text = "videoView1"; - // // tabPage3 // tabPage3.Controls.Add(metroProgressBar1); @@ -723,6 +699,7 @@ namespace FATrace.OEMApp StartPosition = FormStartPosition.CenterScreen; Text = "添加剂追溯系统"; WindowState = FormWindowState.Maximized; + FormClosing += MainApp_FormClosing; Load += MainApp_Load; statusStrip1.ResumeLayout(false); statusStrip1.PerformLayout(); @@ -739,7 +716,6 @@ namespace FATrace.OEMApp ((System.ComponentModel.ISupportInitialize)dataGridView1).EndInit(); materialCard1.ResumeLayout(false); materialCard1.PerformLayout(); - ((System.ComponentModel.ISupportInitialize)videoView1).EndInit(); tabPage3.ResumeLayout(false); navPanel.ResumeLayout(false); ResumeLayout(false); @@ -761,7 +737,6 @@ namespace FATrace.OEMApp private Button btnStopLoadVideo; private ProgressBar DownloadProgressBar; private ReaLTaiizor.Controls.MetroProgressBar metroProgressBar1; - private LibVLCSharp.WinForms.VideoView videoView1; private ReaLTaiizor.Controls.MaterialCard materialCard1; private ReaLTaiizor.Controls.PoisonDateTime PdtHistorySearchStart; private Label label1; @@ -772,7 +747,6 @@ namespace FATrace.OEMApp private Label label4; private TextBox txtSearchCode; private DataGridView dataGridView1; - private Button btnStopHistoryPlay; private ReaLTaiizor.Controls.MaterialCard materialCard2; private Label label5; private Label label6; diff --git a/FATrace.OEMApp/MainApp.cs b/FATrace.OEMApp/MainApp.cs index 596b5ce..a997b4c 100644 --- a/FATrace.OEMApp/MainApp.cs +++ b/FATrace.OEMApp/MainApp.cs @@ -4,12 +4,14 @@ using FATrace.HKNetLib.Wrapper; using FATrace.Model; using FATrace.OEMApp.Services; using FATrace.OEMApp.Model; +using System.Diagnostics; using System.Threading.Tasks; using LibVLCSharp.Shared; using NLog; using ReaLTaiizor.Forms; using System.Collections.Concurrent; using System.ComponentModel; +using System.Threading; using TaskStatus = FATrace.Model.TaskStatus; namespace FATrace.OEMApp @@ -41,6 +43,11 @@ namespace FATrace.OEMApp private int _lvLogMaxItems = 1000; private int _lastProgressLogged = -1; + /// + /// 关闭确认标记:用于避免重复弹窗(如关闭过程触发多次 OnFormClosing) + /// + private bool _closeConfirmed; + private void InitLvLog() { try @@ -82,7 +89,10 @@ namespace FATrace.OEMApp for (int i = 0; i < 200; i++) { if (LvLog.Items.Count == 0) break; LvLog.Items.RemoveAt(0); } } } - catch { } + catch (Exception ex) + { + LogError($"AppendLog: {ex.Message}"); + } } private void LogInfo(string msg) => AppendLog("INFO", msg, Color.FromArgb(33, 33, 33)); @@ -134,7 +144,7 @@ namespace FATrace.OEMApp /// PLC数据服务 /// private PLCDataService PLCDataService { get; set; } - private TimeClearDataService TimeClearService { get; set; } + //private TimeClearDataService TimeClearService { get; set; } private System.Windows.Forms.Timer _statusTimer; /// @@ -162,7 +172,10 @@ namespace FATrace.OEMApp { HkCameraClient.NVRLoadVideoProcessEventHandler += HkCameraClient_NVRLoadVideoProcessEventHandler; } - catch { } + catch (Exception ex) + { + LogError($"AppendLog: {ex.Message}"); + } //读取配置 //HkCameraClient.NVR_IP = ConfigHelper.GetValue("NVRIP"); @@ -198,7 +211,6 @@ namespace FATrace.OEMApp //NVR登录 NVRLogin(); - InitMediaPlayer(); InitHistoryGridBinding(); // 启动后台任务服务:下载队列(单线程顺序)与 Jellyfin 批量监控(并行匹配) @@ -212,11 +224,13 @@ namespace FATrace.OEMApp try { DownloadTaskWorker.Instance.TaskFailed += OnTaskFailed; } catch { } // JellyfinMonitorQueueService.Instance.Start(); // LogInfo("Jellyfin 监控服务已启动"); - LogInfo("Jellyfin 监控服务已停用"); - TimeClearService = new TimeClearDataService(); - TimeClearService.Info += (m) => LogInfo($"[清理]{m}"); - TimeClearService.Start(); - LogInfo("定时清理服务已启动"); + //LogInfo("Jellyfin 监控服务已停用"); + + //TimeClearService = new TimeClearDataService(); + //TimeClearService.Info += (m) => LogInfo($"[清理]{m}"); + //TimeClearService.Start(); + + //LogInfo("定时清理服务已启动"); } catch (Exception ex) { @@ -230,7 +244,7 @@ namespace FATrace.OEMApp RefreshRuLogGrid(); // 初始化底部连接状态(立即检测一次 + 定时轻量检测) - SafeSetStatus(tslPlcConnection, PLCDataService?.PlcConnected == true, "Plc连接状态"); + //SafeSetStatus(tslPlcConnection, PLCDataService?.PlcConnected == true, "Plc连接状态"); _ = UpdateDbStatusAsync(); _ = UpdateNasStatusAsync(); _ = UpdateNvrStatusAsync(); @@ -464,42 +478,41 @@ namespace FATrace.OEMApp #region 视频播放 - private LibVLC _libVLC; - private MediaPlayer _mediaPlayer; - - /// - /// 初始化MediaPlay - /// - private void InitMediaPlayer() + private static async Task FileExistsWithTimeoutAsync(string path, int timeoutMs, CancellationToken cancellationToken) { - _libVLC = new LibVLC(); - _mediaPlayer = new MediaPlayer(_libVLC); - videoView1.MediaPlayer = _mediaPlayer; - + var task = Task.Run(() => File.Exists(path), cancellationToken); + var done = await Task.WhenAny(task, Task.Delay(timeoutMs, cancellationToken)); + if (done != task) return false; + return await task; } + private void OpenVideoWithDefaultPlayer(string path) + { + if (string.IsNullOrWhiteSpace(path)) + { + throw new ArgumentException("视频路径为空", nameof(path)); + } + + try + { + var psi = new ProcessStartInfo + { + FileName = path, + UseShellExecute = true + }; + Process.Start(psi); + LogInfo($"已使用系统播放器打开: {path}"); + } + catch (Exception ex) + { + LogError($"系统播放器打开失败: {ex.Message} | {path}"); + throw; + } + } + + #endregion - /// - /// 停止播放当前的视频文件 - /// - /// - /// - private void btnStopHistoryPlay_Click(object sender, EventArgs e) - { - _mediaPlayer.Stop(); - } - - /// - /// 清理播放资源 - /// - private void CleanMediaPlay() - { - _mediaPlayer.Stop(); - _mediaPlayer.Dispose(); - _libVLC.Dispose(); - } - #region 历史数据查询 @@ -582,7 +595,7 @@ namespace FATrace.OEMApp /// /// 双击行,播放该行对应的视频文件 /// - private void DataGridView1_CellDoubleClick(object? sender, DataGridViewCellEventArgs e) + private async void DataGridView1_CellDoubleClick(object? sender, DataGridViewCellEventArgs e) { if (e.RowIndex < 0) return; // 双击列头等 try @@ -596,14 +609,16 @@ namespace FATrace.OEMApp MessageBox.Show("该记录没有可播放的视频路径。", "播放提示", MessageBoxButtons.OK, MessageBoxIcon.Information); return; } - if (!File.Exists(path)) + + using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(5)); + var exists = await FileExistsWithTimeoutAsync(path, timeoutMs: 4000, cts.Token); + if (!exists) { - MessageBox.Show($"未找到视频文件:\n{path}", "播放失败", MessageBoxButtons.OK, MessageBoxIcon.Warning); + MessageBox.Show($"未找到视频文件或访问超时(网络盘可能较慢):\n{path}", "播放失败", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } - _mediaPlayer?.Stop(); - _mediaPlayer?.Play(new LibVLCSharp.Shared.Media(_libVLC, path)); + OpenVideoWithDefaultPlayer(path); } } catch (Exception ex) @@ -673,6 +688,13 @@ namespace FATrace.OEMApp continue; } + // 隐藏视频路径列(仍保留数据用于双击播放) + if (propName == nameof(OEMRawUse.VideoFilePath)) + { + col.Visible = false; + continue; + } + // 仅显示指定字段,其他隐藏 if (!allowedProps.Contains(propName)) { @@ -714,13 +736,29 @@ namespace FATrace.OEMApp /// private void btnTestAction_Click(object sender, EventArgs e) { - if (CurParsedCodeInfo == null) return; + if (CurParsedCodeInfo == null) + { + CurParsedCodeInfo = new ParsedCodeInfo() + { + Batch = "260131", + Code = "DYG05030013,250710,8228,12,01,7", + Count = 1, + RawCode = "DYG05030013", + RawName = "", + RegionCode = "2", + RegionName = "1", + ShelfLifeMonths = 12, + Weight = (decimal)80.25, + }; + //return; + } + var taskId = DownloadTaskWorker.Instance.Enqueue( CurParsedCodeInfo, user: CurUserName, - start: DateTime.Now.AddDays(-2), - end: DateTime.Now.AddDays(-2).AddSeconds(DownloadTaskWorker.VideoTime) + start: DateTime.Now, + end: DateTime.Now.AddSeconds(DownloadTaskWorker.VideoTime) ); //MessageBox.Show($"[Test] 已入队下载任务,Id={taskId}"); } @@ -965,6 +1003,7 @@ namespace FATrace.OEMApp } catch (Exception ex) { + LogError($"[gridRULog] 刷新失败: {ex.Message}"); System.Diagnostics.Debug.WriteLine($"[gridRULog] 刷新失败: {ex.Message}"); } } @@ -992,7 +1031,10 @@ namespace FATrace.OEMApp _ = SaveCsvForTaskAsync(t); } } - catch { } + catch (Exception ex) + { + LogError($"[OnTaskStatusChanged] 失败: {ex.Message}"); + } } private void OnTaskFailed(DownloadTask t, string? error) @@ -1011,7 +1053,10 @@ namespace FATrace.OEMApp // 失败同样清零进度 ResetProgressBar(); } - catch { } + catch (Exception ex) + { + LogError($"[OnTaskFailed] 失败: {ex.Message}"); + } } private void UpsertRuLogRowFromTask(DownloadTask t) @@ -1098,7 +1143,10 @@ namespace FATrace.OEMApp txtCsvSaveState.ForeColor = ok ? Color.ForestGreen : Color.DarkRed; } } - catch { } + catch (Exception ex) + { + LogError($"[SafeSetCsvState] 失败: {ex.Message}"); + } } private static void SetDataGridViewDoubleBuffered(DataGridView dgv) @@ -1123,29 +1171,6 @@ namespace FATrace.OEMApp HkCameraClient.Sdk_NET_DVR_StopGetFile(); } - protected async override void OnFormClosing(FormClosingEventArgs e) - { - try { DownloadTaskWorker.Instance.DownloadFileNameChanged -= OnDownloadFileNameChanged; } catch { } - try { DownloadTaskWorker.Instance.TaskStarted -= OnTaskStatusChanged; } catch { } - try { DownloadTaskWorker.Instance.TaskCompleted -= OnTaskStatusChanged; } catch { } - try { DownloadTaskWorker.Instance.TaskFailed -= OnTaskFailed; } catch { } - try { _statusTimer?.Stop(); _statusTimer?.Dispose(); _statusTimer = null; } catch { } - try { TimeClearService?.Stop(); } catch { } - try - { - if (TouchSocketServer != null && TouchSocketServer.IsRunning) - { - await TouchSocketServer.StopAsync(); - LogInfo("TouchSocket Server 已停止"); - } - } - catch (Exception ex) - { - LogError($"TouchSocket Server 停止失败: {ex.Message}"); - } - base.OnFormClosing(e); - } - /// /// 当前下载文件的名称改变 /// @@ -1165,7 +1190,10 @@ namespace FATrace.OEMApp } } - catch { } + catch (Exception ex) + { + LogError($"OnDownloadFileNameChanged: {ex.Message}"); + } } private void TouchSocketServer_ClientConnected(object? sender, TouchSocketServer.ClientConnectedEventArgs e) @@ -1208,8 +1236,9 @@ namespace FATrace.OEMApp end: DateTime.Now ); } - catch + catch (Exception ex) { + LogError($"TouchSocketServer_DataReceived: {ex.Message}"); return; } } @@ -1245,7 +1274,10 @@ namespace FATrace.OEMApp }; _statusTimer.Start(); } - catch { } + catch (Exception ex) + { + LogError($"StartStatusTimer: {ex.Message}"); + } } private void SafeSetStatus(ToolStripStatusLabel lbl, bool ok, string title) @@ -1263,7 +1295,10 @@ namespace FATrace.OEMApp lbl.Text = text; lbl.ForeColor = fore; } } - catch { } + catch (Exception ex) + { + LogError($"SafeSetStatus: {ex.Message}"); + } } private async Task UpdateDbStatusAsync() @@ -1306,5 +1341,57 @@ namespace FATrace.OEMApp SafeSetStatus(tslNVRConnection, ok, "NVR连接状态"); } #endregion + + private void MainApp_FormClosing(object sender, FormClosingEventArgs e) + { + if (!_closeConfirmed && e.CloseReason == CloseReason.UserClosing) + { + try + { + var result = MessageBox.Show( + "确认退出系统?", + "退出确认", + MessageBoxButtons.YesNo, + MessageBoxIcon.Question, + MessageBoxDefaultButton.Button2); + + if (result != DialogResult.Yes) + { + e.Cancel = true; + LogInfo("已取消关闭"); + return; + } + + _closeConfirmed = true; + LogInfo("用户确认关闭,开始退出"); + } + catch (Exception ex) + { + // 弹窗异常时,为保证可关闭,默认继续退出,但记录日志 + LogError($"关闭确认弹窗异常: {ex.Message}"); + _closeConfirmed = true; + } + } + + try { DownloadTaskWorker.Instance.DownloadFileNameChanged -= OnDownloadFileNameChanged; } catch { } + try { DownloadTaskWorker.Instance.TaskStarted -= OnTaskStatusChanged; } catch { } + try { DownloadTaskWorker.Instance.TaskCompleted -= OnTaskStatusChanged; } catch { } + try { DownloadTaskWorker.Instance.TaskFailed -= OnTaskFailed; } catch { } + try { _statusTimer?.Stop(); _statusTimer?.Dispose(); _statusTimer = null; } catch { } + //try { TimeClearService?.Stop(); } catch { } + try + { + if (TouchSocketServer != null && TouchSocketServer.IsRunning) + { + //await TouchSocketServer.cl(); + LogInfo("TouchSocket Server 已停止"); + } + } + catch (Exception ex) + { + LogError($"TouchSocket Server 停止失败: {ex.Message}"); + } + + } } } diff --git a/FATrace.OEMApp/MainApp.resx b/FATrace.OEMApp/MainApp.resx index 3610f61..3905ee9 100644 --- a/FATrace.OEMApp/MainApp.resx +++ b/FATrace.OEMApp/MainApp.resx @@ -128,7 +128,7 @@ AAEAAAD/////AQAAAAAAAAAMAgAAAEZTeXN0ZW0uV2luZG93cy5Gb3JtcywgQ3VsdHVyZT1uZXV0cmFs LCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAAmU3lzdGVtLldpbmRvd3MuRm9ybXMu SW1hZ2VMaXN0U3RyZWFtZXIBAAAABERhdGEHAgIAAAAJAwAAAA8DAAAAaCEAAAJNU0Z0AUkBTAIBAQgB - AAHoAQEB6AEBARABAAEQAQAE/wEhAQAI/wFCAU0BNgcAATYDAAEoAwABQAMAATADAAEBAQABIAYAATD/ + AAEwAQIBMAECARABAAEQAQAE/wEhAQAI/wFCAU0BNgcAATYDAAEoAwABQAMAATADAAEBAQABIAYAATD/ AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AFIAAdsBlgESAf8B2wGWARIB/wQAAxIBGANJAYgB 2wGWARIB/wHbAZYBEgH/AdsBlgESAf8B2wGWARIB/wHbAZYBEgH/AdsBlgESAf8B2wGWARIB/wQAAdsB lgESAf8B2wGWARIB/wHbAZYBEgH/AdsBlgESAf8B2wGWARIB/wHbAZYBEgH/AdsBlgESAf8UAAHbAZYB @@ -280,8 +280,8 @@ AAEAAAD/////AQAAAAAAAAAMAgAAAEZTeXN0ZW0uV2luZG93cy5Gb3JtcywgQ3VsdHVyZT1uZXV0cmFs LCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAAmU3lzdGVtLldpbmRvd3MuRm9ybXMu - SW1hZ2VMaXN0U3RyZWFtZXIBAAAABERhdGEHAgIAAAAJAwAAAA8DAAAA9gUAAAJNU0Z0AUkBTAMBAQAB - QAEAAUABAAEQAQABEAEABP8BIQEACP8BQgFNATYHAAE2AwABKAMAAUADAAEQAwABAQEAASAGAAEQKgAB + SW1hZ2VMaXN0U3RyZWFtZXIBAAAABERhdGEHAgIAAAAJAwAAAA8DAAAA9AUAAAJNU0Z0AUkBTAMBAQAB + iAEAAYgBAAEQAQABEAEABP8BIQEACP8BQgFNATYHAAE2AwABKAMAAUADAAEQAwABAQEAASAGAAEQKgAB 2wGWARIB/wHbAZYBEgH/AdsBlgESAf8B2wGWARIB/wHbAZYBEgH/5AAB2wGWARIB/wHbAZYBEgH/AdsB lgESAf8B2wGWARIB/wHbAZYBEgH/AdsBlgESAf8B2wGWARIB/wHbAZYBEgH/AdsBlgESAf/YAAHbAZYB EgH/AdsBlgESAf8B2wGWARIB/wHbAZYBEgH/AdsBlgESAf8B2wGWARIB/wHbAZYBEgH/AdsBlgESAf8B @@ -298,15 +298,15 @@ /wHbAZYBEgH/AdsBlgESAf/EAAHbAZYBEgH/AdsBlgESAf8B2wGWARIB/wHbAZYBEgH/AdsBlgESAf8B 2wGWARIB/wHbAZYBEgH/AdsBlgESAf8B2wGWARIB/wHbAZYBEgH/AdsBlgESAf8B2wGWARIB/wHbAZYB EgH/AdsBlgESAf8B2wGWARIB/8QAAxIBGAHbAZYBEgH/AdsBlgESAf8B2wGWARIB/wHbAZYBEgH/AdsB - lgESAf8B2wGWARIB/wQAAVsCWgG/AdsBlgESAf8B2wGWARIB/wHbAZYBEgH/AdsBlgESAf8B2wGWARIB - /8wAAdsBlgESAf8B2wGWARIB/wHbAZYBEgH/AdsBlgESAf8B2wGWARIB/wHbAZYBEgH/CAAB2wGWARIB - /wHbAZYBEgH/AdsBlgESAf8B2wGWARIB/wHbAZYBEgH/0AAB2wGWARIB/wHbAZYBEgH/AdsBlgESAf8B - 2wGWARIB/wHbAZYBEgH/AdsBlgESAf8DRAF4AdsBlgESAf8B2wGWARIB/wHbAZYBEgH/AdsBlgESAf/Y - AAHbAZYBEgH/AdsBlgESAf8B2wGWARIB/wHbAZYBEgH/AdsBlgESAf8B2wGWARIB/wHbAZYBEgH/AdsB - lgESAf8B2wGWARIB/+AAAxIBGAHbAZYBEgH/AdsBlgESAf8B2wGWARIB/wHbAZYBEgH/AdsBlgESAf// - ANUAAUIBTQE+BwABPgMAASgDAAFAAwABEAMAAQEBAAEBBQABgBcAA/8BAAH8AR8GAAHwAQcGAAHgAQMG - AAHBAYEGAALBBgABgQGABgABgQGABgABgwGABgABgAHABgABgAcAAYABgQYAAcABwQYAAeABAwYAAfAB - BwYAAfgBHwYAAv8GAAs= + lgESAf8B2wGWARIB/wQAA1oBvwHbAZYBEgH/AdsBlgESAf8B2wGWARIB/wHbAZYBEgH/AdsBlgESAf/M + AAHbAZYBEgH/AdsBlgESAf8B2wGWARIB/wHbAZYBEgH/AdsBlgESAf8B2wGWARIB/wgAAdsBlgESAf8B + 2wGWARIB/wHbAZYBEgH/AdsBlgESAf8B2wGWARIB/9AAAdsBlgESAf8B2wGWARIB/wHbAZYBEgH/AdsB + lgESAf8B2wGWARIB/wHbAZYBEgH/A0QBeAHbAZYBEgH/AdsBlgESAf8B2wGWARIB/wHbAZYBEgH/2AAB + 2wGWARIB/wHbAZYBEgH/AdsBlgESAf8B2wGWARIB/wHbAZYBEgH/AdsBlgESAf8B2wGWARIB/wHbAZYB + EgH/AdsBlgESAf/gAAMSARgB2wGWARIB/wHbAZYBEgH/AdsBlgESAf8B2wGWARIB/wHbAZYBEgH//wDV + AAFCAU0BPgcAAT4DAAEoAwABQAMAARADAAEBAQABAQUAAYAXAAP/AQAB/AEfBgAB8AEHBgAB4AEDBgAB + wQGBBgACwQYAAYEBgAYAAYEBgAYAAYMBgAYAAYABwAYAAYAHAAGAAYEGAAHAAcEGAAHgAQMGAAHwAQcG + AAH4AR8GAAL/BgAL diff --git a/FATrace.WPLApp/App.xaml.cs b/FATrace.WPLApp/App.xaml.cs index 6de2503..ac8aea4 100644 --- a/FATrace.WPLApp/App.xaml.cs +++ b/FATrace.WPLApp/App.xaml.cs @@ -74,6 +74,10 @@ namespace FATrace.WPLApp // 应用主题样式 Syncfusion.SfSkinManager.SfSkinManager.ApplyStylesOnApplication = true; + //从容器中获取MainView的实例对象 + var container = ContainerLocator.Container; + var shell = container.Resolve("MainView"); + // 先显示 Shell,避免耗时初始化阻塞界面呈现 base.OnInitialized(); @@ -81,7 +85,7 @@ namespace FATrace.WPLApp LogService = Container.Resolve(); LogService.Info("OnInitialized-UI Ready"); - if (Current.MainWindow is Window view) + if (shell is Window view) { var regionManager = Container.Resolve(); RegionManager.SetRegionManager(view, regionManager); @@ -98,9 +102,9 @@ namespace FATrace.WPLApp LogService?.Error("Current.MainWindow 为 null,执行回退创建 MainView"); try { - var fallback = new MainView(); - Current.MainWindow = fallback; - fallback.Show(); + //var fallback = new MainView(); + //Current.MainWindow = fallback; + //fallback.Show(); } catch (Exception ex) { @@ -161,26 +165,8 @@ namespace FATrace.WPLApp regionAdapterMappings.RegisterMapping(typeof(SfNavigationDrawer), Container.Resolve()); } - protected override Window CreateShell() - { - try - { - return Container.Resolve(); - } - catch (Exception ex) - { - // 记录并回退到直接创建,避免因容器解析失败导致无界面 - Debug.WriteLine($"CreateShell 容器解析 MainView 失败: {ex}"); - try - { - return new MainView(); - } - catch - { - throw; // 让全局异常处理捕获 - } - } - } + protected override Window CreateShell() => null; + protected override void RegisterTypes(IContainerRegistry containerRegistry) { diff --git a/FATrace.WPLApp/Views/MainView.xaml b/FATrace.WPLApp/Views/MainView.xaml index cc5ee6a..a6149a3 100644 --- a/FATrace.WPLApp/Views/MainView.xaml +++ b/FATrace.WPLApp/Views/MainView.xaml @@ -16,7 +16,7 @@ WindowStartupLocation="CenterScreen" WindowState="Maximized" WindowStyle="None" - mc:Ignorable="d"> + mc:Ignorable="d" Closing="ChromelessWindow_Closing" Closed="ChromelessWindow_Closed">