我有一个相当大的解决方案,里面有很多项目。理想情况下,我想创建一个Resources项目,其中包含我在整个应用程序中需要的所有嵌入图标。
我读过人们通过代码引用它们的文章,但是有可能在设计器中访问这个项目的资源吗?换句话说,我想在设计器中单击表单的BackgroundImage属性时选择资源。
如果没有,在尝试将我的资源与主项目分离时,我应该考虑哪种架构?每次修改一行或两行代码时,释放100mb可执行文件可能不是一个明智的想法。
答案 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),这并不复杂:
在源项目中创建一个新资源文件(在我的示例中命名 SharedResources.resx )
在Designer中打开 SharedResources.resx 并将Access Modifier
更改为Public
使用记事本打开新项目文件的.csproj
,并将以下代码添加到包含<ItemGroup>
的{{1}}中:(将包含* .resx和* .Designer .cs作为没有编译和特殊命名空间的链接)
<compile Include="MyForm.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>
替换为包含资源的项目的相对路径,并将MY_SOURCE_PROJECT_FOLDER
替换为生成的文件MY_SOURCE_PROJECT_NAMESPACE
中指定的命名空间(应该是您的全局项目的命名空间)< / p>
享受!
警告:
有时VS会在**。Designer.cs *共享文件中进行其他自动更改,这会导致失败,请确保属性SharedResources.Designer.cs
仍然指向根共享文件。
重要提示:
答案 2 :(得分:2)
我想创建一个包含所有嵌入式项目的Resources项目 在我的应用程序中我需要的图标....我想选择 单击表单的BackgroundImage属性时的资源 设计师。
您可以使用来自其他程序集但的资源,原因如下所示,您无法通过设计人员执行此操作。
在您的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上发布这个。