WPF MVVM binding controls with helper methods PDFTron PDFVie



我正在使用具有帮助程序函数的控件并将这些帮助程序函数公开给我的视图模型,正在努力解决 WPF MVVM 问题。

我正在使用显示 PDFDocument 对象的 PDFTron 查看器控件。该 PDF 文档中的项目以 PDFTron.Rect 结构的形式指定,元素以磅(1/72 英寸(和页码为单位

为了帮助将坐标系与屏幕位置相互转换,PDFTron ViewerControl本身具有各种功能。

例如,从屏幕点转换

Double x, y;
int page = Control.GetPageNumberFromScreenPt(x, y);
Control.ConvScreenPtToPagePt(ref x, ref y, page);

转换为屏幕点是从正在检查的对象

PDFTron.Rect r = Control.GetScreenRectForAnnot(embeddedObject, pageNumber);

在视图模型和 PDF 控件之间调用/公开或绑定此类函数的最佳方式是什么,因为我真的很想将数据绑定到坐标。

例如,我在 XAML 中定义了一个装饰器,它允许我通过拖动来移动从嵌入对象中读取的有关页面的图像,并且还可以调整图像大小。 视图模型知道,因为我的视图模型知道图像嵌入对象其页面和该页面上的矩形,但作为PDF坐标。 但这需要转换为 X、Y、宽度和高度的屏幕坐标,以便绑定到 XAML 属性。 我不太明白如何做到这一点,因为它似乎超出了数据转换器。

因此,xaml 中的控件具有以屏幕单位度量的属性

AdornerLeft="{Binding Data.X, Mode=TwoWay}"
AdornerTop="{Binding Data.Y, Mode=TwoWay}"
AdornerWidth="{Binding Data.Width, Mode=TwoWay}"
AdornerHeight="{Binding Data.Height, Mode=TwoWay}"

如果 X 和 Y 发生变化,我需要将更改最终反映为查看器的页面、x、y 坐标,因为它们是底层模型使用的坐标。 我确实想知道制作一系列依赖项属性是否明智,因此如果我更改一个属性,它会通过其他更改作为转换将更改涟漪? 因此,例如,我有一个属性ScreenY,当它发生变化时,它会更新PDFY和PDFPage,反之亦然,但这似乎过于复杂。 有什么建议吗?

通常,在用户交互期间,当用户移动图像并调整图像大小时,所有内容都会绘制在PDFViewWPF查看器的顶部。

您可以从PDFViewWPF.GetCanvas((获取一个Canvas对象,然后如果您愿意,可以在该对象上绘制图像。

此时,与 PDF 无关,您只是在处理 WPF 坐标。

只有当用户完成移动和拖动,并且您希望将图像添加到 PDF 页面(可能作为 Stamp 注释(,甚至将图像注入页面内容后,您才会擦除所有图形,并将图像注入到 PDF 中。只有在此时,您才需要在坐标系之间平移。

请仔细看看PDFViewWPFTools项目,看看如何创建类似矩形注释的东西。

这篇文章可能会为您提供额外的清晰度。

我最终使用 Prism 库和 eventAggregator 将详细信息传递回视图并获取结果,还使用事件来刷新视图。 来自PdfTron的PDFWPFViewer MVVM示例除了存在一些不正确绑定的问题外,本质上还使用共享的工具库,其作用类似于Windows表单库,没有控制装饰器拖动等行为。

最新更新