我搜索了一些关于如何打印WPF控件的选项,并找到了一些解决方案。我需要将我的打印控件适应打印页面并保持宽高比(我的控件是正方形;数独网格)。
我找到了一个解决方案,可以调整控件的大小和位置以适应页面。这个方法很好用,但它也会重新定位我的窗口上的控件。
以下是我用于打印和缩放的代码:
//get selected printer capabilities
System.Printing.PrintCapabilities capabilities = dialog.PrintQueue.GetPrintCapabilities(dialog.PrintTicket);
//get scale of the print wrt to screen of WPF visual
double scale = Math.Min(capabilities.PageImageableArea.ExtentWidth / mrizka.ActualWidth, capabilities.PageImageableArea.ExtentHeight / mrizka.ActualHeight);
//Transform the Visual to scale
mrizka.LayoutTransform = new ScaleTransform(scale, scale);
//get the size of the printer page
Size sz = new Size(capabilities.PageImageableArea.ExtentWidth, capabilities.PageImageableArea.ExtentHeight);
//update the layout of the visual to the printer page size.
mrizka.Measure(sz);
mrizka.Arrange(new Rect(new Point(capabilities.PageImageableArea.OriginWidth, capabilities.PageImageableArea.OriginHeight), sz));
dialog.PrintVisual(mrizka, mrizka.getID().ToString());
我尝试了两种方法来解决这个问题:
克隆我的控件,然后转换克隆的控件,不影响原始控件。但是由于某些原因,我最终遇到了异常:提供的DependencyObject不是此Freezable的上下文,但在某些情况下却很奇怪。
还原大小和位置的更改。我尝试调用InvalidateArrange()方法,它似乎有效,但仅在第一次调用打印方法时有效。在第二次调用期间,它没有起作用。