一个类库是用来存储图片资源并供WPF项目使用的正确项目吗?

3
我已经将几个 .jpg 文件加载到 Visual Studio 2015 下的类库项目中,并将它们设置为资源并在新建时复制。当我在 WPF 项目中使用时,它似乎运行良好。是否有另一种方法将图像存储到 DLL 中,或者这种方法是正确的?
======================================
更新 3/22/2016 5:02 pm
只是为了更清晰,我将 ImageSource 语句添加到我的 App.xaml 文件中作为 Application.Resources 部分,如下所示:
<ImageSource x:Key="OkImage">pack://application:,,,/MyStyles;component/ok.png</ImageSource>

然后,我在我的WPF窗口xaml中将OkImage关键字引用为图像控件如下:

<Image x:Name="image" Source="{DynamicResource OkImage}" 
               Grid.Column="1" HorizontalAlignment="Left" Height="100" Margin="66,25,0,0" Grid.Row="2" VerticalAlignment="Top" Width="100"/>

这是我从.DLL中提取图像并放入WPF文件的方法。将图像存储在.DLL中的目的是与他人共享,在当前和未来的项目中使用相同的图像控件。
3个回答

2
一个类库是用来存储图像资源并被WPF项目使用的正确项目。绝对没错!WPF将其称为“资源文件”——标记为“Resource”的“Build Action”的文件。这些资源随后会编译到程序集中,可以通过C#代码或通过XAML(通过Pack URIs)加载。这就是为什么WPF应用程序不应该使用WinForms风格的.resx文件,因为XAML通常无法利用它们。
您可以在以下情况下使用资源文件:
- 当资源在编译时已知或在构建或部署后不需要更新时。 - 资源文件减少了要分发的文件数量。
参考资料:MSDN。
如果一个应用程序数据文件必须始终对应用程序可用,保证可用性的唯一方法是将其编译到应用程序的主可执行程序集或其引用程序集之一中。这种类型的应用程序数据文件称为资源文件。- 告诉我更多 当将文件标记为Resource时,不要将它们标记为“copy when new”。这会破坏资源文件的目的。你只是复制了一个很可能没有使用的额外图像文件。资源文件应该嵌入到程序集中。
OP:
我已经将几个.jpg文件加载到Visual Studio 2015下的类库项目中,并设置为在新建时构建为资源。
当将文件标记为资源时,不要将它们标记为“copy when new”。这会破坏资源文件的目的。你只是复制了一个很可能没有使用的额外图像文件。资源文件应该嵌入到程序集中。
OP:
还有其他存储图像到DLL的方法吗?或者这种方法正确吗?
您还可以使用内容文件。这种技术在文件可能在事后更改但您不想重新编译应用程序时非常有用。您的应用程序具有对其在运行时评估的依赖资源的链接。告诉我更多关于内容文件

来源站点文件 我必须承认我对此并不了解,只是读了一些相关信息。它似乎在构建时资源未知时很有用;对于访问受限的部分信任应用程序很有用。完全信任的应用程序可能会发现SoOF语法比通常需要完整路径的file://更有用。

MSDN对SoOF的表述如下:

有时候,您可能希望在程序集和应用程序数据文件之间建立隐式或不存在的关系,包括以下情况:
- 编译时文件不存在。 - 直到运行时才知道程序集需要哪些文件。 - 您希望能够更新文件,而无需重新编译与其相关联的程序集。 - 您的应用程序使用大型数据文件,例如音频和视频,只有在用户选择下载时才会下载。 告诉我更多关于SoOF的信息

感谢您提供的信息。对于“Copy if Newer”属性值的指出很准确。我猜想,“Copy to Output Directory”下拉属性应该设置为“Do not Copy”,这样图像才能保留在DLL中。 - Robertcode

1

我会使用资源文件(或多个资源文件)来存储这些数据。在项目中新建一个名为 Resources 的文件夹(名称不太重要)。然后右键单击新文件夹并选择添加 -> 新项目 -> 并选择 "Resource文件" (请参见图像#1)。为其命名,然后您的新文件夹中应该有一个something.resx文件(请参见图像#2)。然后打开新创建的资源文件,您可以看到编辑器左上角有一个选项,用于将现有文件(浏览您的文件系统)添加到resx文件中。一旦添加了文件,您就可以使用自动为它们创建的命名空间和类,在源代码中访问它们作为图像/字符串/音频等文件。下面是一个示例代码。

enter image description here

namespace WpfApplication1
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            Bitmap myUntitledImage = WpfApplication1.Resources.Resource1.Untitled; //Untitled is the name of my image
        }
    }
}

1
虽然这是一个很好的答案,但在WPF应用程序中,惯例不是使用WinForms的.resx方式加载资源,而是使用通过Pack URIs引用的资源文件,其中每个资源都是项目中的单独文件,并且编译时具有Build ActionResource - user585968
@MickyD 我之前不知道这个,但是谢谢你提供的信息! - james

0

这种方法并没有错,但我认为你需要考虑一种情况,即你可能想要升级这个DLL(无论是一个图片还是多个)。如果你将许多图片作为资源存储在其中,那么DLL的大小将会增加,因此,如果你对DLL进行更改,就需要重新分发一个新的DLL给所有客户端。如果这不是你的情况,你可以将图片存储在外部的DLL中。

关于性能方面的考虑,资源被缓存在内存中。资源使用System.Resources.ResourceManager,并且它也会对图片和字符串进行缓存。因此,你在资源程序集中存储的所有图片都将存储在内存中。这是你需要考虑的另一点。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接