20

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

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

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

4

3 回答 3

4

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

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

  2. 在 Designer 中打开SharedResources.resx并更改Access ModifierPublic

  3. 使用记事本打开.csproj您的新项目文件并将以下代码添加到<ItemGroup>其中包含<compile Include="MyForm.cs">:(将包括 *.resx 和 *.Designer.cs 作为链接,无需编译且具有特殊命名空间)

    <EmbeddedResource Include="MY_SOURCE_PROJECT_FOLDER\Properties\SharedResources.resx">
      <Generator>PublicResXFileCodeGenerator</Generator>
      <Link>SharedResources.resx</Link>
      <LastGenOutput>SharedResources.Designer.cs</LastGenOutput>
      <SubType>Designer</SubType>
      <CustomToolNamespace>MY_SOURCE_PROJECT_NAMESPACE.Properties</CustomToolNamespace>
    </EmbeddedResource>
    <None Include="MY_SOURCE_PROJECT_FOLDER\Properties\SharedResources.Designer.cs">
      <AutoGen>True</AutoGen>
      <DependentUpon>SharedResources.resx</DependentUpon>
      <DesignTime>True</DesignTime>
    </None>
    
  4. 替换MY_SOURCE_PROJECT_FOLDER为包含资源的项目的相对路径,并替换MY_SOURCE_PROJECT_NAMESPACE为生成文件中指定的命名空间SharedResources.Designer.cs(应该是您的全局项目的命名空间)

  5. 享受 !

警告 :

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

重要的 :

  • 当您在 resx 文件中添加新资源时,请从源项目中打开它,否则文件将添加到错误的文件夹中!
  • 当你刚刚添加了一个新资源,如果它没有出现在新项目中,只需重启VS,它应该可以工作
于 2014-02-20T10:47:51.233 回答
3

据我所知,您不能在设计器中操作来自其他程序集的资源。仅来自当前项目的那些。

这是我的做法:

创建一个类库项目。在库中,添加 | 新品 | 资源文件。将资源(图像、图标)添加到该文件(例如: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。

于 2013-02-19T09:15:05.413 回答
2

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

您可以使用来自另一个程序集的资源,不幸的是,由于下面解释的原因,您无法通过设计器进行操作。

在此处输入图像描述

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

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

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

在使用资源 DLL 的项目中,您需要将 BackGroundImages 设置为不使用自己的资源:

前:

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

后:

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

当我试图将我的资源与我的主要项目分离时,我应该考虑什么样的架构?每次我修改一两行代码时发布一个 100mb 的可执行文件可能不是一个聪明的主意。

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

当你这样想的时候,为什么还要为一个充满资源的程序集而烦恼呢?迷宫很好只是从互联网上提取资源并从文件系统中使用它们。

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

于 2013-02-22T00:45:02.403 回答