add:pdf插入
This commit is contained in:
@@ -52,6 +52,7 @@ namespace Ink_Canvas
|
|||||||
AnimationsHelper.HideWithSlideAndFade(TwoFingerGestureBorder);
|
AnimationsHelper.HideWithSlideAndFade(TwoFingerGestureBorder);
|
||||||
AnimationsHelper.HideWithSlideAndFade(BoardTwoFingerGestureBorder);
|
AnimationsHelper.HideWithSlideAndFade(BoardTwoFingerGestureBorder);
|
||||||
EnableTwoFingerGestureBorder.Visibility = Visibility.Collapsed;
|
EnableTwoFingerGestureBorder.Visibility = Visibility.Collapsed;
|
||||||
|
SyncPdfPageSidebarWithCanvas();
|
||||||
}
|
}
|
||||||
|
|
||||||
BtnHideInkCanvas_Click(BtnHideInkCanvas, null);
|
BtnHideInkCanvas_Click(BtnHideInkCanvas, null);
|
||||||
|
|||||||
@@ -35,6 +35,9 @@ namespace Ink_Canvas
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
private Point dragStartPoint;
|
private Point dragStartPoint;
|
||||||
|
|
||||||
|
/// <summary>页码侧栏当前订阅 <see cref="PdfEmbeddedView.PageNavigationStateChanged"/> 的 PDF 视图。</summary>
|
||||||
|
private PdfEmbeddedView _pdfPageSidebarEventSource;
|
||||||
|
|
||||||
#region Image
|
#region Image
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 处理图片插入按钮点击事件
|
/// 处理图片插入按钮点击事件
|
||||||
@@ -94,6 +97,8 @@ namespace Ink_Canvas
|
|||||||
// 最后绑定事件处理器
|
// 最后绑定事件处理器
|
||||||
BindElementEvents(element);
|
BindElementEvents(element);
|
||||||
|
|
||||||
|
SyncPdfPageSidebarWithCanvas();
|
||||||
|
|
||||||
LogHelper.WriteLogToFile($"图片插入完成: {element.Name}");
|
LogHelper.WriteLogToFile($"图片插入完成: {element.Name}");
|
||||||
}), DispatcherPriority.Loaded);
|
}), DispatcherPriority.Loaded);
|
||||||
};
|
};
|
||||||
@@ -526,9 +531,6 @@ namespace Ink_Canvas
|
|||||||
// 根据元素类型显示不同的选择工具栏
|
// 根据元素类型显示不同的选择工具栏
|
||||||
if (IsBitmapLikeCanvasElement(element))
|
if (IsBitmapLikeCanvasElement(element))
|
||||||
{
|
{
|
||||||
if (BorderPdfPageSidebar != null)
|
|
||||||
BorderPdfPageSidebar.Visibility = element is PdfEmbeddedView ? Visibility.Visible : Visibility.Collapsed;
|
|
||||||
|
|
||||||
// 显示图片选择工具栏并设置位置
|
// 显示图片选择工具栏并设置位置
|
||||||
if (BorderImageSelectionControl != null)
|
if (BorderImageSelectionControl != null)
|
||||||
{
|
{
|
||||||
@@ -540,25 +542,11 @@ namespace Ink_Canvas
|
|||||||
// 显示图片缩放选择点
|
// 显示图片缩放选择点
|
||||||
ShowImageResizeHandles(element);
|
ShowImageResizeHandles(element);
|
||||||
|
|
||||||
if (element is PdfEmbeddedView pdfView)
|
|
||||||
{
|
|
||||||
pdfView.PageNavigationStateChanged -= SelectedPdf_PageNavigationStateChanged;
|
|
||||||
pdfView.PageNavigationStateChanged += SelectedPdf_PageNavigationStateChanged;
|
|
||||||
UpdatePdfSidebarFromSelectedPdf();
|
|
||||||
UpdatePdfPageSidebarPosition(pdfView);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
ResetPdfSidebarToIdle();
|
|
||||||
|
|
||||||
// 墨迹选择工具栏通过GridInkCanvasSelectionCover的可见性来控制
|
// 墨迹选择工具栏通过GridInkCanvasSelectionCover的可见性来控制
|
||||||
// 不需要直接设置BorderStrokeSelectionControl.Visibility
|
// 不需要直接设置BorderStrokeSelectionControl.Visibility
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (BorderPdfPageSidebar != null)
|
|
||||||
BorderPdfPageSidebar.Visibility = Visibility.Collapsed;
|
|
||||||
ResetPdfSidebarToIdle();
|
|
||||||
|
|
||||||
// 隐藏图片选择工具栏
|
// 隐藏图片选择工具栏
|
||||||
if (BorderImageSelectionControl != null)
|
if (BorderImageSelectionControl != null)
|
||||||
{
|
{
|
||||||
@@ -586,6 +574,8 @@ namespace Ink_Canvas
|
|||||||
// 保持选择模式,这样用户可以直接点击墨迹来选择
|
// 保持选择模式,这样用户可以直接点击墨迹来选择
|
||||||
inkCanvas.EditingMode = InkCanvasEditingMode.Select;
|
inkCanvas.EditingMode = InkCanvasEditingMode.Select;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SyncPdfPageSidebarWithCanvas();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -602,15 +592,6 @@ namespace Ink_Canvas
|
|||||||
{
|
{
|
||||||
// 去除选中效果
|
// 去除选中效果
|
||||||
|
|
||||||
if (element is PdfEmbeddedView pdfView)
|
|
||||||
{
|
|
||||||
pdfView.PageNavigationStateChanged -= SelectedPdf_PageNavigationStateChanged;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (BorderPdfPageSidebar != null)
|
|
||||||
BorderPdfPageSidebar.Visibility = Visibility.Collapsed;
|
|
||||||
ResetPdfSidebarToIdle();
|
|
||||||
|
|
||||||
// 隐藏图片选择工具栏
|
// 隐藏图片选择工具栏
|
||||||
if (BorderImageSelectionControl != null)
|
if (BorderImageSelectionControl != null)
|
||||||
{
|
{
|
||||||
@@ -634,6 +615,8 @@ namespace Ink_Canvas
|
|||||||
{
|
{
|
||||||
inkCanvas.EditingMode = InkCanvasEditingMode.Select;
|
inkCanvas.EditingMode = InkCanvasEditingMode.Select;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SyncPdfPageSidebarWithCanvas();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -1527,8 +1510,9 @@ namespace Ink_Canvas
|
|||||||
// 设置工具栏位置
|
// 设置工具栏位置
|
||||||
BorderImageSelectionControl.Margin = new Thickness(toolbarLeft, toolbarTop, 0, 0);
|
BorderImageSelectionControl.Margin = new Thickness(toolbarLeft, toolbarTop, 0, 0);
|
||||||
|
|
||||||
if (element is PdfEmbeddedView && BorderPdfPageSidebar?.Visibility == Visibility.Visible)
|
var pdfTarget = GetPdfSidebarTargetElement();
|
||||||
UpdatePdfPageSidebarPosition(element);
|
if (pdfTarget != null && BorderPdfPageSidebar != null && BorderPdfPageSidebar.Visibility == Visibility.Visible)
|
||||||
|
UpdatePdfPageSidebarPosition(pdfTarget);
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
@@ -1538,6 +1522,67 @@ namespace Ink_Canvas
|
|||||||
|
|
||||||
private const double PdfPageSidebarGap = 10;
|
private const double PdfPageSidebarGap = 10;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 侧栏绑定的 PDF:若当前选中的是 PDF 则用该项;否则用画布上最后一个 PdfEmbeddedView。
|
||||||
|
/// </summary>
|
||||||
|
private PdfEmbeddedView GetPdfSidebarTargetElement()
|
||||||
|
{
|
||||||
|
if (inkCanvas == null) return null;
|
||||||
|
var pdfs = inkCanvas.Children.OfType<PdfEmbeddedView>().ToList();
|
||||||
|
if (pdfs.Count == 0) return null;
|
||||||
|
if (currentSelectedElement is PdfEmbeddedView sel && pdfs.Contains(sel))
|
||||||
|
return sel;
|
||||||
|
return pdfs[pdfs.Count - 1];
|
||||||
|
}
|
||||||
|
|
||||||
|
private void AttachPdfPageSidebarEvents(PdfEmbeddedView pdf)
|
||||||
|
{
|
||||||
|
if (pdf == null || _pdfPageSidebarEventSource == pdf) return;
|
||||||
|
DetachPdfPageSidebarEvents();
|
||||||
|
_pdfPageSidebarEventSource = pdf;
|
||||||
|
_pdfPageSidebarEventSource.PageNavigationStateChanged += SelectedPdf_PageNavigationStateChanged;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void DetachPdfPageSidebarEvents()
|
||||||
|
{
|
||||||
|
if (_pdfPageSidebarEventSource != null)
|
||||||
|
{
|
||||||
|
_pdfPageSidebarEventSource.PageNavigationStateChanged -= SelectedPdf_PageNavigationStateChanged;
|
||||||
|
_pdfPageSidebarEventSource = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 画布上存在 PDF 时始终显示右侧页码栏并跟随目标 PDF;无任何 PDF 时隐藏。
|
||||||
|
/// </summary>
|
||||||
|
private void SyncPdfPageSidebarWithCanvas()
|
||||||
|
{
|
||||||
|
if (BorderPdfPageSidebar == null || inkCanvas == null) return;
|
||||||
|
|
||||||
|
// 屏幕模式(已退出白板/黑板)下不显示侧栏,避免画布仍含 PDF 时栏残留在桌面上
|
||||||
|
if (currentMode == 0)
|
||||||
|
{
|
||||||
|
DetachPdfPageSidebarEvents();
|
||||||
|
BorderPdfPageSidebar.Visibility = Visibility.Collapsed;
|
||||||
|
ResetPdfSidebarToIdle();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var pdf = GetPdfSidebarTargetElement();
|
||||||
|
if (pdf == null)
|
||||||
|
{
|
||||||
|
DetachPdfPageSidebarEvents();
|
||||||
|
BorderPdfPageSidebar.Visibility = Visibility.Collapsed;
|
||||||
|
ResetPdfSidebarToIdle();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
AttachPdfPageSidebarEvents(pdf);
|
||||||
|
BorderPdfPageSidebar.Visibility = Visibility.Visible;
|
||||||
|
UpdatePdfSidebarFromPdf(pdf);
|
||||||
|
UpdatePdfPageSidebarPosition(pdf);
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 将 PDF 专用页码栏贴在当前所选 PDF 的右侧(画布坐标,与底部选中栏一致)。
|
/// 将 PDF 专用页码栏贴在当前所选 PDF 的右侧(画布坐标,与底部选中栏一致)。
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -1909,29 +1954,28 @@ namespace Ink_Canvas
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void UpdatePdfSidebarFromSelectedPdf()
|
private void UpdatePdfSidebarFromPdf(PdfEmbeddedView pdf)
|
||||||
{
|
{
|
||||||
if (currentSelectedElement is PdfEmbeddedView pdf)
|
if (pdf == null) return;
|
||||||
|
|
||||||
|
if (TextBlockPdfSidebarPageLabel != null)
|
||||||
{
|
{
|
||||||
if (TextBlockPdfSidebarPageLabel != null)
|
TextBlockPdfSidebarPageLabel.Text = pdf.PageLabelText;
|
||||||
{
|
TextBlockPdfSidebarPageLabel.Opacity = 1.0;
|
||||||
TextBlockPdfSidebarPageLabel.Text = pdf.PageLabelText;
|
}
|
||||||
TextBlockPdfSidebarPageLabel.Opacity = 1.0;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool prevOk = pdf.CanGoPrevious;
|
bool prevOk = pdf.CanGoPrevious;
|
||||||
bool nextOk = pdf.CanGoNext;
|
bool nextOk = pdf.CanGoNext;
|
||||||
if (BorderPdfSidebarPagePrev != null)
|
if (BorderPdfSidebarPagePrev != null)
|
||||||
{
|
{
|
||||||
BorderPdfSidebarPagePrev.Opacity = prevOk ? 1.0 : 0.35;
|
BorderPdfSidebarPagePrev.Opacity = prevOk ? 1.0 : 0.35;
|
||||||
BorderPdfSidebarPagePrev.IsHitTestVisible = prevOk;
|
BorderPdfSidebarPagePrev.IsHitTestVisible = prevOk;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (BorderPdfSidebarPageNext != null)
|
if (BorderPdfSidebarPageNext != null)
|
||||||
{
|
{
|
||||||
BorderPdfSidebarPageNext.Opacity = nextOk ? 1.0 : 0.35;
|
BorderPdfSidebarPageNext.Opacity = nextOk ? 1.0 : 0.35;
|
||||||
BorderPdfSidebarPageNext.IsHitTestVisible = nextOk;
|
BorderPdfSidebarPageNext.IsHitTestVisible = nextOk;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1939,7 +1983,11 @@ namespace Ink_Canvas
|
|||||||
{
|
{
|
||||||
Dispatcher.BeginInvoke(new Action(() =>
|
Dispatcher.BeginInvoke(new Action(() =>
|
||||||
{
|
{
|
||||||
UpdatePdfSidebarFromSelectedPdf();
|
if (sender is PdfEmbeddedView pdf)
|
||||||
|
{
|
||||||
|
UpdatePdfSidebarFromPdf(pdf);
|
||||||
|
UpdatePdfPageSidebarPosition(pdf);
|
||||||
|
}
|
||||||
if (currentSelectedElement != null && IsBitmapLikeCanvasElement(currentSelectedElement))
|
if (currentSelectedElement != null && IsBitmapLikeCanvasElement(currentSelectedElement))
|
||||||
{
|
{
|
||||||
UpdateImageSelectionToolbarPosition(currentSelectedElement);
|
UpdateImageSelectionToolbarPosition(currentSelectedElement);
|
||||||
@@ -1953,7 +2001,8 @@ namespace Ink_Canvas
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
if (currentSelectedElement is PdfEmbeddedView pdf && pdf.CanGoPrevious)
|
var pdf = GetPdfSidebarTargetElement();
|
||||||
|
if (pdf != null && pdf.CanGoPrevious)
|
||||||
await pdf.GoToPreviousPageAsync();
|
await pdf.GoToPreviousPageAsync();
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
@@ -1966,7 +2015,8 @@ namespace Ink_Canvas
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
if (currentSelectedElement is PdfEmbeddedView pdf && pdf.CanGoNext)
|
var pdf = GetPdfSidebarTargetElement();
|
||||||
|
if (pdf != null && pdf.CanGoNext)
|
||||||
await pdf.GoToNextPageAsync();
|
await pdf.GoToNextPageAsync();
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
|
|||||||
@@ -3568,6 +3568,8 @@ namespace Ink_Canvas
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SyncPdfPageSidebarWithCanvas();
|
||||||
}
|
}
|
||||||
|
|
||||||
private int BoundsWidth = 5;
|
private int BoundsWidth = 5;
|
||||||
@@ -3832,6 +3834,7 @@ namespace Ink_Canvas
|
|||||||
SetCurrentToolMode(InkCanvasEditingMode.Select);
|
SetCurrentToolMode(InkCanvasEditingMode.Select);
|
||||||
UpdateCurrentToolMode("select");
|
UpdateCurrentToolMode("select");
|
||||||
HideSubPanels("select");
|
HideSubPanels("select");
|
||||||
|
SyncPdfPageSidebarWithCanvas();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -3898,6 +3901,7 @@ namespace Ink_Canvas
|
|||||||
SetCurrentToolMode(InkCanvasEditingMode.Select);
|
SetCurrentToolMode(InkCanvasEditingMode.Select);
|
||||||
UpdateCurrentToolMode("select");
|
UpdateCurrentToolMode("select");
|
||||||
HideSubPanels("select");
|
HideSubPanels("select");
|
||||||
|
SyncPdfPageSidebarWithCanvas();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -3964,6 +3968,7 @@ namespace Ink_Canvas
|
|||||||
SetCurrentToolMode(InkCanvasEditingMode.Select);
|
SetCurrentToolMode(InkCanvasEditingMode.Select);
|
||||||
UpdateCurrentToolMode("select");
|
UpdateCurrentToolMode("select");
|
||||||
HideSubPanels("select");
|
HideSubPanels("select");
|
||||||
|
SyncPdfPageSidebarWithCanvas();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1517,6 +1517,8 @@ namespace Ink_Canvas
|
|||||||
currentMode = 0;
|
currentMode = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SyncPdfPageSidebarWithCanvas();
|
||||||
|
|
||||||
ClearStrokes(true);
|
ClearStrokes(true);
|
||||||
// 清空备份历史记录,防止退出白板时恢复已结束PPT的墨迹
|
// 清空备份历史记录,防止退出白板时恢复已结束PPT的墨迹
|
||||||
// 注意:这里只清空索引0的备份,不影响白板页面的墨迹(索引1及以上)
|
// 注意:这里只清空索引0的备份,不影响白板页面的墨迹(索引1及以上)
|
||||||
|
|||||||
Reference in New Issue
Block a user