使用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'一個鏡頭,但我更新了有關問題報告的信息。不知道這是否會改變你的迴應。 –