微软于PDC2009上发布Silverlight 4 Beta版,微软在Silverlight 4版本中处理了约8000个的Silverlight终端用户的请求,加入了一系列另开发人员兴奋的新特性,最突出的主要体现在几个方面:
开发工具增强:Visual Studio 2010具有可视化的设计工具,创建项目时可以选择运行时版本是3.0还是4.0,BLEND4加入XAML和C#代码全方位智能感知功能、XAML的样式应用更为易用等。
摄像头与MIC硬件支持:可以用极少量的代码实现启用用户本机的WebCam和Mic,并可进行本地录制。
报表打印支持:报表打印问题在Silverlight4中得到的较好的解决。
更强大的基础类控件(RichTextBox、DataGrid增强版):富文本控件RichTextBox和具有可粘贴、排序功能的DataGrid被加入。
WCF增强:终于支持TCP通讯,比较HTTP提升3-5倍,限于4502-4534端口。
兼容性增强:对Google的Chrome浏览器的支持。
MEF支持:MEF全称为Managed Extensibility Framework,译为“托管扩展框架”,支持创建大型复杂的应用程序。
运行速度提升:启动速度和渲染速度较前个版本提升约2倍左右。
DRM增强:支持PlayReady,可以对视频和音频的播放进行的保护,补充了对H.264的DRM保护。
其它增强:本地文件读写、鼠标右键事件支持、剪粘板支持。
在Silverlight4之前我们通常可以用在Silverlight中CALL一下JavaScript脚本来进行基于普通网页的打印方法,但是这种无论是打印方式效果还是精确度控制上都不能让人十分满意。
对于一个Silverlight来说,需要打印的内容往往可能是整个网页的一部页,或是整个Silverlight应用程序的某个局部内容,如果仅仅使用JavaScript的网页打印的话,是无法满足Silverlight应用程序中打印的需求,不过这个问题终于在Silverlight 4.0中得到了比较完美的解决。Silverlight 4运行时中引入了System.Windows.Printing命名空间,这个命名空间中包含一个名为PrintDocument的类,它可以完成Silverlight应用程序中有“针对性”的打印任务。
下面我们用GRID制作一个简单的报表。
XAML:
1
<
Grid
x:Name
=
"
LayoutRoot
"
Background
=
"
White
"
>
2
<
Grid.RowDefinitions
>
3
<
RowDefinition
Height
=
"
*
"
/
>
4
<
RowDefinition
Height
=
"
40
"
/
>
5
<
/Grid.RowDefinitions
>
6
<!--
简单的报表
-->
7
<
Border
BorderBrush
=
"
Black
"
BorderThickness
=
"
1
"
>
8
<
Grid
x:Name
=
"
reportGrid
"
Grid
.Row=
"
0
"
ShowGridLines
=
"
True
"
>
9
<
Grid.Resources
>
10
<
Style
TargetType
=
"
TextBlock
"
>
11
<
Setter
Property
=
"
VerticalAlignment
"
Value
=
"
Center
"
/
>
12
<
Setter
Property
=
"
HorizontalAlignment
"
Value
=
"
Center
"
/
>
13
<
/Style
>
14
<
/Grid.Resources
>
15
<
Grid.RowDefinitions
>
16
<
RowDefinition
Height
=
"
30
"
/
>
17
<
RowDefinition
Height
=
"
30
"
/
>
18
<
RowDefinition
Height
=
"
30
"
/
>
19
<
RowDefinition
Height
=
"
30
"
/
>
20
<
RowDefinition
Height
=
"
30
"
/
>
21
<
/Grid.RowDefinitions
>
22
<
Grid.ColumnDefinitions
>
23
<
ColumnDefinition
Width
=
"
100
"
/
>
24
<
ColumnDefinition
Width
=
"
200
"
/
>
25
<
ColumnDefinition
Width
=
"
300
"
/
>
26
<
/Grid.ColumnDefinitions
>
27
<
TextBlock
Text
=
"
产品编号
"
Grid
.Row=
"
0
"
Grid
.Column=
"
0
"
/
>
28
<
TextBlock
Text
=
"
产品名称
"
Grid
.Row=
"
0
"
Grid
.Column=
"
1
"
/
>
29
<
TextBlock
Text
=
"
产品大类
"
Grid
.Row=
"
0
"
Grid
.Column=
"
2
"
/
>
30
<
TextBlock
Text
=
"
1
"
Grid
.Row=
"
1
"
Grid
.Column=
"
0
"
/
>
31
<
TextBlock
Text
=
"
数码相机
"
Grid
.Row=
"
1
"
Grid
.Column=
"
1
"
/
>
32
<
TextBlock
Text
=
"
相机
"
Grid
.Row=
"
1
"
Grid
.Column=
"
2
"
/
>
33
<
TextBlock
Text
=
"
2
"
Grid
.Row=
"
2
"
Grid
.Column=
"
0
"
/
>
34
<
TextBlock
Text
=
"
笔记本电脑
"
Grid
.Row=
"
2
"
Grid
.Column=
"
1
"
/
>
35
<
TextBlock
Text
=
"
电脑
"
Grid
.Row=
"
2
"
Grid
.Column=
"
2
"
/
>
36
<
/Grid
>
37
<
/Border
>
38
<!--
打印按钮控件
-->
39
<
Button
x:Name
=
"
btnPrint
"
Grid
.Row=
"
1
"
Click
=
"
btnPrint_Click
"
40
Width
=
"
100
"
Height
=
"
25
"
Content
=
"
打印报表
"
/
>
41
<
/Grid
>
如图所示。
C#:
1
public
PrintSample
(
)
2
{
3
InitializeComponent
(
)
;
4
this
.
Loaded
+
=
new
RoutedEventHandler
(
PrintSample_Loaded
)
;
5
}
6
7
void
PrintSample_Loaded
(
object
sender,
RoutedEventArgs
e
)
8
{
9
//
创建打印文档对象
10
pd
=
new
System
.
Windows
.
Printing
.
PrintDocument
(
)
;
11
//
创建打印事件,用于指定打印的文档对象作用的对象
12
pd
.
PrintPage
+
=
new
EventHandler
<
System
.
Windows
.
Printing
.
PrintPageEventArgs
>
(
pd_PrintPage
)
;
13
}
14
15
void
pd_PrintPage
(
object
sender,
System
.
Windows
.
Printing
.
PrintPageEventArgs
e
)
16
{
17
//
指定打印文档对象的页面
18
e
.
PageVisual
=
reportGrid;
19
}
20
private
System
.
Windows
.
Printing
.
PrintDocument
pd;
21
private
void
btnPrint_Click
(
object
sender,
RoutedEventArgs
e
)
22
{
23
//
定义打印的文档名称
24
pd
.
DocumentName
=
"
产品报表
"
;
25
//
调用打印方法,开始打印
26
pd
.
Print
(
)
;
27
}