轉(zhuǎn)帖|其它|編輯:郝浩|2011-08-31 14:09:53.000|閱讀 559 次
概述:Silverlight 4開始提供打印的功能,這無疑使得它更加易于在企業(yè)級別的項目中使用,而不僅僅是做些演示和單獨的一些文件上傳之類的小的組件。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
Silverlight 4開始提供打印的功能,這無疑使得它更加易于在企業(yè)級別的項目中使用,而不僅僅是做些演示和單獨的一些文件上傳之類的小的組件。
【備注】在這里,我自己的體會是,Silverlight在企業(yè)級應(yīng)用中還是挺受歡迎的,如果運用得當,也確實可以有所作為。當然,我并不是說它已經(jīng)很完善了,事實上,它還有不少要改進的,也許下一個版本能更好一些吧。有興趣的朋友,可以持續(xù)關(guān)注 //www.silverlight.net/
不扯太遠了,今天的問題是,如何將多頁的內(nèi)容壓縮到一頁打印?
Silverlight所提供的打印功能,很簡單易用,但也不是那么方便。官方的介紹,請參考這里 //msdn.microsoft.com/zh-cn/library/ee671023(v=vs.95).aspx
一個最大的問題就是,它不知道我們提供的內(nèi)容會有幾頁,我們必須自己去計算,然后告訴它到底有幾頁。網(wǎng)上已經(jīng)有些文章,談?wù)摱囗摯蛴〉膯栴},例如這篇博客 , //silverlightips.net/2010/03/27/multi-page-printing-in-silverlight/
我要討論的是另外一種情況,我知道我們的內(nèi)容可能會超過一頁,但是我不想打印成兩頁或者三頁。假定我們的規(guī)則就是,即便內(nèi)容超過一頁,我也要壓縮寬度或者高度,讓它能打印在一頁里面。
【備注】我討論的是一個特定的場景,這個規(guī)則在你的公司或者項目中可能不適用。
給大家看一個例子就明白了,下圖是一個最簡單的Silverlight程序,金喜正規(guī)買球上面有一個列表,顯示了100行數(shù)據(jù)。很顯然,它會超過一頁,按照正常的打印,大致有三頁。(A4紙)
【備注】今天全世界都在關(guān)注一個新聞,喬布斯退休了,幫主的身體也確實是不行了。這個例子里面用到了他的名字,以示尊敬
經(jīng)過代碼處理,我讓這100行的數(shù)據(jù),打印在了一頁上面,大致看起來是這樣的。
因為進行了縮放,所以在100%的比例下是看不清楚的,放大之后,可以看到最后一行確實是第100行。
你可能會說,字體有些變形了嘛,而且也看不清楚呢?是的,我知道。我們討論的是,如何將多頁內(nèi)容縮放成一頁,其中一個重要假設(shè)就是,你的內(nèi)容適合于縮放?,F(xiàn)在是從三頁縮放到一頁當然是這個樣子的。但如果從一頁多一點壓縮到一頁,則可能就不太明顯了。
那么,我們是如何做到的呢?有代碼有真相,有興趣的同學可以照著做一下
頁面定義
<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}">
<!--定義這個轉(zhuǎn)換器,可以對大小進行縮放,默認按照100%呈現(xiàn)-->
<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)
{
//準備的一些測試數(shù)據(jù)。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;
//設(shè)置打印內(nèi)容
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);
}
}
}
這個例子實現(xiàn)的關(guān)鍵就在于,Silverlight和WPF都支持在呈現(xiàn)時通過不同的轉(zhuǎn)換器進行轉(zhuǎn)換。ScaleTransform是其中一種最簡單的,可以按照比例縮放。還有可以旋轉(zhuǎn)的,可以變形的等等。這些特性也是Silverlight動畫設(shè)計中的核心,今天就不展開了。
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自:博客園