2011-08-26 59 views
4

使用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。所以我仍在寻找想法/解决方案......

回答

1

难以确定什么问题是没有任何一个基本的Xaml的视线。不过,我打算去这里踢球。

您正在使用RenderTransform,但应用了转换的元素将向其容器报告原始未转换的维度。因此容器正在基于该信息进行裁剪。

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

+0

我会给'LayoutTransformer'一个镜头,但我更新了有关问题报告的信息。不知道这是否会改变你的回应。 –

2

使用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; 
     } 
    } 
} 

如果您删除外部画布,它会导致页面显示被截断,就好像仍在打印肖像一样。