学习笔记Silverlight文档格式.docx
《学习笔记Silverlight文档格式.docx》由会员分享,可在线阅读,更多相关《学习笔记Silverlight文档格式.docx(18页珍藏版)》请在冰豆网上搜索。
![学习笔记Silverlight文档格式.docx](https://file1.bdocx.com/fileroot1/2023-1/21/9aab200d-1e19-4779-b2a5-203c130f1912/9aab200d-1e19-4779-b2a5-203c130f19121.gif)
2、独立存储不应该用来存储代码
3、独立存储不应该用来存储配置和部署配置,它们是由管理员来控制的
Silverlight利用独立存储用户登录信息
Silverlight为客户端,没有了Webform中服务器端为我们常用的会话Session。
登录时存储动态用户信息,cookie可以本地存储,减少开销服务端资源。
Silverlight中的独立存储恰恰很像Webform中的Cookie。
因为Application安全考虑。
Silverlight不允许直接操作本地文件系统。
但是独立存储机制却提供一个虚拟目录方式访问本地文件系统。
当然Silverlight也提供了操作这个虚拟空间的对象的方法。
每个SilverlightApplication应用程序都硬盘分配自己独立存储空间。
默认大小为1M。
也可以根据项目需要修改大小。
IsolatedStorage根据应用程序作用域不同分为:
应用程序和站点两种,使用时分别用IsolatedStorageFile.GetuserStoreForApplication()和IsolatedStorageFile.GetUserStoreForSite()。
对于用户信息建议使用IsolatedStorageSetting对象独立存储配置以键值对方式存储。
添加键值对:
IsolatedStorageSettingssettings=IsolatedStorageSettings.ApplicationSettings;
settings.Add(txtkeyName.Text,TxtKeyValue.Text);
settings.Save();
使用键值对:
TxtKeyValue.Text=settings[txtkeyName.Text].ToString();
删除键值对:
settings.Clear();
如上一种简单方式实现。
虽然能存储用户登录信息。
但有一个缺点:
用户在推出的时候必须主动删除才行,否则会一直保存存储空间中,用户下次访问时无法访问到页面。
换一种方式,我们把用户信息尝试放到Application.Current.Resource中,但又出现一个问题,保存后刷新页面程序会重新加载app,原来保存用户信息也就丢失了。
这种方式也不可取。
类似在Cookie的存储周期以及过期时间。
同理在IsolatedStorage独立存储中也可以设置过期时间。
二、文件的下载和上传
文件的下载:
(ASP.net)
publicvoidDownLoadFile(StringFilePath)//FilePath为要下载的文件地址,即程序中保存的文件
{
//根据虚拟路径找到文件绝对路径
stringfilePath=Server.MapPath(FilePath);
FileInfofile=newFileInfo(filePath);
//判断是否存在文件如果存在就实现下载功能
if(file.Exists)
Response.Clear();
Response.ClearContent();
Response.ClearHeaders();
Response.AddHeader("
Content-Length"
file.Length.ToString());
Content-Disposition"
"
attachment;
filename=\"
"
+HttpUtility.UrlEncode(file.Name,System.Text.Encoding.UTF8)+"
\"
);
Response.ContentType="
application/octet-stream"
;
Response.ContentEncoding=System.Text.Encoding.GetEncoding("
gb2312"
Response.Filter.Close();
Response.WriteFile(file.FullName);
Response.Flush();
Response.End();
}
Silverlight
privateOpenFileDialogopenFile=newOpenFileDialog();
将打开的图片显示在Image控件中
//弹出文件对象框
if(openFile.ShowDialog()==true)//这种方法很好用
BitmapImagebmp=newBitmapImage();
//设置图源为用户选择的图片
bmp.SetSource(openFile.File.OpenRead());
image.Source=bmp;
上传图片
//判断用户是否已选择了图片
if(openFile.File!
=null)
//图片文件名
filename=openFile.File.Name;
WebClientwebclient=newWebClient();
//指定上传处理的服务地址
Uriuri=
newUri("
http:
//localhost:
2365/Sample.Web/UploadFile.ashx?
filename="
+filename,UriKind.Absolute);
webclient.OpenWriteCompleted+=
newOpenWriteCompletedEventHandler(webclient_OpenWriteCompleted);
//POST图片文件到服务器UploadFile.ashx
webclient.OpenWriteAsync(uri,"
POST"
openFile.File.OpenRead());
voidwebclient_OpenWriteCompleted(objectsender,OpenWriteCompletedEventArgse)
//将图片数据流发送到服务器上
StreaminputStream=e.UserStateasStream;
StreamoutputStream=e.Result;
//缓冲区
byte[]buffer=newbyte[4096];
intbytesRead=0;
while((bytesRead=inputStream.Read(buffer,0,buffer.Length))>
0)
outputStream.Write(buffer,0,bytesRead);
//关闭流
outputStream.Close();
inputStream.Close();
MessageBox.Show("
上传完成!
}
UploadFile.ashx文件
publicclassUploadFile:
IHttpHandler{
publicvoidProcessRequest(HttpContextcontext){
//获取上传的数据流
Streamsr=context.Request.InputStream;
//取得文件名
stringfilename=context.Request["
filename"
];
try
//上传服务器的Upload文件夹里
stringpath="
D:
\\银光志Silverlight3.0光盘\\Source\\Sample.Web\\Upload\\"
//将数据流写入服务器端
using(FileStreamfs=
File.Create(path+filename,4096))
while((bytesRead=
sr.Read(buffer,0,buffer.Length))>
fs.Write(buffer,0,bytesRead);
catch(Exceptione)
//错误提示
context.Response.ContentType="
text/plain"
context.Response.Write
("
上传失败,提示信息:
+e.Message);
finally
sr.Dispose();
publicboolIsReusable{
get{
returnfalse;
三、Silverlight的相对路径问题
1
2
3
3.1同一项目中使用情况
新建一个Silverlight程序,则会有ResourceLocation、ResourceLocation.Web两个部分。
选择ResourceLocation项目,点击鼠标右键,跳出菜单,选择添加--现有项,引入我们准备好的图片A.jpg,把它重命名为p.jpg.修改ResourceLocation的Page.xaml文件,主要是Image控件的Source属性,改为:
<
ImageHeight="
300"
Width="
400"
Source="
p.jpg"
>
<
/Image>
按F5,运行,我们可以看到图片A.jpg的内容。
回到编辑环境,在项目ResourceLocation.Web的ClientBin目录下,添加--现有项,引入我们准备好的图片B.jpg,把它也重命名为p.jpg.然后修改ResourceLocation的Page.xaml文件
/p.jpg"
按F5,运行,我们看到的仍然是图片A.jpg的内容。
接下来,我们删除掉ResourceLocation项目中的p.jpg文件
按F5,运行,这下,我们看到的图片内容变成了B.jpg图片的内容。
实验说明:
(1)当资源的分布为
ResourceLocation--p.jpg
ResourceLocation.Web--ClientBin-p.jpg
两个位置时,ResourceLocation--p.jpg资源先被定位,如果此处找不到,再到ResourceLocation.Web--ClientBin-p.jpg处寻找,如果此处也找不找,则会报错
(2)、Source引用资源的区别
图片放在ResourceLocation中时,引用写法:
Source="
图片放在ResourceLocation.Web--ClientBin中时,引用写法:
反斜杠开头的相对路径,代表的相对位置是应用程序运行的根目录,即ResourceLocation.xap压缩包内,若在这其中寻找不到要引用的文件,则相对路径的回退机制自动在在ResourceLocation.xap所在的目录,本例即为ResourceLocation.Web--ClientBin目录中寻找加以引用。
两个位置都没有,才会发生错误。
不以"
/"
开头,则代表的相对位置是引用该图片的XAML文件所在的目录,本例即Page.xaml文件所在的ResourceLocation目录。
(3)、资源文件放置的位置:
当我们把图片A.jpg添加到ResourceLocation项目中后,点击此图片,查看它的属性,在"
生成操作"
栏我们可以看到默认的选项是Resource,它表明,当我们生成项目时,此资源是打包在程序集中的,此时我们引用它可以写成Source="
,按F5运行,可以直接看到图片。
现在,我们如果把此栏的选项选成:
Content,则意味着,我们在生成项目时,此资源将会打包进ResourceLocation.xap文件中,在此情况下,我们重新生成项目,按下F5,运行,可以发现,我们再也看不到图片了(当然,我们要确保在ResourceLocation.Web--ClientBin目录下没有放置此图片,否则系统会到那里去寻找并显示)
先别急,我们对image控件的Source属性进行修改,改成Source="
,即:
加入一个反斜杠,再F5运行,这下,我们可以看到图片了。
这说明,我们在放置资源时,我们可以:
i、直接把资源文件放在ClienBin文件目录下。
此时引用要加入反斜杠。
如Source="
ii、把资源文件放在与page.xaml同目录下,此时我们有两个选择:
一是把资源文件属性中的“BuildAction”栏即:
设置为"
Resource"
。
此时资源打包在程序集,此时引用不用加入反斜杠。
二是把资源文件属性中的“BuildAction”栏即:
Content"
此时资源打包在.xap压缩包中,这时引用该文件则需要以反斜杠开头。
那么,上述放法在性能上有什么区别呢:
因为,不以反斜杠开头的图片资源是嵌入到Silverlight程序中,xap文件直接下载到客户端,所以当数据量较大时,不以反斜杠开头的方式加载程序的时间就过长。
以"
开头自然就没上述问题,但是,以反斜杠开头的话,在xaml中设计预览看不到,只有程序运行才可以看到
3.2不同项目中使用
这里列出一些常用的设置Image相对路径的几种方法:
假设我有这样一个solution,包括:
MyImageLibrary,其中包含一个文件夹"
Images\MyImage1.png"
MyLoadImage是我的SilverlightApplication里面也有一个Images\MyImage2.png,页面中有一Image控件来分别显示这两个图片
1.BuildAction="
CopyToOutPutDirectory="
Donotcopy"
.
这时如果需要用另一个项目中的Image,那么需要这样设置Image路径
xaml:
<
ImageSource="
/ResourceLocation;
component/Images/MyImage1.png"
/>
code:
myImage.Source=newBitmapImage(newUri("
/MyImageLibrary;
UriKind.Relative));
这个Uri有如下3部分:
•/ResourceLocation是Image所在的Assembly的名字,前面的"
是必须的。
•"
component/"
是Assembly名字和在此Assembly下具体路径之间的分隔符,必须要有。
Images/MyImage1.png"
就是所在Assembly中的路径啦。
2.BuildAction="
这种情况,如果图片在另一个Project中,那是没有办法获得的。
只有在同一个Project中的时候,才能够被找到,因为这种设置会把Image嵌入.xap中。
如果打开生成的xap,会看到如下:
可以看到只有同一个Project中的Image作为Content嵌入到xap中。
这时的用法就是
Images/MyImage2.png"
/>
3.BuildAction="
None"
CopyAlways"
如果不希望图片被压进Xap文件,而是用户调用的时候再动态Load,那可以用这种方法。
这种方法图片会被复制到xap所在路径下,路径依然是Images\MyImage1.png,Images\MyImage2.png.
使用方法如前<
或<
遇到图片加载错误时,应该先检查选用的是那种方法,然后再检查图片是否被正确放在所期望的地方.dll/xap/路径中。
其他常见的原因还包括:
用绝对路径的时候要注意是否是Cross-scheme,比如如果你的项目要从加载位于(Filevs.Http),这时会有Security错误产生,解决方法就是用一个ASP.netwebsite作为起始工程,然后加入Silverlight工程。
四、Silverlight换肤
4
4.1资源字典的使用
Silverlight中为控件设置主题,需要添加引用usingSystem.Windows.Controls.Theming;
来实现,Theming中包含一个名为ImplicitStyleManager(隐式样式管理器)的静态类,简称ISM。
ISM的ApplyMode属性值包括3个值,分别说明如下:
Auto:
自动更新模型,每当元素树种的内容发生变动时,ISM都会自动更新其样式,由于LayoutUpdated方法调用频繁,所以当元素树比较庞大时,使用Auto模式相对于OneTime模式性能较低,但是,这种方法的优点在于便于设计人员设计。
OneTime:
一次性更新,元素树只在第一次应用样式时生效,不对其后发生的内容变化产生相应。
None:
不适用样式更新功能,ISM此时是被视为无效
SilverlightToolkit为用户提供了模板控件的源XAML文件,这些文件位于C:
\ProgramFiles\MicrosoftSDKs\Silverlight\v3.0\Toolkit\Nov09\Themes\Xaml,我们从中拷贝System.Windows.Controls.Theming.ShinyBlue.xaml文件和System.Windows.Controls.Theming.RainierOrange.xaml文件,并重命名为ShinyBlue.xaml和RainierOrange.xaml,放在项目的Themes文件夹下,以供使用,其中Buttontheme.xaml为自定义样式文件,只包含对Button样式的定义。
可以通过给父级控件添加对资源字典的引用,实现所有控件的样式定义,代码如下:
Gridx:
Name="
LayoutRoot"
theming:
ImplicitStyleManager.ApplyMode="
Auto"
ImplicitStyleManager.ResourceDictionaryUri="
Themes/ShinyBlue.xaml"
·
/Grid>
也可以通过代码在后台定义,在页面初始化函数中,添加如下代码,ThemGrid为定义的父级控件:
Uriuri=newUri("
UriKind.Relative);
//声明资源字典文件的相对路径
ImplicitStyleManager.SetResourceDictionaryUri(ThemGrid,uri);
//设置更新模式为Auto
ImplicitStyleManager.SetApplyMode(ThemGrid,ImplicitStylesApplyMode.Auto);
//应用样式到控件
ImplicitStyleManager.Apply(ThemGrid);
这样之后的效果为:
(这个是应用的LayoutRoot的效果)
其中蓝色控件的样式为资源字典中没有定义Key值的样式,黄色的为定义了