From acf0c17d7abc230423c467d4ff8c8e505d84a377 Mon Sep 17 00:00:00 2001 From: CJKmkp <2564608840@qq.com> Date: Sun, 5 Apr 2026 18:22:37 +0800 Subject: [PATCH] =?UTF-8?q?add:pdf=E6=8F=92=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MainWindow_cs/MW_ElementsControls.cs | 64 ++++++++++--------- .../MainWindow_cs/MW_FloatingBarIcons.cs | 7 ++ 2 files changed, 42 insertions(+), 29 deletions(-) diff --git a/Ink Canvas/MainWindow_cs/MW_ElementsControls.cs b/Ink Canvas/MainWindow_cs/MW_ElementsControls.cs index 334da5a8..d3652725 100644 --- a/Ink Canvas/MainWindow_cs/MW_ElementsControls.cs +++ b/Ink Canvas/MainWindow_cs/MW_ElementsControls.cs @@ -40,6 +40,9 @@ namespace Ink_Canvas private bool _pdfSidebarPositionRefreshPending; + /// 为 true 时,下一次成功算出 PDF 边界后的侧栏定位使用宿主 Visual 变换(仅用于刚插入/恢复 PDF 的首帧对齐)。 + private bool _pdfSidebarNextPositionUseHostTransform; + #region Image /// /// 处理图片插入按钮点击事件 @@ -99,6 +102,8 @@ namespace Ink_Canvas // 最后绑定事件处理器 BindElementEvents(element); + if (element is PdfEmbeddedView) + _pdfSidebarNextPositionUseHostTransform = true; SyncPdfPageSidebarWithCanvas(); LogHelper.WriteLogToFile($"图片插入完成: {element.Name}"); @@ -1055,6 +1060,7 @@ namespace Ink_Canvas InitializeElementTransform(view); BindElementEvents(view); inkCanvas.Children.Add(view); + _pdfSidebarNextPositionUseHostTransform = true; SyncPdfPageSidebarWithCanvas(); } catch (Exception ex) @@ -1681,8 +1687,22 @@ namespace Ink_Canvas } /// - /// 将 PDF 专用页码栏贴在当前 PDF 右侧。侧栏与 InkCanvas 不在同一视觉子树,需把墨迹坐标变换到侧栏父容器坐标系。 + /// 将 PDF 专用页码栏贴在当前 PDF 右侧。默认 Margin 与墨迹画布坐标一致;仅在 为 true 时用宿主变换对齐首帧。 /// + private void ApplyPdfSidebarMarginFromInkBounds(Rect b, double sidebarW, double sidebarH, out double left, out double top, out double maxLeft, out double maxTop) + { + left = b.Right + PdfPageSidebarGap; + top = b.Top + (b.Height * 0.5) - (sidebarH * 0.5); + maxLeft = Math.Max(0, inkCanvas.ActualWidth - sidebarW); + maxTop = Math.Max(0, inkCanvas.ActualHeight - sidebarH); + if (left > maxLeft) + { + double leftAlt = b.Left - PdfPageSidebarGap - sidebarW; + if (leftAlt >= 0) + left = leftAlt; + } + } + private void UpdatePdfPageSidebarPosition(FrameworkElement element) { try @@ -1696,6 +1716,8 @@ namespace Ink_Canvas return; } + bool wantHostOnce = _pdfSidebarNextPositionUseHostTransform; + pdfEl.UpdateLayout(); Rect b = GetElementActualBounds(pdfEl); if (b.Width <= 0 || b.Height <= 0 || double.IsNaN(b.Width) || double.IsNaN(b.Height)) @@ -1720,12 +1742,10 @@ namespace Ink_Canvas sidebarH = 220; Visual sidebarHost = VisualTreeHelper.GetParent(BorderPdfPageSidebar) as Visual; - double left; - double top; - double maxLeft; - double maxTop; + double left = 0, top = 0, maxLeft = 0, maxTop = 0; + bool hostOk = false; - if (sidebarHost != null) + if (wantHostOnce && sidebarHost != null) { try { @@ -1750,35 +1770,21 @@ namespace Ink_Canvas if (leftAlt >= 0) left = leftAlt; } + + hostOk = true; } catch { - left = b.Right + PdfPageSidebarGap; - top = b.Top + (b.Height * 0.5) - (sidebarH * 0.5); - maxLeft = Math.Max(0, inkCanvas.ActualWidth - sidebarW); - maxTop = Math.Max(0, inkCanvas.ActualHeight - sidebarH); - if (left > maxLeft) - { - double leftAlt = b.Left - PdfPageSidebarGap - sidebarW; - if (leftAlt >= 0) - left = leftAlt; - } - } - } - else - { - left = b.Right + PdfPageSidebarGap; - top = b.Top + (b.Height * 0.5) - (sidebarH * 0.5); - maxLeft = Math.Max(0, inkCanvas.ActualWidth - sidebarW); - maxTop = Math.Max(0, inkCanvas.ActualHeight - sidebarH); - if (left > maxLeft) - { - double leftAlt = b.Left - PdfPageSidebarGap - sidebarW; - if (leftAlt >= 0) - left = leftAlt; + hostOk = false; } } + if (!hostOk) + ApplyPdfSidebarMarginFromInkBounds(b, sidebarW, sidebarH, out left, out top, out maxLeft, out maxTop); + + if (wantHostOnce) + _pdfSidebarNextPositionUseHostTransform = false; + left = Math.Max(0, Math.Min(left, maxLeft)); top = Math.Max(0, Math.Min(top, maxTop)); diff --git a/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs b/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs index 5a245e03..9baa7736 100644 --- a/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs +++ b/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs @@ -1,3 +1,4 @@ +using Ink_Canvas.Controls; using Ink_Canvas.Helpers; using iNKORE.UI.WPF.Modern; using System; @@ -3832,6 +3833,8 @@ namespace Ink_Canvas SetCurrentToolMode(InkCanvasEditingMode.Select); UpdateCurrentToolMode("select"); HideSubPanels("select"); + if (element is PdfEmbeddedView) + _pdfSidebarNextPositionUseHostTransform = true; SyncPdfPageSidebarWithCanvas(); } } @@ -3899,6 +3902,8 @@ namespace Ink_Canvas SetCurrentToolMode(InkCanvasEditingMode.Select); UpdateCurrentToolMode("select"); HideSubPanels("select"); + if (element is PdfEmbeddedView) + _pdfSidebarNextPositionUseHostTransform = true; SyncPdfPageSidebarWithCanvas(); } } @@ -3966,6 +3971,8 @@ namespace Ink_Canvas SetCurrentToolMode(InkCanvasEditingMode.Select); UpdateCurrentToolMode("select"); HideSubPanels("select"); + if (element is PdfEmbeddedView) + _pdfSidebarNextPositionUseHostTransform = true; SyncPdfPageSidebarWithCanvas(); } }