是一个类库是用于存储图像的正确项目,作为WPF项目使用的资源

时间:2016-03-22 22:48:02

标签: c# wpf visual-studio-2015 resources

我已将几个.jpg文件加载到Visual Studio 2015下的类库项目中,并将它们设置为构建为资源并在新的时候进行复制。当我在WPF项目中使用它时似乎工作正常。是否有另一种方法将图像存储到DLL中,或者这种方法是否正确?

======================================

2016年3月22日下午5:02

为了清楚起见,我将ImageSource语句作为Application.Resources部分添加到我的App.xaml文件中,如下所示:

<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 个答案:

答案 0 :(得分:1)

  

类库是用于将图像存储为WPF项目要使用的资源的正确项目

绝对! WPF将此称为资源文件 - 标记为资源构建操作的文件。然后将这些资源编译到程序集中,可以从c#代码或通过Pack URIs通过XAML加载它们。这就是为什么WPF应用程序不应该使用WinForms样式的 .resx 文件,因为XAML通常无法使用它们。

  • 在编译时知道资源或在构建或部署后不需要更新资源时,可以使用资源文件。
  • 资源文件减少了要分发的文件数

MSDN:

  

如果应用程序必须始终可以使用应用程序数据文件,则保证可用性的唯一方法是将其编译到应用程序的主可执行程序集或其引用的程序集之一。这种类型的应用程序数据文件称为资源文件。 - Tell me more

OP:

  

我已将几个.jpg文件加载到Visual Studio 2015下的类库项目中,并将它们设置为构建为资源并在新建时复制

将文件标记为资源时,请勿将其标记为&#34;复制时为新&#34; 。这违背了资源文件的目的。您只是复制了很可能未使用的其他图像文件。资源文件应嵌入程序集中。

OP:

  

是否有其他方法可以将图像存储到DLL中,或者此方法是否正确?

您还可以使用内容文件。当文件可能在事后更改但您不想重新编译应用程序时,此技术很有用。您的应用程序具有指向它在运行时评估的依赖资源的链接。 Tell me more about content files

原始网站文件 我必须承认,我刚读过这篇文章后我对此并不了解。在构建时不知道资源时似乎很有用;对访问受限的部分信任应用程序很有用。完全信任的应用程序可能会发现SoOF语法比通常需要完整路径的file://更有用。

MSDN对SoOF说:

  

...有时您可能希望在程序集和应用程序数据文件之间建立隐式或不存在的关系,包括:

     
      
  • 在编译时文件不存在。
  •   
  • 在运行时之前,您不知道程序集需要哪些文件。
  •   
  • 您希望能够在不重新编译与其关联的程序集的情况下更新文件。
  •   
  • 您的应用程序使用大型数据文件,例如音频和视频,您只希望用户在选择时下载它们。
  •   

Tell me more about SoOF

答案 1 :(得分:0)

我会使用资源文件(或多个资源文件)来存储此数据。在项目中创建一个新文件夹并将其命名为Resources(名称并不重要)。然后右键单击新文件夹,然后单击添加 - &gt;新项目 - &gt;并选择&#34;资源文件&#34; (见图1)。把它命名为&amp;那么你的新文件夹中应该有一个something.resx文件(见图2)。然后打开新创建的资源文件&amp;您可以看到编辑器左上角有选项可以将现有文件(浏览文件系统中的文件)添加到resx文件中。添加文件后,您可以使用为其自动创建的命名空间和类在源代码中将其作为image / string / audio / etc文件访问。我在下面提供了一个代码示例。

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

答案 2 :(得分:0)

该方法没有错,但我认为你需要考虑一个案例,你可能想要升级这个DLL(一张或多张图片)。如果将许多图片存储为其中的资源,则DLL的大小将增加,因此,如果更改DLL,则需要将新DLL重新分发给所有客户端。如果不是这种情况,您可以将图片存储在外部DLL中。

关于性能注意事项,资源缓存在内存中。资源使用System.Resources.ResourceManager,这会对图像和字符串进行缓存。因此,存储在资源程序集中的所有图像都将存储在内存中。这是你需要考虑的另一点。