1、Silverlight 项目编程资料(免积分)开发环境1 开发工具安装步骤1.1 安装 VS2010 RC+Silverlight Tool For 2010 RCSilverlight 编程必须安装 VS2010,目前使用的 VS2010 RC,然后对应安装 Silverlight Tool for VS2010RC。VS2010 作为开发 SL 应用的开发工具,部分简单的 XAML 文件调整可以直接在 VS2010 中进行。注意:Silverlight Tool For VS2010 RC 会自动安装上 Silverlight 4.0 SDK 和 Silverlight 4.0 RunTI
2、me,不再需要另外安装。1.2 安装 Expression Blend 4Expression Blend4 是开发 Silverlight UI XAML 的开发工具,主要用于界面调整,对于复杂的界面调整可以在其中进行。1.3 TFS 设置TFS 是开发的源代码管理器,TFS 服务地址为 192.168.0.101,需要域账号密码进行验证,对应工程目录为 ZLBHWeb,统一的解决方案名称是 ZLBHCommunity;2 调试环境 调试环境统一使用 IE 浏览器,请将机器上的默认浏览器设为 IE; 关闭或只选择 IntelliTrace events only 选项,开启 IntelliT
3、race 会影响调试速度; 为 WebDev 使用默认端口,工程中设定的是 8888一. Silverlight 基础开发1 基础知识1.1 Silverlight 运行机制Silverlight 不同于传统的桌面应用开发和 Web 开发,属于 RIA 应用开发,SL 的执行文件作为 XAP 包下载到本地,XAP 包中的内容为编译好的 DLL 文件,浏览器需要对应安装Silverlight 相应版本的 Runtime,浏览器自动识别 SL 所承载的页面文件进行下载和运行, SL RunTime 作为 COM 组件提供给 SL 运行环境。1.2 Silverlight 项目组成Silverlig
4、ht 标准的页面文件由 XAML 和代码文件组成,继承于 UserControl 类,XAML 文件为 Silverlight 的 UI 显示,内容组织行为 XML 格式,SL RunTime 将在运行期对 XAML 文件进行解析和呈现,代码文件为 Silverlight 的页面文件的后台处理代码文件,编写方式与普通的代码开发一样。SL 工程为专门的工程模板,组件开发从 Silverlight Class Libray 模板生成,对应选择Silverlight 4 版本。注意:SL 工程不能引用非 SL 工程生成的 DLL 文件。2 开发基础2.1 Silverlight UI 布局控件Sil
5、verlight4 有 8 种布局控件,分别为 Grid Canvas StackPanel WrapPanel DockPanel ScrollView Border ViewBox最常用的有:Grid,StackPanel,Border2.1.1 GridGrid 网格布局方式类似于表格的行和列布局例如:上面的表格用 Grid 布局表示为-列定义-自动列宽-剩下的部分-行定义- 自动行高对应在 Grid 的控件设置,相应的 Grid.Row 和 Grid.Column 属性以设置位置,例如表格中第一行、第二列的方框设置为:内容 例如:表格中第二行、横跨两列的方框设置为:内容 2.1.2 S
6、tackPanelStackPanel 针对于只支持横向和纵向两个方向的排列,例如:其中的控件将以横向排列其中的控件将以纵向排列2.1.3 BorderBorder 相对于前面两种框架,提供了三个属性 BorderThickness 边框宽度 BorderBrush 边框颜色 CornerRadius 边框圆角2.2 Silverlight 控件基本属性Silverlight 控件的公用属性有: Opacity 透明度 Visibilty 可见性 Width 宽度 Height 高度 Grid.Row 所在 Grid 行 Grid.Column 所在 Grid 列 Grid.RowSpan 行
7、跨度 Grid.ColumnSpan 列跨度 HorizontalAligment 水平对齐方式 left 靠左 center 置中 right 靠右 Strench 拉伸 VerticalAlignment 垂直对齐方式 left 靠左 center 置中 right 靠右 Strench 拉伸 Margin 水平方向、垂直方向间距二. Silverlight 项目开发1 项目结构工程名称 说明CommunityApp.Web SL 应用承载 Web 应用BHService 调用 BH 服务的类库Plugin DemoApp 插件演示程序Plugin SLCommon 插件调用的公共库Dat
8、aAccess CommonLibrary 数据访问的公共库DataAccess CommunityApp.DAL 数据访问的接口类DataAccess CommunityApp.Data 数据访问的实体类Client CommunityApp SL 应用主程序Client IModule SL 插件模块接口Client SL.WCF.DynamicProxy SL 的 WCF 服务动态代理类Client WCFServices SL 的 WCF 服务接口定义类CommunityApp.Web Service WCF 服务定义2 编写数据访问数据访问通过 Oracle 数据访问适配器实现;实现
9、步骤:1、 在 DataAccess CommunityApp.DAL 工程中定义访问接口,创建的原则是针对一个表或一系列相关应用创建一个访问接口Public Interface ITableDataAccessInt InsertTable(参数列表) ; /插入数据DataSet GetData(参数列表 );/获取数据2、 继承上一步骤定义的访问接口,定义访问适配器Public Class TableDataAccess: ITableDataAccess/定义 SQL 语句Private const string SQL_GET_TABLEDATA =”Select id,name f
10、orm testDate”;Private const string SQL_INSERT_TABALEDATA =“INSERT INTO TESTDATA(ID,NAME)“ +“VALUES (:P_ID,:P_NAME)”;/定义获取参数方法private OracleParameter INSERTTABLEDATAParameters(string id,string name)OracleParameter parms = OracleHelperParameterCache.GetCachedParameterSet(OracleHelper.ConnectionStringL
11、ocalTransaction, SQL_INSERT_TABALEDATA);if (parms = null)parms = new OracleParameter/定义接收参数new OracleParameter(“:P_ID“, OracleDbType.Varchar2);new OracleParameter(“:P_NAME“, OracleDbType.Varchar2);/存入缓存 OracleHelperParameterCache.CacheParameterSet(OracleHelper.ConnectionStringLocalTransaction, SQL_I
12、NSERT_TABALEDATA, parms);/设置插入参数parms0.Value = id;return parms;/执行插入方式public int InserTestTableData(string id, string name)OracleParameter parms = INSERTTABLEDATAParameters (id, name);tryOracleHelper.ExecuteNonQuery(OracleHelper.ConnectionStringLocalTransaction, CommandType.Text, SQL_INSERT_TESTTABL
13、E, parms);catch (Exception ex)return -1;throw new Exception(“新增失败, ex);return 1;/执行获取数据方法public DataSet GetTestTableData()DataSet ds = OracleHelper.ExecuteDataset(OracleHelper.ConnectionStringLocalTransaction, CommandType.Text, SQL_GET_TABLEDATA);return ds;3、 定义 WCF 服务在 CommunityApp.Web 工程的 Service
14、目录下的 DataProxy.svc.cs 文件中写入 WCF服务定义:private readonly ITableDataAccess tableDataDAL = DALFactory.CreateInstance();tableDataDAL;/定义 WCF 服务方法public byte GetTableData()/调用数据访问适配器方法DataSet data = tableDataDAL. GetTestTableData ();/压缩 DataSet 发送return DataToByteHelper.DataSetToByte(data);/定义通过缓存访问数据访问,对于固
15、定内容数据使用public byte GetTableDataByCache()DataSet data = null;if (!Global.enableCaching)/直接获取内容data = tableDataDAL. GetTestTableData ();elsestring key = “ GetTableData “;data = HttpCacheHelper.GetCache(key) as DataSet;if (data = null)data = implDAL.GetTestTableData();HttpCacheHelper.InsertCache(key, d
16、ata);return DataToByteHelper.DataSetToByte(data);4、 定义 WCF 服务契约接口在 CommunityApp.Web 工程的 Service 目录下的 IDataProxy.cs 文件中写入 WCF 服务契约接口:OperationContract /契约标签byte GetTableData()OperationContractbyte GetTableDataByCache()OperationContractint InsertTestTableData(string id, string name);5、 定义 SL 客户端 WCF 服
17、务服务定义在 ClientWCFServices 工程下的 ServiceDefinitions.cs 文件中写入服务定义public interface IDataProxyvoid GetTableDataBy (OnCompletion result);void GetTableDataByCache (OnCompletion result);void InsertTestTableData(string id, string name, OnCompletion result);6、 SL 页面访问数据服务在 SL 页面的代码文件中通过 WCF 动态代理调用 WCF 服务/定义服务访
18、问接口IDataProxy dataService = WCFClientProxy.Create();/显示数据加载等待提示LoadingHelper.ShowLoading(“加载数据中.“);dataService.GetTestTableData(r2, ex2) =if (ex2 != null)throw ex2;/异步获取数据,绑定到 dataGrid 的数据源上dataGrid.ItemsSource = DataTableHelper.GetDataView(r2);/隐藏数据加载等待提示LoadingHelper.HideLoading(););3 配置模块SL 工程中的菜
19、单结构对应于 BH 相应目录的菜单结构;在工程中在 CommunityApp.Web 项目下的 ModulInfo.config 文件做相应设置;ModulInfo.config 结构为:/对应的模块ID6266743f-09a8-4fc9-a4f2-61e709a485f0/所对应的SL页面类DemoApp.AppDemo/菜单标题健康档案管理模块 ID 通过查询 BH 中智能窗体的 ID 获得4 模块操作配置SL 工程中的菜单项与智能窗体的智能操作相对应;/智能操作ID170e79f2-d5eb-44e5-99a0-164431860a64/显示图标add.png/显示名称新增/输入-为菜
20、单分隔条-/工具栏名称新增工具条 智能操作 ID 查询在 pluginoperateinfo 表中,通过select * from pluginoperateinfo Where pluginID =智能窗体 ID;SQL 进行查询; ICON 设置为 ClientCommunityAppImages 下的图片5 操作权限设置SL 客户端的操作权限设置通过客户端通过 WCF 获取数据进行控制ModuleInfo moduleInfo = null;object IModuleViewModel.moduleInfoget return moduleInfo; setmoduleInfo = v
21、alue as ModuleInfo;MainMenu.Items = MenuHelper.GetToolBar(moduleInfo);/绑定操作菜单选择事件MainMenu.ItemSelected+=new MenuEventHandler(MainMenu_ItemSelected);/获取有权限的操作列表List opList = null;IBaseService baseService = WCFClientProxy.Create();baseService.GetPluginOperate(moduleInfo.ModuleId, (r2, ex2) =if (ex2 !=
22、 null)throw ex2;opList = r2;/对比操作列表,设置菜单项的可见性MenuHelper.SetMenuItemVisibility(MainMenu.Items,opList););6 执行操作SL页面通过选择判断菜单项的Tag与配置的操作ID 进行比对,进入对应的操作方法;void MainMenu_ItemSelected(object sender, MenuEventArgs e)/Tag就是IDswitch (e.Tag.ToString()/新增case “170e79f2-d5eb-44e5-99a0-164431860a64“:AddRecord();break;/删除case “943adf29-3488-4387-91f7-d1b495b03579“:DeleteRecord();break;/刷新case “709cfcab-469b-4faa-bf3d-7d117794a64b“:LoadData();break;