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