2011-08-26 62 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; 
     } 
    } 
} 

如果您刪除外部畫布,它會導致頁面顯示被截斷,就好像仍在打印肖像一樣。