1、2、 独立存储不应该用来存储代码3、 独立存储不应该用来存储配置和部署配置,它们是由管理员来控制的Silverlight利用独立存储用户登录信息Silverlight为客户端,没有了Webform中服务器端为我们常用的会话Session。登录时存储动态用户信息,cookie可以本地存储,减少开销服务端资源。Silverlight中的独立存储恰恰很像Webform中的Cookie。因为Application安全考虑。Silverlight不允许直接操作本地文件系统。但是独立存储机制却提供一个虚拟目录方式访问本地文件系统。当然Silverlight也提供了操作这个虚拟空间的对象的方法。每个Silv
2、erlight Application应用程序都硬盘分配自己独立存储空间。默认大小为1M。也可以根据项目需要修改大小。Isolated Storage根据应用程序作用域不同分为:应用程序和站点两种,使用时分别用IsolatedStorageFile.GetuserStoreForApplication()和IsolatedStorageFile.GetUserStoreForSite()。对于用户信息建议使用IsolatedStorageSetting对象独立存储配置以键值对方式存储。添加键值对:IsolatedStorageSettings settings = IsolatedStorag
3、eSettings.ApplicationSettings; settings.Add(txtkeyName.Text, TxtKeyValue.Text); settings.Save();使用键值对: TxtKeyValue.Text = settingstxtkeyName.Text.ToString();删除键值对: settings.Clear();如上一种简单方式实现。虽然能存储用户登录信息。但有一个缺点:用户在推出的时候必须主动删除才行,否则会一直保存存储空间中,用户下次访问时 无法访问到页面。换一种方式,我们把用户信息尝试放到Application.Current.Resour
4、ce中,但又出现一个问题,保存后刷新页面程序会重新加载app,原来保存用户信息也就丢失了。这种方式也不可取。类似在Cookie的存储周期以及过期时间。同理在IsolatedStorage独立存储中也可以设置过期时间。二、 文件的下载和上传文件的下载:(ASP.net)public void DownLoadFile(String FilePath) / FilePath为要下载的文件地址,即程序中保存的文件 /根据虚拟路径找到文件绝对路径 string filePath = Server.MapPath(FilePath); FileInfo file = new FileInfo(fileP
5、ath); /判断是否存在文件如果存在就实现下载功能 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
6、 = application/octet-stream; Response.ContentEncoding = System.Text.Encoding.GetEncoding(gb2312 Response.Filter.Close(); Response.WriteFile(file.FullName); Response.Flush(); Response.End(); Silverlightprivate OpenFileDialog openFile = new OpenFileDialog();将打开的图片显示在Image控件中/弹出文件对象框 if (openFile.ShowD
7、ialog() = true)/这种方法很好用 BitmapImage bmp = new BitmapImage(); /设置图源为用户选择的图片 bmp.SetSource(openFile.File.OpenRead(); image.Source = bmp;上传图片/判断用户是否已选择了图片 if (openFile.File != null) /图片文件名 filename = openFile.File.Name; WebClient webclient = new WebClient(); /指定上传处理的服务地址 Uri uri = new Uri(http:/localho
8、st:2365/Sample.Web/UploadFile.ashx?filename= +filename, UriKind.Absolute); webclient.OpenWriteCompleted += new OpenWriteCompletedEventHandler(webclient_OpenWriteCompleted); /POST图片文件到服务器UploadFile.ashx webclient.OpenWriteAsync(uri, POST,openFile.File.OpenRead(); void webclient_OpenWriteCompleted(obj
9、ect sender, OpenWriteCompletedEventArgs e) /将图片数据流发送到服务器上 Stream inputStream = e.UserState as Stream; Stream outputStream = e.Result; /缓冲区 byte buffer = new byte4096; int bytesRead = 0; while (bytesRead = inputStream.Read(buffer, 0, buffer.Length) 0) outputStream.Write(buffer, 0, bytesRead); /关闭流 ou
10、tputStream.Close(); inputStream.Close(); MessageBox.Show(上传完成!UploadFile.ashx文件public class UploadFile : IHttpHandler public void ProcessRequest (HttpContext context) /获取上传的数据流 Stream sr = context.Request.InputStream; /取得文件名 string filename = context.Requestfilename; try /上传服务器的Upload文件夹里 string pat
11、h =D:银光志Silverlight3.0光盘SourceSample.WebUpload /将数据流写入服务器端 using (FileStream fs = File.Create(path + filename, 4096) while (bytesRead = sr.Read(buffer, 0, buffer.Length) fs.Write(buffer, 0, bytesRead); catch (Exception e) /错误提示 context.Response.ContentType = text/plain context.Response.Write (上传失败,
12、提示信息: + e.Message); finally sr.Dispose(); public bool IsReusable get return false;三、 Silverlight的相对路径问题1 2 3 3.1 同一项目中使用情况新建一个Silverlight程序,则会有ResourceLocation、ResourceLocation.Web两个部分。选择ResourceLocation项目,点击鼠标右键,跳出菜单,选择添加-现有项,引入我们准备好的图片A.jpg,把它重命名为p.jpg. 修改ResourceLocation的Page.xaml文件,主要是Image控件的So
13、urce属性,改为:按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.jpgResourceLocation
14、.Web-ClientBin-p.jpg两个位置时,ResourceLocation-p.jpg资源先被定位,如果此处找不到,再到ResourceLocation.Web-ClientBin-p.jpg处寻找,如果此处也找不找,则会报错(2)、Source引用资源的区别图片放在ResourceLocation中时,引用写法: Source=图片放在ResourceLocation.Web-ClientBin中时,引用写法: 反斜杠开头的相对路径,代表的相对位置是应用程序运行的根目录,即ResourceLocation.xap压缩包内,若在这其中寻找不到要引 用的文件,则相对路径的回退机制自动在
15、在ResourceLocation.xap所在的目录,本例即为 ResourceLocation.Web-ClientBin 目录中寻找加以引用。两个位置都没有,才会发生错误。不以/开头,则代表的相对位置是引用该图片的XAML文件所在的目录,本例即Page.xaml文件所在的ResourceLocation目录。(3)、资源文件放置的位置:当我们把图片A.jpg添加到ResourceLocation项目中后,点击此图片,查看它的属性,在生成操作栏我们可以看到默认的选项 是Resource,它表明,当我们生成项目时,此资源是打包在程序集中的,此时我们引用它可以写成 Source=,按F5运行,可
16、以直接看到图片。现在,我们如果把此栏的选项选成:Content,则意味着,我们在生成项目时,此资源将会打包进ResourceLocation.xap文件中,在此情况下,我们重新生成项目,按下F5,运行,可以发现,我们再也看不到图片了(当然,我们要确保在 ResourceLocation.Web- ClientBin目录下没有放置此图片 ,否则系统会到那里去寻找并显示)先别急,我们对image控件的Source属性进行修改,改成Source=,即:加入一个反斜杠,再F5运行,这下,我们可以看到图片了。这说明,我们在放置资源时,我们可以:i、直接把资源文件放在ClienBin文件目录下。此时引用要
17、加入反斜杠。如 Source=ii、把资源文件放在与page.xaml同目录下,此时我们有两个选择:一是把资源文件属性中的“Build Action”栏即:设置为Resource。此时资源打包在程序集,此时引用不用加入反斜杠。二是把资源文件属性中的“Build Action”栏即:Content此时资源打包在.xap压缩包中,这时引用该文件则需要以反斜杠开头。那么,上述放法在性能上有什么区别呢:因为,不以反斜杠开头的图片资源是嵌入到Silverlight程序中,xap文件直接下载到客户端,所以当数据量较大时,不以反斜杠开头的方式加载程序的时间就过长。以开头自然就没上述问题,但是,以反斜杠开头的
18、话,在xaml中设计预览看不到,只有程序运行才可以看到3.2 不同项目中使用这里列出一些常用的设置Image 相对路径的几种方法:假设我有这样一个solution,包括: MyImageLibrary,其中包含一个文件夹ImagesMyImage1.png MyLoadImage是我的Silverlight Application里面也有一个ImagesMyImage2.png, 页面中有一Image控件来分别显示这两个图片1.Build Action=, Copy To OutPut Directory = Do not copy.这时如果需要用另一个项目中的Image,那么需要这样设置Im
19、age路径xaml: code: myImage.Source = new BitmapImage(new Uri(/MyImageLibrary;, UriKind.Relative);这个Uri有如下3部分:/ ResourceLocation是Image所在的Assembly的名字,前面的是必须的。component/是Assembly名字和在此Assembly下具体路径之间的分隔符,必须要有。Images/MyImage1.png 就是所在Assembly中的路径啦。2. Build Action = 这种情况,如果图片在另一个Project中,那是没有办法获得的。只有在同一个Proj
20、ect中的时候,才能够被找到,因为这种设置会把Image嵌入.xap中。如果打开生成的xap,会看到如下:可以看到只有同一个Project中的Image作为Content嵌入到xap中。这时的用法就是Images/MyImage2.png/3.Build Action = NoneCopy Always如果不希望图片被压进Xap文件,而是用户调用的时候再动态Load,那可以用这种方法。这种方法图片会被复制到 xap所在路径下,路径依然是 ImagesMyImage1.png, ImagesMyImage2.png.使用方法如前 或也可以通过代码在后台定义,在页面初始化函数中,添加如下代码,Th
21、emGrid为定义的父级控件:Uri uri = new Uri(, UriKind.Relative); /声明资源字典文件的相对路径 ImplicitStyleManager.SetResourceDictionaryUri(ThemGrid, uri); /设置更新模式为Auto ImplicitStyleManager.SetApplyMode(ThemGrid, ImplicitStylesApplyMode.Auto); /应用样式到控件 ImplicitStyleManager.Apply(ThemGrid);这样之后的效果为:(这个是应用的LayoutRoot的效果)其中蓝色控件的样式为资源字典中没有定义Key值的样式,黄色的为定义了
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1