是否可以使用WinForms中的设计器从不同的项目访问资源?

我有一个相当大的解决方案,里面有很多项目。 理想情况下,我想创建一个Resources项目,其中包含我在整个应用程序中需要的所有嵌入图标。

我读过人们通过代码引用它们的文章,但是有可能在设计器中访问这个项目的资源吗? 换句话说,我想在设计器中单击表单的BackgroundImage属性时选择资源。

如果没有,在尝试将我的资源与主项目分离时,我应该考虑哪种架构? 每次修改一行或两行代码时,释放100mb可执行文件可能不是一个明智的想法。

从我能说的最好,你不能操纵设计器中其他程序集的资源。 只有当前项目中的一个。

这是我将如何做到这一点:

创建一个类库项目。 在库中,添加| 新物品| 资源文件。 将资源(图像,图标)添加到该文件(例如:Resource1.resx)。 在该库中的类中添加返回资源的公共成员。

public static class Class1 { public static Bitmap Image1 { get { return Resource1.Image1; } } public static Bitmap Image2 { get { return Resource1.Image2; } } } 

现在,在您的项目中引用类库,现在可以在运行时以编程方式设置资源。

 public Form1() { InitializeComponent(); this.BackgroundImage = ClassLibrary1.Class1.Image1; } 

但不幸的是你无法使用设计师。 :(但是,通过这样做,如果你不对其中的资源进行任何更改,你将不需要重新分发该DLL。

我想创建一个Resources项目,其中包含我在整个应用程序中需要的所有嵌入图标….我想在设计器中单击表单的BackgroundImage属性时选择资源。

您可以使用来自其他程序集的资源, 遗憾的是,由于下面解释的原因,您无法通过设计器执行此操作。

在此处输入图像描述

在您的Resources项目中添加一个带有图片框的Form并设置BackgroudImage。 这只是为了将Image添加到项目Resouces.resx和Resouces.Designer.cs中。 将图像添加为资源后,我们可以使用图片框删除表单。

在Resources项目中,转到Resouces.Designer.cs并将类范围更改为Public,并将image方法范围从Internal更改为Public:

 public static System.Drawing.Bitmap SO_down { get { object obj = ResourceManager.GetObject("SO down", resourceCulture); return ((System.Drawing.Bitmap)(obj)); } } 

在使用Resources DLL的项目中,您需要设置BackGroundImages NOT以使用其自己的资源:

之前:

 this.pictureBox1.BackgroundImage = global::WinFormWithSatelliteResources.Properties.Resources.SO_down; 

后:

 this.pictureBox1.BackgroundImage = global::SatResources.Properties.Resources.SO_down; 

在尝试将我的资源与主项目分离时,我应该考虑哪种架构? 每次修改一行或两行代码时,释放100mb可执行文件可能不是一个明智的想法。

如今,大多数企业都乐于依赖互联网。 您知道如何版本资源,如MyStyle22022013.CSS和webbrowsers如果已经拥有最新的副本,则不会获取资源。 我建议采用类似的策略,将所有这些图像资源放在网上,这样您就可以更新资源而无需打包和部署它们。

当你这样想的时候,为什么甚至会厌烦装满资源的assembly? 迷宫只需从互联网上提取资源并从文件系统中使用它们。

如果初始互联网访问(用于下载资源)不是一个选项@jross答案似乎完全可行。 这些天虽然我不认为你打算在CD上发布这个。

我找到了一种在许多项目之间共享资源文件并保持VS Designer兼容性的工作方式(适用于VS 2012),这并不复杂:

  1. 在源项目中创建一个新资源文件(在我的示例中以SharedResources.resx命名)

  2. 在Designer中打开SharedResources.resx并将Access Modifier更改为Public

  3. 使用记事本打开新项目文件的.csproj ,并将以下代码添加到 ,其中包含 :(将包含* .resx和* .Designer.cs作为链接而不编译和特殊命名空间)

      PublicResXFileCodeGenerator SharedResources.resx SharedResources.Designer.cs Designer MY_SOURCE_PROJECT_NAMESPACE.Properties   True SharedResources.resx True  
  4. MY_SOURCE_PROJECT_FOLDER替换为包含资源的项目的相对路径,并将MY_SOURCE_PROJECT_NAMESPACE替换为生成的文件SharedResources.Designer.cs指定的命名空间(应该是您的全局项目的命名空间)

  5. 请享用 !

警告 :

有时VS会在**。Designer.cs *共享文件中进行其他自动更改,这将导致失败,请确保属性ResourceManager仍然指向根共享文件。 在此处输入图像描述

重要提示:

  • 在resx文件中添加新资源时,从源项目打开它或文件将被添加到错误的文件夹中!
  • 当您刚刚添加新资源时,如果它没有出现在新项目中,只需重新启动VS即可