学习笔记Silverlight文档格式.docx

上传人:b****6 文档编号:20351526 上传时间:2023-01-22 格式:DOCX 页数:18 大小:180.48KB
下载 相关 举报
学习笔记Silverlight文档格式.docx_第1页
第1页 / 共18页
学习笔记Silverlight文档格式.docx_第2页
第2页 / 共18页
学习笔记Silverlight文档格式.docx_第3页
第3页 / 共18页
学习笔记Silverlight文档格式.docx_第4页
第4页 / 共18页
学习笔记Silverlight文档格式.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

学习笔记Silverlight文档格式.docx

《学习笔记Silverlight文档格式.docx》由会员分享,可在线阅读,更多相关《学习笔记Silverlight文档格式.docx(18页珍藏版)》请在冰豆网上搜索。

学习笔记Silverlight文档格式.docx

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值的样式,黄色的为定义了

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 外语学习 > 英语学习

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1