我来自一个主要是Web和一点点Windows窗体背景.对于一个新项目,我们将使用WPF.WPF应用程序需要10-20个小图标和图像用于说明目的.我正在考虑将它们作为嵌入式资源存储在程序集中.这是正确的方法吗?
如何在XAML中指定Image控件应从嵌入式资源加载图像?
如果您将在多个位置使用图像,那么将图像数据仅加载到内存中然后在所有Image
元素之间共享它是值得的.
为此,BitmapSource
在某处创建一个资源:
然后,在您的代码中,使用以下内容:
就我而言,我发现我必须将Image.png
文件设置为具有构建操作Resource
而不仅仅是Content
.这会导致图像在编译的程序集中携带.
我发现使用图像,视频等的最佳做法是:
将文件"构建操作"更改为"内容".请务必选中复制到构建目录.
在Solution Explorer窗口的"右键单击"菜单中找到.
图像源采用以下格式:
"/ «YourAssemblyName» ;组件/«YourPath»/«YourImage.png» "
优点:
文件未嵌入到程序集中.
资源管理器会在资源过多(构建时)时引发一些内存溢出问题.
可以在程序集之间调用.
有些人要求在代码中执行此操作而不是得到答案.
经过几个小时的搜索,我找到了一个非常简单的方法,我找不到任何例子,所以我在这里分享我的图像.(我的是.gif)
摘要:
它返回一个ImageSource"目的地"似乎喜欢的BitmapFrame.
使用:
doGetImageSourceFromResource ("[YourAssemblyNameHere]", "[YourResourceNameHere]");
方法:
static internal ImageSource doGetImageSourceFromResource(string psAssemblyName, string psResourceName) { Uri oUri = new Uri("pack://application:,,,/" +psAssemblyName +";component/" +psResourceName, UriKind.RelativeOrAbsolute); return BitmapFrame.Create(oUri); }
学习:
根据我的经验,包字符串不是问题,请检查您的流,特别是如果第一次读取它已将指针设置为文件的末尾,您需要在再次读取之前将其重新设置为零.
我希望这可以节省你希望这件作品给我的好几个小时!
在代码中加载执行程序集中的资源,其中我的图像Freq.png
位于文件夹中Icons
并定义为Resource
:
this.Icon = new BitmapImage(new Uri(@"pack://application:,,,/" + Assembly.GetExecutingAssembly().GetName().Name + ";component/" + "Icons/Freq.png", UriKind.Absolute));
我也做了一个功能:
////// Load a resource WPF-BitmapImage (png, bmp, ...) from embedded resource defined as 'Resource' not as 'Embedded resource'. /// /// Path without starting slash /// Usually 'Assembly.GetExecutingAssembly()'. If not mentionned, I will use the calling assembly ///public static BitmapImage LoadBitmapFromResource(string pathInApplication, Assembly assembly = null) { if (assembly == null) { assembly = Assembly.GetCallingAssembly(); } if (pathInApplication[0] == '/') { pathInApplication = pathInApplication.Substring(1); } return new BitmapImage(new Uri(@"pack://application:,,,/" + assembly.GetName().Name + ";component/" + pathInApplication, UriKind.Absolute)); }
用法(假设您将函数放在ResourceHelper类中):
this.Icon = ResourceHelper.LoadBitmapFromResource("Icons/Freq.png");
注意:请参阅WPF中的MSDN包URI:
pack://application:,,,/ReferencedAssembly;component/Subfolder/ResourceFile.xaml
是的,这是正确的方式.
您可以使用路径使用资源文件中的图像:
您必须将映像文件的构建操作设置为"资源".
完整说明如何使用资源:WPF应用程序资源,内容和数据文件
以及如何引用它们,请阅读"WPF中的包URI".
简而言之,甚至还有从引用/引用程序集引用资源的方法.
Visual Studio 2010专业版SP1。
.NET Framework 4客户端配置文件。
PNG图像作为项目属性的资源添加。
资源文件夹中的新文件会自动创建。
将操作设置为资源。
这为我工作: