轉帖|其它|編輯:郝浩|2011-08-31 14:09:53.000|閱讀 559 次
概述:Silverlight 4開始提供打印的功能,這無疑使得它更加易于在企業級別的項目中使用,而不僅僅是做些演示和單獨的一些文件上傳之類的小的組件。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
Silverlight 4開始提供打印的功能,這無疑使得它更加易于在企業級別的項目中使用,而不僅僅是做些演示和單獨的一些文件上傳之類的小的組件。
【備注】在這里,我自己的體會是,Silverlight在企業級應用中還是挺受歡迎的,如果運用得當,也確實可以有所作為。當然,我并不是說它已經很完善了,事實上,它還有不少要改進的,也許下一個版本能更好一些吧。有興趣的朋友,可以持續關注 //www.silverlight.net/
不扯太遠了,今天的問題是,如何將多頁的內容壓縮到一頁打???
Silverlight所提供的打印功能,很簡單易用,但也不是那么方便。官方的介紹,請參考這里 //msdn.microsoft.com/zh-cn/library/ee671023(v=vs.95).aspx
一個最大的問題就是,它不知道我們提供的內容會有幾頁,我們必須自己去計算,然后告訴它到底有幾頁。網上已經有些文章,談論多頁打印的問題,例如這篇博客 , //silverlightips.net/2010/03/27/multi-page-printing-in-silverlight/
我要討論的是另外一種情況,我知道我們的內容可能會超過一頁,但是我不想打印成兩頁或者三頁。假定我們的規則就是,即便內容超過一頁,我也要壓縮寬度或者高度,讓它能打印在一頁里面。
【備注】我討論的是一個特定的場景,這個規則在你的公司或者項目中可能不適用。
給大家看一個例子就明白了,下圖是一個最簡單的Silverlight程序,金喜正規買球上面有一個列表,顯示了100行數據。很顯然,它會超過一頁,按照正常的打印,大致有三頁。(A4紙)
【備注】今天全世界都在關注一個新聞,喬布斯退休了,幫主的身體也確實是不行了。這個例子里面用到了他的名字,以示尊敬
經過代碼處理,我讓這100行的數據,打印在了一頁上面,大致看起來是這樣的。
因為進行了縮放,所以在100%的比例下是看不清楚的,放大之后,可以看到最后一行確實是第100行。
你可能會說,字體有些變形了嘛,而且也看不清楚呢?是的,我知道。我們討論的是,如何將多頁內容縮放成一頁,其中一個重要假設就是,你的內容適合于縮放?,F在是從三頁縮放到一頁當然是這個樣子的。但如果從一頁多一點壓縮到一頁,則可能就不太明顯了。
那么,我們是如何做到的呢?有代碼有真相,有興趣的同學可以照著做一下
頁面定義
<UserControl
xmlns:toolkit="//schemas.microsoft.com/winfx/2006/xaml/presentation/toolkit"
xmlns="//schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="//schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="//schemas.microsoft.com/expression/blend/2008"
xmlns:mc="//schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:System="clr-namespace:System;assembly=mscorlib"
x:Class="SilverlightApplication2.MainPage"
mc:Ignorable="d"
d:DesignHeight="300"
d:DesignWidth="400"
xmlns:c="clr-namespace:SilverlightApplication2">
<Grid
x:Name="LayoutRoot"
Background="White">
<ScrollViewer>
<StackPanel>
<ListBox
x:Name="lstData"
Padding="50"
BorderBrush="Transparent"
ItemsSource="{Binding}">
<!--定義這個轉換器,可以對大小進行縮放,默認按照100%呈現-->
<ListBox.RenderTransform>
<ScaleTransform
x:Name="st"
ScaleX="1"
ScaleY="1"></ScaleTransform>
</ListBox.RenderTransform>
</ListBox>
<Button
Content="Print"
x:Name="btPrint"
Width="100"
Click="btPrint_Click"
HorizontalAlignment="Left"></Button>
</StackPanel>
</ScrollViewer>
</Grid>
</UserControl>
后臺代碼
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Printing;
namespace SilverlightApplication2
{
public partial class MainPage : UserControl
{
public MainPage()
{
InitializeComponent();
Loaded += new RoutedEventHandler(MainPage_Loaded);
}
void MainPage_Loaded(object sender, RoutedEventArgs e)
{
//準備的一些測試數據。100行
this.DataContext = Enumerable.Range(1, 100).Select(i => new Data()
{
ID = i,
Name = "Steve Paul Jobs"
});
}
private void btPrint_Click(object sender, RoutedEventArgs e)
{
//列表的實際高度
var ah = lstData.ActualHeight;
//列表的實際寬度
var aw = lstData.ActualWidth;
//新建一個打印文檔
var doc = new PrintDocument();
//處理打印事件
doc.PrintPage += (o, a) =>
{
//用戶選擇打印機,最后提供的打印高度
var h = a.PrintableArea.Height;
//用戶選擇打印機,最后提供的打印寬度
var w = a.PrintableArea.Width;
//如果寬度不夠,則要壓縮寬度
if(aw > w) st.ScaleX = w / aw;
//如果高度不夠,則要壓縮高度
if(ah > h) st.ScaleY = h / ah;
//設置打印內容
a.PageVisual = lstData;
};
//處理打印后事件
doc.EndPrint += (o, a) =>
{
//將列表重新縮放到100%
st.ScaleX = 1;
st.ScaleY = 1;
};
//開始打印
doc.Print(null);
}
}
class Data
{
public int ID { get; set; }
public string Name { get; set; }
public override string ToString()
{
return string.Format("ID={0:000},Name={1}", ID, Name);
}
}
}
這個例子實現的關鍵就在于,Silverlight和WPF都支持在呈現時通過不同的轉換器進行轉換。ScaleTransform是其中一種最簡單的,可以按照比例縮放。還有可以旋轉的,可以變形的等等。這些特性也是Silverlight動畫設計中的核心,今天就不展開了。
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉載自:博客園