Silverlight2中文版教程.docx
- 文档编号:8700582
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:58
- 大小:3.77MB
Silverlight2中文版教程.docx
《Silverlight2中文版教程.docx》由会员分享,可在线阅读,更多相关《Silverlight2中文版教程.docx(58页珍藏版)》请在冰豆网上搜索。
Silverlight2中文版教程
目录
使用VS2008创建一个新的Silverlight应用2
理解Silverlight应用里都有些什么4
学习如何添加控件和处理事件5
理解布局管理10
用布局面板排布我们的Digg页面15
下一步23
使用Networking取回数据并填充DataGrid24
使用LINQtoXML把XML格式的Digg故事分析成Story类对象25
在DataGrid控件中显示Digg故事27
以下的步骤28
使用Style元素更好地封装观(LookandFeel)29
下一步31
用ListBox和DataBinding显示列表数据32
下一步39
使用用户控件实现主从表场景40
创建StoryDetailsView用户控件41
使用用户控件建造一个基本模式对话框42
显示我们的StoryDetailsView控件45
把故事数据传入我们的StoryDetailsView用户控件46
完成我们的用户控件的布局49
下一步51
使用控件模板定制控件的观感52
定制控件的内容52
使用控件模板定制控件55
对我们的Digg应用进行润色(Polishingup)58
下一步64
使用WPF创建一个Digg桌面应用65
第一步:
创建一个新的WPF桌面应用65
第二步:
把现有的Digg应用的代码拷贝进WPF应用中66
第三步:
修正几个问题66
第四步:
把Digg应用宿主与桌面窗口中67
第五步:
运行应用67
结语69
使用VS2008创建一个新的Silverlight应用
我们来开始我们的Digg应用的开发,先选择VisualStudio2008中的文件->新项目菜单项,使用新项目对话框创建一个“SilverlightApplication”(注:
你需要在Beta1发布后,下载和安装VS2008的Silverlight工具才能得到这个支持):
我们将该项目命名为“DiggSample”。
在点击OK按钮后,VisualStudio会显示另外一个对话框,允许我们选择我们是否只要创建一个Silverlight应用项目,或者还要加一个服务器端的ASP.NETWeb项目到包含Silverlight应用的解决方案里去:
在这个例程里,我们将选择还要添加一个ASP.NETWebApplication项目到解决方案里去,并将它命名为“DiggSample_WebServer”。
在点击OK之后,VisualStudio会为我们创建一个解决方案,里面包含一个Silverlight客户端应用和一个ASP.NETweb服务器端应用:
如果我们做一次编译的话,VisualStudio会自动把编译好的Silverlight应用拷贝到我们的web服务器项目中去,不需要手工的步骤或配置。
VS为我们创建的默认的web服务器项目包含一个ASP.NET网页和一个静态的HTML网页,我们可以用来运行和测试其中的Silverlight应用。
注:
Silverlight应用可用于任何web服务器(包括Linux上的Apache),宿主于静态HTML文件或者任何服务器端生成的网页(包括PHP,Java,Python,Ruby等等)中。
在这个Digg样例中,我们不会写任何服务器端的代码,而是将使用Silverlight的跨域networking功能,来直接访问Digg服务的API。
我选择创建一个ASP.NETweb服务器项目,主要是想获得自动的部署,并且使用它内置的web服务器来做测试。
理解Silverlight应用里都有些什么
在默认情形下,一个新建的Silverlight应用项目包含一个Page.xaml和一个App.xaml文件,以及与它们相关的后台(codebehind)类文件(可以用VB,C#,Ruby或Python来编写):
XAML文件是XML文本文件,可以用来用声明的方式指定Silverlight或WPF应用的用户界面。
XAML还可更广泛地用来用声明的方式代表.NET对象。
App.xaml文件一般用来声明譬如象画刷和样式对象这样可在整个应用中共享的资源。
App.xaml的后台Application类可用来处理应用级的事件,象Application_Startup,Application_Exit和Application_UnhandledException。
Page.xaml文件,在默认情形下,是在应用激活时装载的起始的UI控件。
在其中,我们可以使用UI控件来定义我们的用户界面,然后在Page的后台代码类里处理它们的事件(详见后文)。
在我们编译DiggSample项目时,在默认情形下,VisualStudio会把代码和XAML标识编译进一个标准的.NET程序集文件中,然后把它和任何静态的资源(象图片或我们想要包含的静态文件)包装进硬盘上一个叫做“DiggSample.xap”的文件中去:
“.xap”文件(其音发作“zap”)使用标准的.zip压缩算法来减小客户端下载的大小。
一个“helloworld”.NETSilverlight应用(用VB或C#编写的)其大小大概为4KB。
注:
Beta1版本中的一些控件是在程序集中实现的,如果使用这些控件的话,这些程序集会重新发布于应用的.xap文件中(会增加应用的大小,超出4KB的基底大小)。
在Digg应用中使用的所有控件将会在Beta2版和最终版的核心Silverlight下载包中,这意味着完成的应用的总下载大小大概只在6-8KB范围内(所以是非常小,下载起来非常快)。
要宿主和运行一个Silverlight2应用,你可以把
Silverlight然后就会自动下载这个.xap文件,生成实例,将其宿主于浏览器中的HTML网页中。
这是跨浏览器(Safari,FireFox,IE等),跨平台(Windows,Mac,andLinux)工作的。
HTML和ASP.NET测试网页(内含
学习如何添加控件和处理事件
现在我们的Digg应用什么都不做,在运行它时,只会调出一个空白的网页。
我们可以打开项目中的Page.xaml文件来改变它,往里面加些内容:
我们将开始改变网格的背景颜色,在其中声明一个Button控件。
我们将给按钮一个"x:
Name"属性,设置其值为“MyButton“,这会允许我们在后台代码类中用编程的方法引用它。
我们还将设置它的Content,Width和Height属性:
当我们运行应用时,我们的按钮将会在网页的中间出现,内含”PushMe“内容文字,象下面这样:
要给我们的按钮加行为的话,我们可以给它加一个"Click"事件处理函数。
我们可以在源码视图中通过输入事件的名称来做:
然后就会提示我们在我们的后台代码类中该使用的事件处理函数:
然后我们可以输入一个要用的新事件处理方法的名称,或者只要点击回车键,使用默认的命名约定来命名事件处理方法:
然后VS就会自动地在我们的后台代码类文件中创建一个占位的事件处理函数实现。
我们可以使用这个事件处理函数在按钮被点击时,用新的消息更新它的内容:
在做完上面的改动后,我们可以重新运行应用,再次点击按钮,现在它的内容就会被更新为“Pushed!
”的消息:
理解布局管理
Silverlight和WPF都支持一种灵活的布局管理系统,能让开发者和设计师轻松的定位UI上的控件。
该布局系统对显式指定坐标的控件支持固定的定位模型;除此之外,还支持一种更为动态的定位模型,控件和布局能随着浏览器的大小改变而自动改变其大小和方位。
在Silverlight和WPF中,开发者可以用布局面板来协调包含在其中的控件的位置和大小。
SilverlightBeta1中内建的布局面板包括在WPF中最常用的3种:
∙Canvas
∙StackPanel
∙Grid
Canvas面板
Canvas面板是一种很基础的布局面板,它支持对其中的控件采用绝对坐标定位。
你可以通过一种XAML特性---"附加属性”对Canvas中的元素进行定位。
用附加属性,你可以指定控件相对于其直接父Canvas控件的上、下、左、右坐标的位置。
附加属性很有用,因为它让父面板可以扩展其中包含的控件的属性集。
Canvas通过定义扩展属性Top和Left,就能定义其中Button(或其他任何UI元素)的Left,Top,而不需要真正向Button类中添加这个属性,或修改Button类。
我们可以向Canvas容器中添加两个按钮,指定其距离Canvas左侧的距离为50像素,离上边的距离则分别为50像素和150像素。
使用如下XAML语法即可完成(其中Canvas.Top和Canvas.Left都是附加属性的例子):
这些代码绘制的界面效果如下:
Canvas适用于其中包含的UI元素比较固定的情形,但是如果你想向其中添加更多的控件,或者UI需要改变大小或能够移动,Canvas显得不太灵活。
这时,你不得不忙于手写代码来移动Canvas中的东西(这很痛苦)。
应付这种动态的场景,更好的办法通常是使用其它带有相关功能的内建语义的布局面板,如StackPanel和Grid。
StackPanel
StackPanel是一种简单的布局面板,它支持用行或列的方式来定位其中包含的控件。
StackPanel常用于安排页面上的一个很小的UI部分。
例如,我们可以用下面的XAML标签在页面上垂直的排布3个按钮:
在运行时刻,StackPanel会自动在一个垂直地堆叠(stack)中排列我们的按钮(【译注:
这也是为什么叫StackPanel的原因】),如下所示:
同样,我们还可以把Orientation属性设置为Horizontal而不是Vertical(默认值):
这会让StackPanel水平地排布3个按钮,如下图所示:
Grid面板
Grid控件是最灵活的布局面板,它支持用多行和多列的方式排布控件。
在概念上,它和HTML里的Table(表格)类似。
不同于Table的是,你不需要将控件内嵌到行/列元素中,而是通过定义
这两个属性需要定义在
这样之后,你就可以在其中的控件上,用XAML的“附加属性”语法指定它属于哪一行、哪一列。
比如,我们可以用如下语法定义3行3列的Grid布局,然后在其中放置4个按钮:
以上代码会按下图方式排布按钮:
除了支持绝对尺寸定义(如:
Height="60"),Grid的RowDefinition和ColumnDefinition控件还支持自动改变大小的模式(Height="Auto"),这样会根据其中内容的尺寸自动改变Grid或Row的尺寸(你也可以指定最大或最小尺寸限制)。
Grid的Row和ColumnDefinitions还支持叫做"ProportionalSizing"(按比例缩放)的特性。
用这个特性,可以让Grid的行列按相对比例的方式排放(如:
你可以指定第二行的尺寸为第一行的2倍)。
你会发现Grid提供了非常多的功能和灵活性-而它也许会成为你最终最常用的布局面板控件。
用布局面板排布我们的Digg页面
我们创建Digg例子的目标,是得到最终看起来像下图的页面:
要创建这种布局,我们首先添加一个其中包含两个RowDefinition的根级Grid面板。
第一行的高度是40像素,而第二行则占据所有剩下的空间(Height="*"):
小技巧:
注意上面我将Grid的ShowGridLines属性设置为True.这样我们在运行时就能轻易的看到其行列的分界线:
接下来,我们在刚才的根级Grid面板里,添加第二个Grid面板到第一行的位置,用它来排布页面顶部的行(页面头部)。
我们在其中创建3列:
分别容纳标题,搜索文本框,和搜索按钮:
完成了这些后,我们就得到了Digg搜索页面的基本布局,如下所示:
注:
如果不用嵌套的Grid,我们还可以用一个2行3列的Grid来完成这个布局,配合使用Grid的ColSpan/RowSpan特性来合并多个列中的内容(和你在HTMLtable中的做法类似)。
我不这么做,而是选择使用嵌套Grid的原因,是因为这样更便于学习和理解。
现在我们已经完成了布局,接下来要做的是向其中添加控件。
对头部的行,我们用内建的
我们用内建的
并在第3列放置一个搜索
注:
下面我会直接在控件中内嵌样式信息(FontSize,Colors,Margins等)。
在这个系列教程中,晚一点我会演示如何用Styles来提取、封装这些设定到一个独立的文件中(类似CSS),以便于在整个应用程序中重用。
现在,让我们运行一下应用程序,就会显示出如下的界面:
动态改变应用程序的尺寸
你也许注意到了,在上面的XAML中我们的顶层控件设置成了固定的高度和宽度:
这样设置,我们的Silverlight应用程序会一直保持这个固定的尺寸。
放大浏览器的尺寸会更明显:
虽然在某些场合下,将内嵌的应用程序固定在HTML页面的一个固定尺寸的区域内会很有用,但我们的Digg搜索程序不一样,我们宁愿它能自动随着浏览器而缩放,就像一个普通的HTML页面那样。
好消息是,这很容易实现。
只要去除根控件上的Width和Height属性就行了:
这样,我们的Silverlight应用程序就会自动扩展(或收缩),以填满其嵌入的HTML容器。
因为我们用来测试的SilverlightTestPage.html文件将Silverlight控件放置在一个HTML
注意页面头部中的文字内容的尺寸是如何随着浏览器宽度而自动改变的:
当我们缩小浏览器尺寸时,带水印的文本框和搜索按钮会保持同样的尺寸,因为其Grid容器列的宽度是固定的。
包含"DiggSearch"标题的
我们不需要编写一行代码就可以启用这个布局行为,Grid容器和布局系统会为我们自动调整大小或流动其中的任何东西。
下一步
现在我们已经创建好了Digg程序的布局结构,并且定义好了页面头部的行。
下一步,我们会实现该程序的搜索行为-让它在程序的终端用户搜索某个标题时,能够真正的从D去获取故事内容。
使用Networking取回数据并填充DataGrid
Silverlight2有内置的networkingAPI,允许Silverlight客户端调用远程的REST,SOAP/WS*,RSS,JSON和XMLHTTP服务。
Silverlight2还包含了内置的socketAPI(System.Net.Sockets),允许Silverlight客户端通过非HTTP协议来通信(对聊天服务等这样的场景非常理想)。
跨域网络访问
Silverlight2应用在做网络调用时,始终可以回调到它们的“原始(origin)”服务器(意味着它们可以调用下载的应用来自的同域的URL)。
Silverlight2应用还可以做跨域网络调用(意味着它们可以调用与下载的应用来自的不同的域上的URL),只要远程的web服务器拥有一个XML策略文件,表明客户端是允许做这些跨域调用的。
Silverlight2定义了一个XML策略文件格式,允许服务器管理员精确地控制一个客户端应该有些什么访问权。
Silverlight2也遵守默认的Flash跨域策略文件格式-这意味着你可以使用Silverlight2来调用web上已经允许Flash客户端跨域访问的任何现有的远程REST,SOAP/WS*,RSS,JSON或XML端点(end-point)。
D有一套非常酷的通过HTTP通信的DiggAPIs。
因为他们有一个Flash跨域策略文件在他们的服务器上,我们可以直接从我们的SilverlightDigg客户端应用中调用它们(而不要求我们通过我们的web服务器去访问他们的API)。
D主题FeedAPI
我们要允许终端用户使用我们的应用输入一个搜索主题(譬如,“Programming”),然后点击“搜索”按钮,从D取回符合条件的前N条故事:
我们可以使用DListStoriesRESTAPIfeedAPI来实现。
它在URL中接受一个主题参数(譬如,GET/stories/topic/programming),然后返回一个匹配那个主题的XML格式的Digg故事集。
点击这里看一下这个XML格式的例子。
使用System.Net.WebClient来异步调用DiggRESTFeed
在上面的搜索按钮被点击之后,我们将处理它的Click事件,从WaterMarkTextBox控件中取回要搜索的主题字符串,然后启动一个发向Digg的网络调用,为那个主题取回相应的XML列表。
Silverlight在System.Net命名空间下包含了WebClient辅助类(该类也在完整的.NET框架下)。
我们可以使用这个类从URL异步下载内容。
异步下载Digg故事的好处是,在等待远程服务器的回复时,我们的UI不用阻塞或变得没有反应(允许我们拥有一个非常流畅的用户体验)。
通过WebClient类执行异步下载,我们要做的是注册一个DownloadStringCompleted事件处理方法(它将在请求的内容被下载之后被调用),然后调用WebClient.DownloadStringAsync(url)辅助方法来开始下载:
使用上面的代码,我们现在就可以异步取回一个XML数据的字符串,内含有关用户想要的任何主题的Digg故事。
使用LINQtoXML把XML格式的Digg故事分析成Story类对象
至此,我们可以取回Digg故事数据的XML片段了,下一步将是对其进行分析(parse),并将它转换成我们可以操作和绑定到控件上的DiggStory对象。
我们将首先定义一个DiggStory类,该类拥有可以映射到来自Digg的XML内容上的属性(我们将利用C#新的"自动属性"的特性来实现):
然后我们就可以使用LINQ(是内置于Silverlight2中的)和LINQtoXML(是包含在我们的Silverlight应用中的一个额外的库)来轻松地分析和过滤从Digg返回的XML文档,使用下面的代码把它翻译成一个DiggStory对象序列:
注意上面,我们现在有了来自XML的我们可以操作的强类型的DiggStory对象。
在DataGrid控件中显示Digg故事
我们将使用新的SilverlightDataGrid控件来在我们的应用中显示Digg故事。
要使用它,我们要引用SilverlightData控件程序集,然后把前面网页上的“Todo”文字替换成一个DataGrid控件声明:
DataGrid允许你明确地配置列的声明和显示类型(为取得最大的控制),或者,你也可以设置它的AutoGenerateColumns属性成true,让DataGrid对数据源使用反射,基于你的对象的定义,为你创建默认的列。
然后我们就可以更新我们的后台代码类,用编程的方法将DataGrid的ItemSource属性绑定到在点击搜寻按钮时从Digg取回的故事序列:
现在,运行我们的Silverlight应用,做一个搜索的话,我们将看到从Digg取回的实时主题故事数据的列表:
Silverlight的Datagrid支持你预期客户端网格控件应该拥有的所有的标准功能:
双向原地编辑,选择,卷动,改变表列大小等等。
它还支持自动流动的布局,意味着它可以动态地扩展或收缩来充满包含它的内容容器。
DataGrid还拥有一个丰富的模板模型,允许你对显示和表列数据的编辑进行定制。
我在将来会撰写更多的贴子,讨论如何使用DataGrid。
以下的步骤
现在我们可以从D取回Digg故事数据,并在我们的应用中将故事数据显示出来了。
下一步将是回到我们的Page.xaml标识,去掉我们目前正在使用的行内的样式声明。
使用Style元素更好地封装观(LookandFeel)
WPF和Silverlight支持一种Style机制,它允许我们把控件的属性值封装成可重用的资源。
我们可以把这些样式声明保存在独立于页面的其他文件中,然后就可以在一个应用程序中跨控件和页面重用(甚至跨多个应用程序重用)。
在做一些基本定制的场景下,概念上类似于在HTML中重用CSS.
注:
除了定义基本属性设置(Color,Font,Size,Margins等),WPF和Silverlight里的样式还可以被用来定义和重用控件模板(ControlTemplates)-控件模板可以带来超级丰富的皮肤功能,以及改变控件结构的功能(并支持目前HTML中的CSS做不到的定制场景)。
我会在这个系列的第7部分讨论控件模板。
对我们的Digg例程而言,我们会在项目的App.xaml文件中定义样式。
这使得该样式可以在整个应用程序中,被跨页面、跨控件地重用:
首先让我们来为Digg页面的
我们可以在App.xaml文件中,用下列标签来创建两个Style元素,分别封装
注意上述代码中,我们是如何为每个Style元素赋予一个唯一的"Key"值的。
接下来我们就可以更新我们的
我们会使用一种叫做“标签扩展”(markupextensions)的
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Silverlight2 中文版 教程
![提示](https://static.bdocx.com/images/bang_tan.gif)