【发布时间】:2012-12-17 17:56:18
【问题描述】:
使用 Silverlight 4,是否可以在横向模式下打印网格并显示所有内容?我们将“页面”构建为Grid,并从 PrintDocument 的 PrintableArea 设置转置的高度/宽度。然后我们应用CompositeTransform 来设置旋转和平移。本质上,它与solution found here 非常相似。
这会使内容正确旋转,并且所有内容似乎都被拉伸到页面的宽度(好吧,在这种情况下是高度),但底部部分被切断了。它几乎就像以页面的正常宽度(通常为 8.5" 宽度)显示的内容一样,尽管它被渲染为页面的高度(11" 高度)。所以 2.5 英寸的内容在页面底部显示为空白内容。
注意:我们不会将现有的视觉元素从 UI 中拉出以放入“页面”网格中。我们正在定义DataTemplates 并将VM 传递给DataContext。就目前而言,所有内容都已正确绑定和显示,但打印文档的呈现出了问题。
我们有什么遗漏的吗?我们希望避免必须先渲染页面的位图,但如果这是我们必须做的......
更新:根据进一步调查(并与团队中开始编写报告的人交谈),代码很大程度上基于 Pete Brown's client side printing。我们对其进行了一些扩展,以对报表的功能进行分组和增强,但总体而言,布局处理是相同的引擎。
如果您查看 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 blogged about 的剪辑。所以我仍在寻找想法/解决方案......
【问题讨论】:
标签: silverlight printing