From 3cc830b37ba4f93bb4e5b22c64c95c4d7e82563e Mon Sep 17 00:00:00 2001
From: CJKmkp <2564608840@qq.com>
Date: Sat, 14 Mar 2026 17:08:26 +0800
Subject: [PATCH] =?UTF-8?q?improve:=E5=B1=95=E5=8F=B0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
Ink Canvas/MainWindow_cs/MW_VideoPresenter.cs | 81 +++++++++++++++++--
1 file changed, 73 insertions(+), 8 deletions(-)
diff --git a/Ink Canvas/MainWindow_cs/MW_VideoPresenter.cs b/Ink Canvas/MainWindow_cs/MW_VideoPresenter.cs
index b8be0c01..e55d24c8 100644
--- a/Ink Canvas/MainWindow_cs/MW_VideoPresenter.cs
+++ b/Ink Canvas/MainWindow_cs/MW_VideoPresenter.cs
@@ -142,6 +142,36 @@ namespace Ink_Canvas
}
}
+ private void CloseVideoPresenterSidebarAndReleaseResources()
+ {
+ if (VideoPresenterSidebar != null)
+ {
+ VideoPresenterSidebar.Visibility = Visibility.Collapsed;
+ }
+
+ StopVideoPresenterPreviewAndFrameCache(clearPreviewImage: true);
+ }
+
+ private void StopVideoPresenterPreviewAndFrameCache(bool clearPreviewImage)
+ {
+ if (BtnCapturePhoto != null)
+ {
+ BtnCapturePhoto.IsEnabled = false;
+ }
+
+ if (clearPreviewImage && VideoPresenterPreviewImage != null)
+ {
+ VideoPresenterPreviewImage.Source = null;
+ }
+
+ try { _cameraService?.StopPreview(); } catch (Exception ex) { System.Diagnostics.Debug.WriteLine(ex); }
+ lock (_videoPresenterFrameLock)
+ {
+ _lastFrame?.Dispose();
+ _lastFrame = null;
+ }
+ }
+
///
/// 延迟初始化摄像头服务并订阅其帧和错误事件;如果服务已存在则不做任何操作。
///
@@ -442,6 +472,7 @@ namespace Ink_Canvas
ApplyBoothButtonHighlight(BtnToggleVideoPresenterLiveOnCanvas, true);
int page = GetCurrentPageIndex();
_liveEnabledPages.Add(page);
+ StartVideoPresenterPreviewForCurrentPageIfNeeded();
var img = EnsureLiveFrameElementForPage(page);
ApplyLiveFrameLayoutForPage(page, img);
@@ -489,6 +520,44 @@ namespace Ink_Canvas
}
catch (Exception ex) { System.Diagnostics.Debug.WriteLine(ex); }
}
+
+ if (_liveEnabledPages.Count == 0)
+ {
+ StopVideoPresenterPreviewAndFrameCache(clearPreviewImage: false);
+ }
+ }
+
+ private void StartVideoPresenterPreviewForCurrentPageIfNeeded()
+ {
+ try
+ {
+ EnsureCameraService();
+ if (_cameraService == null || _cameraService.IsCapturing) return;
+
+ int page = GetCurrentPageIndex();
+ int idx = 0;
+ if (_cameraIndexByPage.TryGetValue(page, out int savedIdx))
+ {
+ idx = savedIdx;
+ }
+
+ if (_cameraService.AvailableCameras == null || _cameraService.AvailableCameras.Count == 0)
+ {
+ _cameraService.RefreshCameraList();
+ }
+
+ if (_cameraService.AvailableCameras == null || _cameraService.AvailableCameras.Count == 0)
+ {
+ return;
+ }
+
+ idx = Math.Max(0, Math.Min(idx, _cameraService.AvailableCameras.Count - 1));
+ _cameraService.StartPreview(idx);
+ }
+ catch (Exception ex)
+ {
+ LogHelper.WriteLogToFile($"启动视频展台预览失败: {ex.Message}", LogHelper.LogType.Error);
+ }
}
///
@@ -548,8 +617,9 @@ namespace Ink_Canvas
}
}
- // 按页摄像头索引:切页后自动切回该页的摄像头
- if (_cameraIndexByPage.TryGetValue(page, out int idx))
+ // 按页摄像头索引:仅在展台侧栏可见时,切页后自动切回该页的摄像头
+ if (VideoPresenterSidebar?.Visibility == Visibility.Visible
+ && _cameraIndexByPage.TryGetValue(page, out int idx))
{
EnsureCameraService();
_cameraService?.StartPreview(idx);
@@ -768,11 +838,7 @@ namespace Ink_Canvas
{
try
{
- // 收起侧栏
- if (VideoPresenterSidebar != null)
- {
- VideoPresenterSidebar.Visibility = Visibility.Collapsed;
- }
+ CloseVideoPresenterSidebarAndReleaseResources();
if (BtnToggleVideoPresenterLiveOnCanvas != null)
{
@@ -797,7 +863,6 @@ namespace Ink_Canvas
}
}
- try { _cameraService?.StopPreview(); } catch (Exception ex) { System.Diagnostics.Debug.WriteLine(ex); }
}
catch (Exception ex) { System.Diagnostics.Debug.WriteLine(ex); }
}