从Silverlight强制进行横向打印?

从Silverlight强制进行横向打印?,第1张

概述使用Silverlight 4,是否可以在横向模式下打印网格并显示所有内容?我们将“页面”构建为网格,并从PrintDocument的PrintableArea设置转置的高度/宽度.然后我们应用CompositeTransform来设置Rotation和TranslateX.基本上,它与 solution found here非常相似. 这样可以正确旋转内容,并且所有内容都显示为拉伸页面的宽度(在 使用Silverlight 4,是否可以在横向模式下打印网格并显示所有内容?我们将“页面”构建为网格,并从Printdocument的PrintableArea设置转置的高度/宽度.然后我们应用Compositetransform来设置Rotation和TranslateX.基本上,它与 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的裁剪.所以我仍然在寻找想法/解决方案……

解决方法 如果没有任何基本的Xaml,很难确定问题是什么.不过我打算去这里打一个平底船.

您正在使用Rendertransform,但应用了变换的元素将向其容器报告原始未变换的尺寸.结果,容器基于该信息进行剪裁.

我建议解决方案是在您的应用程序中包含Silverlight Toolkit,特别是Layouttransformer控件.将包含的页面放在此控件中.然后Layouttransformer将在其Layouttransform属性中接受您的Compositetransform.这里的区别是Layouttransformer报告是应用转换后的维度.因此它的容器不应该夹住它.

总结

以上是内存溢出为你收集整理的从Silverlight强制进行横向打印?全部内容,希望文章能够帮你解决从Silverlight强制进行横向打印?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1007482.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-22
下一篇2022-05-22

发表评论

登录后才能评论

评论列表(0条)

    保存