是否有可能从使用的WinForms设计师不同的项目中访问的资源?(Is it possible to

2019-07-20 00:36发布

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

我读过那里的人都引用它们通过代码的文章,但有可能获得在设计获得这个项目的资源? 换句话说,我想选择点击在设计窗体的BackgroundImage属性时的资源。

如果没有,什么样的架构试图从我的主要项目脱钩我的资源时,我应该考虑的? 这可能不是一个聪明的想法释放100MB的可执行文件,每次我修改一行代码或两个。

Answer 1:

从最好的,我可以告诉你不能操纵在设计师其他组件的资源。 只有从当前项目的一个(或多个)。

这是我会怎么做:

创建一个类库项目。 在图书馆,添加| 新建项目| 资源文件。 资源(图片,图标)添加到该文件(例如: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,如果你不做出它的资源的任何变化。



Answer 2:

我发现有许多项目之间的资源文件,并保持VS设计师兼容性(与VS 2012工程)工作方式,它没有复杂的:

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

  2. 在设计器中打开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,它应该工作


Answer 3:

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

您可以使用的资源从另一个组件,但不幸的是,原因解释下面你不能经过设计师做。

在你的资源项目中添加一个形式一个PictureBox和设置BackgroudImage。 这仅仅是为了一个图像添加到项目Resouces.resx和Resouces.Designer.cs。 我们可以用图片框删除表中的图像将作为一个资源之后。

在资源项目转到Resouces.Designer.cs及其类别范围转变为公共和内部图像的方法范围转变为公共:

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和化网页浏览器不会获取资源,如果他们已经有一个了最新的副本。 我提出了一个类似的策略,把所有这些图像资源网上,这样你可以在无需打包和部署它们更新资源。

当你想想看这个样子,为什么连一个完整的资源组装麻烦? 迷宫也只是从互联网上拉资源,从文件系统中使用它们。

如果(下载资源)的初始网络连接是不是一种选择@jross答案似乎是完全可行的。 这些天来,虽然我不想像你打算发布此光盘。



文章来源: Is it possible to access resources from a different project using the designer in WinForms?