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

Dan*_*aar 20 c# resources winforms

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

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

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

56k*_*6ka 5

我找到了一种在许多项目之间共享资源文件并保持 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>
    
    Run Code Online (Sandbox Code Playgroud)
  4. 替换MY_SOURCE_PROJECT_FOLDER为包含资源的项目的相对路径,并替换MY_SOURCE_PROJECT_NAMESPACE为生成文件中指定的命名空间SharedResources.Designer.cs(应该是全局项目的命名空间)

  5. 享受 !

警告 :

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

重要的 :

  • 当您在 resx 文件中添加新资源时,请从源项目中打开它,否则文件将添加到错误的文件夹中!
  • 当你刚刚添加一个新资源时,如果它没有出现在新项目中,只需重新启动VS,它应该可以工作


jro*_*oss 4

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

\n\n

Here\xe2\x80\x99s 我会如何做:

\n\n

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

\n\n
public static class Class1\n{\n    public static Bitmap Image1 { get { return Resource1.Image1; } }\n    public static Bitmap Image2 { get { return Resource1.Image2; } }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
public Form1()\n{\n    InitializeComponent();\n\n    this.BackgroundImage = ClassLibrary1.Class1.Image1;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

但不幸的是你不能\xe2\x80\x99使用设计器。:( 但是,如果您不对 dll 中的资源进行任何更改,则通过这样做,您将不需要重新分发该 dll。

\n