使用Silverlight 4,是否可以在横向模式下打印网格并显示所有内容?我们正在构建“页面”作为Grid
,并从PrintDocument的PrintableArea设置转置的高度/宽度。然后我们应用CompositeTransform
来设置旋转和TranslateX。本质上,它与solution found here非常相似。从Silverlight强制进行景观打印?
这会使内容正确旋转,并且所有内容出现都会拉伸页面的宽度(以及此处的高度),但底部部分会被截断。它几乎就像显示为页面正常宽度的内容(通常是8.5“宽度),尽管它被渲染为页面高度(11”高度)。因此,2.5英寸的内容将作为页面底部的空白内容出现。
注意:我们不会将现有的可视元素从UI中拉出以放入“页面”网格。我们正在定义DataTemplates
并将虚拟机传递到DataContext,所有内容都被绑定并正确显示,但是打印文档的渲染出了问题。缺少?我们希望避免必须先渲染页面的位图,但如果这是我们必须做的...
更新:根据进一步调查(并与开始进行报告工作的团队中的人交谈),代码非常严重基于Pete Brown's client side printing。我们已经将它扩展了一些,以便对报告的功能进行分组和增强,但整体布局处理是相同的引擎。
如果你看看皮特·布朗的代码,我们使用的是当前的区别是在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。所以我仍在寻找想法/解决方案......
我会给'LayoutTransformer'一个镜头,但我更新了有关问题报告的信息。不知道这是否会改变你的回应。 –