打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
WPF下遍历作为Resource嵌入在可执行程序中的图片的一点思考
userphoto

2014.07.29

关注
时间:2012-02-23 18:51来源:nonocast.cn 作者:nonocast
CSDN原帖地址, WPF下遍历作为Resource嵌入在可执行程序中的图片的一点思考 很喜欢这种风格的思考,试着解一下: 第一种解法 ResourceManager ResourceSet 1. 将需要嵌入的图片以Resource形式copy到Solution目录下,Resource会嵌入exe,而Content不会,需注意 2. 通过ResourceManager ResourceSet枚举Resource,出处自 Pro
CSDN原帖地址,WPF下遍历作为Resource嵌入在可执行程序中的图片的一点思考
很喜欢这种风格的思考,试着解一下:
第一种解法 – ResourceManager & ResourceSet
1. 将需要嵌入的图片以Resource形式copy到Solution目录下,Resource会嵌入exe,而Content不会,需注意
2. 通过ResourceManager & ResourceSet枚举Resource,出处自Pro WPF in C# 2008 p.266
string resourceName = this.GetType().Assembly.GetName().Name + ".g";
ResourceManager mgr = new ResourceManager(resourceName, this.GetType().Assembly);
using (ResourceSet set = mgr.GetResourceSet(CultureInfo.CurrentCulture, true, true)) {
foreach (DictionaryEntry each in set) {
if (".jpg" == Path.GetExtension(each.Key.ToString()).ToLower()) {
// 得到所有jpg格式的图片
}
}
}
3. 将此方法置入ImageManager对象中
public class ImageManager : Dictionary<string, BitmapImage> {
public static ImageManager Instance { get { return instance; } }
private ImageManager() { }
public void Open() {
string resourceName = this.GetType().Assembly.GetName().Name + ".g";
ResourceManager mgr = new ResourceManager(resourceName, this.GetType().Assembly);
using (ResourceSet set = mgr.GetResourceSet(CultureInfo.CurrentCulture, true, true)) {
foreach (DictionaryEntry each in set) {
if (".jpg" == Path.GetExtension(each.Key.ToString()).ToLower()) {
try {
var image = new BitmapImage();
image.BeginInit();
image.StreamSource = (each.Value as UnmanagedMemoryStream);
image.CacheOption = BitmapCacheOption.OnLoad;
image.EndInit();
this.Add(Path.GetFileNameWithoutExtension(each.Key.ToString()), image);
} catch (Exception ex) {
Trace.WriteLine(string.Format("Load {0} failed, the reason is:\n{1}", each.Key.ToString(), ex.ToString()));
// go ahead
}
}
}
}
}
private static ImageManager instance = new ImageManager();
}
4. 在App的OnStartup中ImageManager.Instance.Open()
5. 最后就是binding了
<Window xmlns:local="clr-namespace:Test01" ...>
<WrapPanel DataContext="{Binding Source={x:Static local:ImageManager.Instance}}">
<WrapPanel.Resources>
<Style TargetType="Image">
...
</Style>
</WrapPanel.Resources>
<Image Source="{Binding [001]}" />
<Image Source="{Binding [002]}" />
<Image Source="{Binding [003]}" />
<Image Source="{Binding [004]}" />
<Image Source="{Binding [005]}" />
</WrapPanel>
</Window>
6. 那你如果需要动态生成,OK的,遍历ImageManager即可。
7. 下载上述代码,戳
UPDATE:
如果觉得有什么不好的话就是每次compile的时候都需要将这些Resource写入exe中,DUPLICATE CODE IS EVEL.本着将变与不变的分离原则,很容易将这些相对固定不变的Resource以上述方式置入一个独立的dll中,比如Resources.dll,代码中需要配套修改assembly参数。
接着说第二种解法:
简单说一下思路,考虑到dll只有Microsoft怎么写,如果需要一种更开放的container,可以考虑zip,这样只需要将图片打包即可在程序中直接访问,还可以加密哦。。嘿嘿。但如你所知,zip需要解包方可得到Stream,给出这个方案的升级版,那就是采用Package,你懂的。这样一来就可以直接在程序内Get Part Stream.
参看这里,Using System.IO.Packaging
本文来自nonocast的博客,原文地址:http://nonocast.cn/?p=2562
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
用WPF建的IPAD demo (内附下载源码)
Windows Presentation Foundation(WPF)中的数据绑定(使用XmlDataProvider作控件绑定)
【WPF学习】第二十八章 程序集资源
WPF学习笔记 - Resource
Ionic2 Icon and Splash Screen Image Generation
[C# 项目实战]: 制作一个备忘录(经典)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服