转自:http://blog.youkuaiyun.com/luminji/archive/2009/11/24/4860887.aspx
一:布局
共有三种常用模式:
Canvas:绝对位置;
StackPanel:相对位置;
Grid:表格;
二:样式表
可以创建样式字典文件,同时,该字典文件必须包含在app.xaml中。
三:框架或者导航
一种方式如下:
使用 HTML Bridge 功能的一个原因是创建将 Silverlight 与其他基于 HTML 的内容相集成的网页。还可以使用 HTML DOM 在单一页面中集成多个基于 Silverlight 的应用程序。然而,在此情况下,Silverlight 为在多个 Silverlight 插件之间进行通信提供内置支持,称为本地消息传递。
通过本地消息传递,您可以将消息从一个基于 Silverlight 的应用程序发送到在同一台计算机上运行的其他应用程序。这样,您可以创建跨多个插件的 Silverlight 内容,例如从横幅跨越到侧栏的动画。有关更多信息,请参见基于 Silverlight 的本地应用程序之间的通信。
另一种方式是:
对于应用程序导航,您可以使用 Frame 和 Page 控件。此框架用作页面控件的容器,有助于进行页面导航。每页都包含内容,您可以根据需要添加很多页面来向用户表示内容。在任一时刻,框架只显示一个页面的内容。对于外部导航,您可以在用户界面中提供普通的超链接,或者通过 HTML DOM 执行编程导航。
四: 未经处理的异常处理
在应用程序的生存期中,可能会发生意外情况,而导致 Silverlight 插件引发异常。尽管您可以在应用程序代码中捕获异常,但您可能无法预期所有潜在的异常。
未经处理的异常将导致 Silverlight 插件停止在浏览器中运行。为了防止发生这一情况,请处理 Application..::.UnhandledException 事件。可以用事件数据来确定异常是否可恢复。如果可以从异常中恢复,则将 ApplicationUnhandledExceptionEventArgs..::.Handled 属性设置为 true。
如果您不在托管代码中处理异常,则将发生 Silverlight 插件 onError 事件。这向您提供最后一个机会,供您通过在宿主网页中使用 JavaScript 来处理此异常。onError 事件提供对插件错误代码的访问,这对于进行调试可能很有用。有关更多信息,请参见调试、错误处理和异常。有关错误代码信息,请参见 Silverlight Plug-in Error Messages(Silverlight 插件错误消息)。
五:在XAML中使用命名空间
如果在XAML使用如下标示,
<windows:HierarchicalDataTemplate x:Key="ChildTemplate" ItemsSource="{Binding Path=ChildTopics}" >
<TextBlock FontStyle="Italic" Text="{Binding Path=Title}" />
</windows:HierarchicalDataTemplate>
若提示
未找到类型“windows:HierarchicalDataTemplate”。请确保不缺少程序集引用,并且已生成所有引用的程序集。
则,我们需要在类库文档中找到HierarchicalDataTemplate这个类,发现该类属于
命名空间: System.Windows
程序集: System.Windows.Controls(在 System.Windows.Controls.dll 中)
故,我们要在XAML文档中,标识出:
xmlns:windows="clr-namespace:System.Windows;assembly=System.Windows.Controls"
这个时候,再运行项目文件,就没有问题了。
六:关于图片路径
首先,图片作为一种资源有大约有三种方法。
第一种,将图片存在于另外的一个项目中
比如单独建立一个ImageResource的项目里面放了图片,那么在SilverLight项目中怎么访问这个路径那? 使用的是这种访问模式:
<image source ="/ImageResource;component/a.jpg" ...
第二种,就是图片位于SilverLight项目中,比如我在项目下放了一个文件夹Images,其中有一个图片是LableBg.png,并且将这个LableBg的图片的属性改为 Resource,这时图片会编译打包进DLL中,<image source ="Images/LabelBg.png" ,路径前不需要加上斜线 。
如果把LableBg的图片的属性改为 内容,这时 图片会编译打包进XAP文件中 ,这时访问这个图片需要<image source ="/Images/LabelBg.png" ...,需要加上一个斜线
最后一种办法就是将图片直接放到ClientBin目录下,这种方法不可取就不介绍了 。
七:连接WEBSERVICE
假设创建SL主应用程序的时候,应用程序名为SLApp,提供WEBSERVICE服务器的网站为SLApp.web,整个解决方案的逻辑层为SLBLL。也就是说,数据流方向为:
SLApp从SLBLL获取数据,SLBLL从SLApp.web提供的WEBSERVICE获得来自于数据库的数据。
基于此,首先,我们要在SLBLL中添加对WEBSERVICE的引用,我们会发现,SL项目在对WS进行引用的时候,会在项目根目录下创建文件ServiceReferences.ClientConfig。
下面来讲两个问题:
1: 假设你的编码一切正常,这个时候运行程序,我们会发现出错,在错误日志中,发现系统找不到ServiceReferences.ClientConfig这个文件。
也就是说,你还必须在SLApp的根目录下手动创建一个一摸一样的文件,才能保证系统的正常运行。
2:SL项目对于WEBSERVICE的调用全部采用异步来执行。所以,需要小心地处理结果信息。
??? 上面的SLBLL ,没看懂,什么意思?
八:WEBSERVICE调用数据库
由于SL3.0不支持DATASET和DATATABLE,所以,我们无法在WEBSERVICE的函数中返回一个DATASET。可以使用List<ARealObject>来代替DataSet返回结果。
问题是,针对每一个表的查询,都提供一个返回List<ARealObject>的做法,不太通用,也不灵活,比如有的时候我们只需要查询某个表的一条记录的特定一个字段,显然这种方式效率不是很高。而我们想到,一个表,无非就是一些不同类型字段的组合,故,可以模拟一个表示表的对象,如下:
/// <summary>
/// 模拟数据库表
/// PS:一张表的字段不外乎几个基本数据类型,查询出来的值,在这里进行赋值
/// 本类的一个实例,相当于是一条记录,本类的一个实例数组,就相当于是datatable
/// 在UI端,你可将本类的实例数组转换为数据源
/// </summary>
public class BaseVars
{
public BaseVars()
{
ListString = new List<string>();
ListInt = new List<int>();
ListBool = new List<bool>();
ListByte = new List<byte>();
ListFloat = new List<float>();
ListDouble = new List<double>();
}
public List<string> ListString { get; set; }
public List<int> ListInt { get; set; }
public List<bool> ListBool { get; set; }
public List<byte> ListByte { get; set; }
public List<float> ListFloat { get; set; }
public List<double> ListDouble { get; set; }
}
则我们的WS的函数就可以是如下:
/// <summary>
/// 通用查询方法
/// 1:查询返回的记录,将会生成实例BaseVars;
/// 2:本方法返回BaseVars的列表;
/// 3:在调用方,要重新对数据进行组织,以便进行展示;
/// </summary>
/// <param name="sql"></param>
/// <param name="commandParams"></param>
/// <returns></returns>
[WebMethod]
public List<BaseVars> GetListBaseVars(string sql, params SqlParameter[] commandParams)
{
List<BaseVars> lr = new List<BaseVars>();
using (DataSet ds = SqlHelper.ExecuteDataSet(sql, commandParams))
{
if (ds == null || ds.Tables[0].Rows.Count < 0)
{
return null;
}
lr = ListBaseDataSet.DataSetToListBaseVars(ds, 0);
}
return lr;
}
注意,上文中的ListBaseDataSet.DataSetToListBaseVars这个函数,是用来将DataSet转化为一个BaseVars的列表。
九:DATAGRID的使用
9.1 简单应用
对于数据的展示,在SL项目中有DataGrid,DataPager,DataForm。最常用的方式如下:
在XAML中:
<datagrid:DataGrid x:Name="sd" ItemsSource="{Binding}">
</datagrid:DataGrid>
<datagrid:DataPager Grid.Row="1" Source="{Binding}" PageSize="10" />
<dataform:DataForm Margin="4" Grid.Column="1" ItemsSource="{Binding}">
</dataform:DataForm>
在XAML.CS中:
List<ARealObject> la = ..... //获取数据
this.DataCotext = la;
这样就可以进行简单的展示。
9.2 自定义数据源
如:
<datagrid:DataGrid x:Name="ly">
</datagrid:DataGrid>
<datagrid:DataPager x:Name="lyp" Grid.Row="1" PageSize="10" />
数据绑定代码为:
//我是在这个函数中进行数据的绑定的
void GetResourceCompleted(List<DispResource> ldr)
{
ldResource = ldr; //将一个List赋值给已定义好的变量
pcvSource = new PagedCollectionView(ldResource); //PagedCollectionView用于展示数据
this.ly.ItemsSource = pcvSource; //与在XMAL中定义好的变量赋值
this.lyp.Source = pcvSource;
this.ly.CellEditEnded += new EventHandler<DataGridCellEditEndedEventArgs>(ly_CellEditEnded);
}
通过这种方式,你可以将数据源的赋值变得更灵活。
9.3 编辑数据
如果你需要对DataGrid的编辑做出处理(如编辑后要保存到数据库),则上文定义的ly_CellEditEnded就可以用来处理该行为。
添加和删除记录的处理如下:
//先创建一个记录
DispResource dr = new DispResource();
dr.ResourceName = cwr.sourceName.Text.Trim();
dr.DispOrder = ldResource.Last().DispOrder + 1;
//将这个记录添加到pcvSource的数据源ldResource中去
ldResource.Add(dr);
//刷新界面
pcvSource.CommitEdit();
pcvSource.Refresh();
9.4 自定义列
上文中的DispResource被定义为如下。这就是DATAGRID要显示的列。
public class DispResource
{
[Display(Name = "来源",AutoGenerateField=true)]
public string ResourceName { set; get; }
[Display(Name = "显示次序")]
public int DispOrder { set; get; }
}
10:在SL中开发自定义控件
首先,需要创建一个SL的类库项目。如:.QuestionsDbSLCtrls。在这个项目中,创建一个SL控件,如下:
XAML:
<UserControl x:Class="YiPin.QuestionsDbSLCtrls.SLControlDemo"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="400" Height="300">
<Grid x:Name="LayoutRoot" Background="Blue">
<TextBlock x:Name="tb" Text="default"></TextBlock>
</Grid>
</UserControl>
CS:
public partial class SLControlDemo : UserControl
{
public SLControlDemo()
{
InitializeComponent();
}
private string msgShow;
public string MsgShow
{
get { return msgShow; }
set { msgShow = value; tb.Text = value; }
}
}
编译后,在要调用它的项目中,在VS编辑界面工具箱上点右键选择“选择项”,再选择“silverlight 组件项”,然后“浏览”,选择QuestionsDbSLCtrls项目所对应的DLL。这个时候工具箱上就添加了这个控件。
在你要调用的项目中,拖动刚添加的这个控件到界面,就可以进行编码了。
本文来自优快云博客,转载请标明出处:http://blog.youkuaiyun.com/luminji/archive/2009/11/24/4860887.aspx