wp7读取项目生成的资源(Resource)文件

探讨了在 Windows Phone 应用中通过 C# 访问特定生成操作为 Content 的文件遇到的问题,以及如何将其修改为 Resource 类型来解决无法访问的问题。文中还介绍了不同生成操作类型的区别和资源的访问方式。

引子:有这么一个场合:windows phone 需要读取工程中带的文件,比如配置文件,图片,声音等资源。


试图:之前的文件操作都是通过独立存储空间(IsolatedStorageFile)去写文件,然后再读出来,或者通过http请求网络上的资源再写成文件。看了下SplashScreenImage.jpg,Background.png,ApplicationIcon.png 这三个文件的生成操作(build action)都是 内容(Content)。于是把自己的测试文件 1.txt 放在了工程的根目录,以为build工程就会在独立存储空间下输出这个1.txt. 结果发现1.txt只是被生成到了 xap包下的根目录,通过IsoStoreSpy这个工具打开独立存储空间,并没有期望发现生成的1.txt。

也就是说,我们没有办法通过

[csharp] view plain copy
  1. IsolatedStorageFile.GetUserStoreForApplication();//访问应用程序当前的独立存储空间
来获取到我们事先输出的1.txt。并且会报 Operation not permitted on IsolatedStorageFileStream 的错误。
在搜索了 一些资料 后,了解到windows phone的安全机制不允许通过C#代码访问生成操作为Content的文件。

解决:

于是把 1.txt 的生成操作修改成 Resource,通过访问资源的方式:

[html] view plain copy
  1. App.GetResourceStream(newUri("/PhoneApp;component/1.txt",UriKind.Relative)).Stream;

完整的访问代码如下:
//读取资源包里的TXT文件(注意:一定要把文件设为resource,读取不到)

using (Stream stream = App.GetResourceStream(new Uri("/ReadResText;component/1.txt", UriKind.Relative)).Stream) { string strFileContent = string.Empty; using (StreamReader reader = new StreamReader(stream)) { strFileContent = reader.ReadToEnd(); TxtTB.Text = strFileContent; } }

在这个过程中了解到:如果生成操作是Content的话,个别类型的文件是可以通过C#代码访问的。比如

xml文件:

[csharp] view plain copy
  1. XElementel=XElement.Load("/Config/abc.xml");
  2. textBlock1.Text=el.ToString();

图片文件:

[csharp] view plain copy
  1. Uriuri=newUri("/Images/abc.jpg",UriKind.Relative);
  2. BitmapImagebmp=newBitmapImage(uri);
  3. image1.Source=bmp;
多媒体文件可以通过MediaPlayerElement访问。


在这一点上,wp7对资源的处理比xna稍微麻烦了些,在xna里,资源是做为一个工程来单独管理的。我想如果通过调用xna,也应该能解决这个问题,不过那样稍微曲线了点。


后记:

在查阅资料的过程中,也有一些其他的收获,顺便也记录一下。

各种生成操作(Build Action)的区别:

None:此文件将被忽略不参与编译和输出
Compile:文件将被编译为Microsoft 中间语言(IL),如文件扩展名为cs的文件
Content:文件将会打包进xap文件当中,以独立文件使用,访问是时直接根据在工程根目录下的路径
Page:在WP当中,xaml页面文件都属于Page,除App.xaml文件外

Resource:文件将被编译到xap文件包的.dll文件内,访问资源文件的路径方式繁琐一些,如"/PhoneApp1;component/Images/back.png",PhoneApp1是项目名称,component是固定名称,避免异步加载的资源文件时使用

CodeAnalysisDictionary :xaml文件
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值