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

时间:2013-02-15 22:07:31

标签: c# winforms resources

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

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

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

3 个答案:

答案 0 :(得分: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。

答案 1 :(得分:3)

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

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

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

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

    <compile Include="MyForm.cs">
  4. <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> 替换为包含资源的项目的相对路径,并将MY_SOURCE_PROJECT_FOLDER替换为生成的文件MY_SOURCE_PROJECT_NAMESPACE中指定的命名空间(应该是您的全局项目的命名空间)< / p>

  5. 享受!

  6. 警告:

    有时VS会在**。Designer.cs *共享文件中进行其他自动更改,这会导致失败,请确保属性SharedResources.Designer.cs仍然指向根共享文件。 enter image description here

    重要提示:

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

答案 2 :(得分:2)

  

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

您可以使用来自其他程序集的资源,原因如下所示,您无法通过设计人员执行此操作。

enter image description here

在您的Resources项目中添加一个带有图片框的Form并设置BackgroudImage。这只是为了将Image添加到项目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));
    }
}

在使用Resources 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上发布这个。