【问题标题】:Force a landscape printing from Silverlight?强制从 Silverlight 进行横向打印?
【发布时间】: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


    【解决方案1】:

    使用canvas 容器控件,并旋转控件在画布内。

    经过几个小时的纯粹挫折后,我终于决定把这个东西放在画布里。瞧!!不再切断。

    查看以下 SMALL 测试应用程序进行演示。它只是一个带有打印按钮的页面。

    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Media;
    using System.Windows.Printing;
    using System.Windows.Shapes;
    
    namespace SilverlightApplication1 {
    
        public partial class MainPage : UserControl {
    
            public MainPage() {
                InitializeComponent();
            }
    
            private void Button_Click_1(object sender, RoutedEventArgs e) {
                PrintDocument PD = new PrintDocument();
                PD.PrintPage += PD_PrintPage;
                PD.Print("Print Test");
            }
    
            void PD_PrintPage(object sender, PrintPageEventArgs e) {
    
                Canvas OuterCanvas = new Canvas();
    
                /* a container for everything that will print */
                Border OuterBorder = new Border() {
                    BorderThickness = new Thickness(3),
                    BorderBrush = new SolidColorBrush(Colors.Red),
                    Margin = new Thickness(10)
                };
    
                double Width = e.PrintableArea.Width - OuterBorder.Margin.Left - OuterBorder.Margin.Right;
                double Height = e.PrintableArea.Height - OuterBorder.Margin.Top - OuterBorder.Margin.Bottom;
    
                /* NOTE: We're trying to force landscape, so swop the width and height */
                OuterBorder.Width = Height;
                OuterBorder.Height = Width;
    
                /* on portrait, this line goes down (leave the printer settings, we're trying to force landscape) */
                Line Line = new Line() {
                    X1 = OuterBorder.Width / 2,
                    Y1 = 0,
                    X2 = OuterBorder.Width / 2,
                    Y2 = OuterBorder.Height,
                    Stroke = new SolidColorBrush(Colors.Blue),
                    StrokeThickness = 3
                };
    
                OuterBorder.Child = Line;
    
                OuterCanvas.Children.Add(OuterBorder);
    
                /* rotate 90 degrees, and move into place */
                var transformGroup = new TransformGroup();
                transformGroup.Children.Add(new RotateTransform() { Angle = 90 });
                transformGroup.Children.Add(new TranslateTransform() { X = e.PrintableArea.Width });
                OuterBorder.RenderTransform = transformGroup;
    
                e.PageVisual = OuterCanvas;
    
                e.HasMorePages = false;
            }
        }
    }
    

    如果您移除外层画布,它会导致页面被截断,就好像仍在打印纵向一样。

    【讨论】:

      【解决方案2】:

      如果不看一些基本的 Xaml,就很难确定问题出在哪里。不过,我要在这里赌一把。

      您正在使用 RenderTransform,但应用了变换的元素将向其容器报告原始未变换的尺寸。结果,容器会根据该信息进行剪辑。

      我建议解决方案是在您的应用程序中包含 Silverlight 工具包,特别是 LayoutTransformer 控件。将页面内容放置在此控件内。然后LayoutTransformer 将在其LayoutTransform 属性中接受您的CompositeTransform。此处的区别在于LayoutTransformer 报告的维度是在它应用了转换之后。因此它的容器不应该夹住它。

      【讨论】:

      • 我会试一试LayoutTransformer,但我更新了问题中有关报告的信息。不知道这是否会改变你的反应。
      【解决方案3】:

      我一直在与同样的问题作斗争,对我来说我找到了答案。我一直在网上搜索。这是我找到答案的论坛帖子的链接 - http://forums.silverlight.net/t/237438.aspx/1?how+to+print+landscape+using+SL+print+API+

      那里的作者真的是有答案的人。秘密似乎在于调用 InvalidateArrange 和 InvalidateMeasure (哦,并将您的内容设置为拉伸)...

      【讨论】:

        猜你喜欢
        • 2011-11-04
        • 1970-01-01
        • 2010-09-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-15
        相关资源
        最近更新 更多