Grid
,并从PrintDocument的PrintableArea设置转置高度/宽度。 然后,我们应用CompositeTransform
来设置旋转和TranslateX。 基本上,它非常类似于此处找到的解决方案。这样可以正确旋转内容,并且所有内容似乎都被拉伸到页面的宽度(在这种情况下是高度),但底部部分被剪切掉了。 它几乎像是内容以正常页面宽度(通常为8.5英寸)显示,尽管它被渲染为页面的高度(11英寸高)。 因此,价值2.5英寸的内容会出现为空白内容,位于页面底部。
注意:我们不是从UI中提取现有的可视元素放入“页面”网格中。我们正在定义DataTemplates
并将VM传递给DataContext。就这方面而言,所有内容都被绑定和正确显示,但渲染到打印文档时出了问题。
我们是否遗漏了什么?我们希望避免必须先呈现页面的位图,但如果必须这样做...
更新:根据进一步的调查(并与开始处理报告的团队成员交谈),该代码非常基于Pete Brown的客户端打印。我们对报表进行了分组和增强功能的扩展,但整体布局处理是相同的引擎。
如果您查看Pete Brown的代码,在GetNewPage
方法中,我们目前使用的区别如下:
...
this.CurrentPageNumber++;
Grid pagePanel = new Grid();
LayoutTransformer layoutTransformer = new LayoutTransformer
{
Content = pagePanel,
Tag = this.CurrentPageNumber
};
if (printableArea.Height > printableArea.Width)
{
// printable area is in Portrait mode.
layoutTransformer.Height = printableArea.Width;
layoutTransformer.Width = printableArea.Height;
var transform = new CompositeTransform
{
Rotation = 90,
TranslateX = printableArea.Width,
ScaleX = 1,
ScaleY = 1
};
layoutTransformer.LayoutTransform = transform;
layoutTransformer.ApplyLayoutTransform();
layoutTransformer.RenderTransform = transform;
}
else
{
// printable area is in Landscape mode
layoutTransformer.Height = printableArea.Height;
layoutTransformer.Width = printableArea.Width;
}
Size pageSize = new Size(layoutTransformer.Width, layoutTransformer.Height);
layoutTransformer.HorizontalAlignment = HorizontalAlignment.Stretch;
layoutTransformer.VerticalAlignment = VerticalAlignment.Stretch;
RowDefinition headerRow = new RowDefinition { Height = GridLength.Auto };
RowDefinition itemsRow = new RowDefinition { Height = new GridLength(1, GridUnitType.Star) };
RowDefinition footerRow = new RowDefinition { Height = GridLength.Auto };
pagePanel.RowDefinitions.Add(headerRow);
pagePanel.RowDefinitions.Add(itemsRow);
pagePanel.RowDefinitions.Add(footerRow);
...
这个自动旋转的功能很好,但是宽度仍然被裁剪,就像渲染页面宽度仍然是纵向一样。即使我已经改变了所有的测量值来进行交换,调用
InvalidateMeasure()
和InvalidateArrangement()
也没有改变输出结果。奇怪的是,当我将ScaleX
改为大于1时,它会拉伸被裁剪的内容以填充更多的页面。所以似乎父容器在变换之前被裁剪了,尽管代码声明不是这样的。基本上,这似乎是Shawn Wildermuth博客中提到的剪切问题。所以我还在寻找想法/解决方案...
LayoutTransformer
,但是我已经在问题中更新了有关报告的信息。不知道这是否会改变您的回答。 - Agent_9191