WPF图像资源
我主要来自网页和Windows窗体背景。 对于一个新项目,我们将使用WPF。 为了便于说明,WPF应用程序需要10 – 20个小图标和图像。 我正在考虑将这些作为嵌入式资源存储在程序集中。 这是正确的路吗?
如何在XAML中指定Image控件应该从嵌入资源加载图像?
如果您将在多个地方使用图像,那么将图像数据仅加载到内存中,然后在所有Image
元素之间共享图像数据是值得的。
为此,创建一个BitmapSource
作为资源:
<BitmapImage x:Key="MyImageSource" UriSource="../Media/Image.png" />
然后,在你的代码中,使用如下所示:
<Image Source="{StaticResource MyImageSource}" />
在我的情况下,我发现我必须设置Image.png
文件,以建立一个Resource
而不是Content
行动。 这会导致图像在编译后的程序集中运行。
我发现使用图像,视频等最好的做法是:
- 将您的文件“Build action”更改为“Content” 。 一定要检查复制到建立目录
- 在“解决方案资源管理器”窗口的“右键单击”菜单中找到
- 图像来源格式如下:
- “/ «YourAssemblyName» ;组件/«YourPath»/«YourImage.png» ”
例
<Image Source="/WPFApplication;component/Images/Start.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”的executiong程序集中加载资源:
this.Icon = new BitmapImage(new Uri(@"pack://application:,,,/" + Assembly.GetExecutingAssembly().GetName().Name + ";component/" + "Icons/Freq.png", UriKind.Absolute));
我也做了一个功能,如果有人可以使用它:
/// <summary> /// Load a resource WPF-BitmapImage (png, bmp, ...) from embedded resource defined as 'Resource' not as 'Embedded resource'. /// </summary> /// <param name="pathInApplication">Path without starting slash</param> /// <param name="assembly">Usually 'Assembly.GetExecutingAssembly()'. If not mentionned, I will use the calling assembly</param> /// <returns></returns> 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 Pack URI :“pack:// application:,,, / ReferencedAssembly; component / Subfolder / ResourceFile.xaml”
是的,这是正确的方式。 您可以使用路径中的资源文件中的图像:
<Image Source="..\Media\Image.png" />
您必须将图像文件的构建操作设置为“资源”
完整描述如何使用资源: https : //msdn.microsoft.com/en-us/library/aa970494(v=vs.100).aspx以及如何引用它们阅读“在WPF中打包URI”
简而言之,甚至有引用/引用程序集引用资源的方法
- Visual Studio 2010 Professional SP1。
- .NET Framework 4客户端配置文件。
- PNG图像作为资源添加到项目属性中。
- 资源文件夹中的新文件自动创建。
- 构建操作设置为资源。
这对我工作:
<BitmapImage x:Key="MyImageSource" UriSource="Resources/Image.png" />
如果您使用的是混合,为了使其更容易,并且无需为获取“源”属性获取正确的路径,只需将图像从“项目”面板拖放到设计器上即可。
这工作
并且要设置的图像是属性中的资源
var bitmapSource = Imaging.CreateBitmapSourceFromHBitmap(MyProject.Properties.Resources.myImage.GetHbitmap(), IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions()); MyButton.Background = new ImageBrush(bitmapSource); img_username.Source = bitmapSource;