当前位置:  开发笔记 > 编程语言 > 正文

WPF图像资源

如何解决《WPF图像资源》经验,为你挑选了7个好方法。

我来自一个主要是Web和一点点Windows窗体背景.对于一个新项目,我们将使用WPF.WPF应用程序需要10-20个小图标和图像用于说明目的.我正在考虑将它们作为嵌入式资源存储在程序集中.这是正确的方法吗?

如何在XAML中指定Image控件应从嵌入式资源加载图像?



1> Drew Noakes..:

如果您将在多个位置使用图像,那么将图像数据仅加载到内存中然后在所有Image元素之间共享它是值得的.

为此,BitmapSource 在某处创建一个资源:


然后,在您的代码中,使用以下内容:


就我而言,我发现我必须将Image.png文件设置为具有构建操作Resource而不仅仅是Content.这会导致图像在编译的程序集中携带.


我点击的内容:如果您将图像资源添加到资源字典中,请不要忘记在XAML中为您的组件引用该图像字典.类似于:
有可能动态地这样做吗?如果我想在启动时加载不同数量的图像,我可以为每个图像创建一个BitmapSource并以与上面相同的方式引用它们吗?
我通常会将`Width ="{Binding Source.PixelWidth,RelativeSource = {RelativeSource Self}}"`添加到`Image`中,否则我经常会看到由于某种原因(例如16x16图标被拉伸到某个原因)看起来像200x200像素).
我发现如果在引用的程序集的resourcedictionary中声明了BitmapImage,则UriSource需要是一个packURI才能使其工作.否则,您会发现在VS中的xaml编辑器中可以看到图像,但在调试时没有图像.Pack URIS:https://msdn.microsoft.com/en-au/library/aa970069(v = vs.100).aspx
@Becky - 是的,你可以,但是如果你想在Xaml中引用它们那么你可能需要使用`DynamicResource`标记扩展而不是`StaticResource`,假设你在编译时知道密钥.在WPF中,您可以在运行时创建资源字典.实际上,这就是加载Xaml文档时会发生的情况,只是你没有看到等效的C#.

2> Nuno Rodrigu..:

我发现使用图像,视频等的最佳做法是:

将文件"构建操作"更改为"内容".请务必选中复制到构建目录.

在Solution Explorer窗口的"右键单击"菜单中找到.

图像源采用以下格式:

"/ «YourAssemblyName» ;组件/«YourPath»/«YourImage.png» "


优点:

文件未嵌入到程序集中.

资源管理器会在资源过多(构建时)时引发一些内存溢出问题.

可以在程序集之间调用.


如果将资源嵌入到程序集中,则此方法也适用,但您必须将"构建操作"设置为"资源".
工作,谢谢.另一个注意事项:"组件"是"按原样","图像"是项目中png的相对路径.即放在根目录中的图像将是""
那么,如果文件设置为嵌入式资源,您如何做?这似乎不起作用.而且我不想将图像包含在我的项目中两次.(我已经将它用作嵌入式资源.)
如何在C#中执行此操作的示例将很好.(这不是有效的URI,因此在构造BitmapImage时无法使用它.)

3> 小智..:

有些人要求在代码中执行此操作而不是得到答案.

经过几个小时的搜索,我找到了一个非常简单的方法,我找不到任何例子,所以我在这里分享我的图像.(我的是.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);
}

学习:

根据我的经验,包字符串不是问题,请检查您的流,特别是如果第一次读取它已将指针设置为文件的末尾,您需要在再次读取之前将其重新设置为零.

我希望这可以节省你希望这件作品给我的好几个小时!



4> Eric Ouellet..:

在代码中加载执行程序集中的资源,其中我的图像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



5> ema..:

是的,这是正确的方式.

您可以使用路径使用资源文件中的图像:


您必须将映像文件的构建操作设置为"资源".


当您需要重构代码时,这将是一团糟.如果xaml文档碰巧更改名称空间,则必须手动更改所有图像引用.Drew Noakes描述的方法更加顺畅和易于维护.

6> techfan..:

完整说明如何使用资源:WPF应用程序资源,内容和数据文件

以及如何引用它们,请阅读"WPF中的包URI".

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



7> JoanComasFdz..:

    Visual Studio 2010专业版SP1。

    .NET Framework 4客户端配置文件。

    PNG图像作为项目属性的资源添加。

    资源文件夹中的新文件会自动创建。

    将操作设置为资源。

这为我工作:


推荐阅读
yzh148448
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有