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”

简而言之,甚至有引用/引用程序集引用资源的方法

  1. Visual Studio 2010 Professional SP1。
  2. .NET Framework 4客户端配置文件。
  3. PNG图像作为资源添加到项目属性中。
  4. 资源文件夹中的新文件自动创建。
  5. 构建操作设置为资源。

这对我工作:

 <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;