对于一个WPF应用程序,它将需要10 - 20个小图标和图像用于说明目的,将它们作为嵌入式资源存储在程序集中是正确的方法吗?
如果是这样,我如何在XAML中指定图像控件应该从嵌入式资源加载图像?
对于一个WPF应用程序,它将需要10 - 20个小图标和图像用于说明目的,将它们作为嵌入式资源存储在程序集中是正确的方法吗?
如果是这样,我如何在XAML中指定图像控件应该从嵌入式资源加载图像?
当前回答
我发现使用图片、视频等的最佳做法是:
将文件的“构建动作”改为“内容”。请务必勾选“复制到构建目录”。 在“解决方案资源管理器”窗口的“右键单击”菜单中找到。 图片来源格式如下: “/«YourAssemblyName»;组件/«YourPath»和«YourImage.png»”
例子
<Image Source="/WPFApplication;component/Images/Start.png" />
好处:
文件没有嵌入到程序集中。 资源管理器会因为太多的资源(在构建时)而引发一些内存溢出问题。 可以在程序集之间调用。
其他回答
如果您正在使用Blend,为了使它更加简单,并且没有任何问题,为Source属性获取正确的路径,只需将图像从Project面板拖放到设计器上。
如何使用资源的完整描述:WPF应用程序资源,内容和数据文件
以及如何引用它们,请阅读“在WPF中打包uri”。
简而言之,甚至还有从被引用/引用程序集引用资源的方法。
根据Drew Noakes的回答,以下是创建资源字典、向其中添加BitmapImage资源以及在用户控件中引用BitmapImage资源的完整步骤。
在项目根目录下添加Images文件夹。 在Images文件夹下添加MyImage.png。 在“MyImage.png属性”窗口中,将“生成操作”设置为“资源”。 在项目根目录下创建一个名为MainResourceDictionary.xaml的资源字典:
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<BitmapImage x:Key="MyImageSource" UriSource="Images/MyImage.png" />
</ResourceDictionary>
在控件中添加对资源字典的引用:
<UserControl ...>
<UserControl.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="MainResourceDictionary.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</UserControl.Resources>
...
在控件中引用图像资源:
<UserControl ...>
<UserControl.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="MainResourceDictionary.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</UserControl.Resources>
...
<Image Source="{DynamicResource ResourceKey=ServiceLevel1Source}" />
...
我发现使用图片、视频等的最佳做法是:
将文件的“构建动作”改为“内容”。请务必勾选“复制到构建目录”。 在“解决方案资源管理器”窗口的“右键单击”菜单中找到。 图片来源格式如下: “/«YourAssemblyName»;组件/«YourPath»和«YourImage.png»”
例子
<Image Source="/WPFApplication;component/Images/Start.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;