Можно ли получить доступ к ресурсам из другого проекта, используя конструктор в WinForms?
У меня есть довольно большое решение, в котором много проектов. В идеале я бы хотел создать проект "Ресурсы", содержащий все встроенные значки, которые мне нужны во время моего приложения.
Я читал статьи, в которых люди ссылаются на них через код, но можно ли получить доступ к этим ресурсам проекта в дизайнере? Другими словами, я бы хотел выделить ресурсы при нажатии на свойство BackgroundImage формы в дизайнере.
Если нет, какую архитектуру следует учитывать при попытке отделить мои ресурсы от моего основного проекта? Вероятно, это не разумная идея выпуска 100-битного исполняемого файла каждый раз, когда я изменяю строку кода или два.
Ответы
Ответ 1
Из лучших, что я могу сказать, вы не можете манипулировать ресурсами из других сборок в дизайнере. Только одно (-ы) из текущего проекта.
Вот как я это сделаю:
Создайте проект библиотеки классов. В библиотеке Add | Новый элемент | Файл ресурсов. Добавьте ресурсы (изображения, значки) в этот файл (например: 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, если вы не внесете никаких изменений в ресурсы в ней.
Ответ 2
Я хотел бы создать проект ресурсов, содержащий все встроенные Значки, которые мне нужны во время моего приложения... Я хотел бы выбрать ресурсов при нажатии на свойство BackgroundImage формы в дизайнер.
Вы можете использовать Ресурсы из другой сборки, но, к сожалению, по причинам, объясняемым ниже, вы не можете сделать это через конструктора.
![enter image description here]()
В проекте "Ресурсы" добавьте форму с изображением и установите BackgroudImage. Это просто, чтобы добавить изображение в проекты Resouces.resx и Resouces.Designer.cs. Мы можем удалить форму с помощью Picturebox после добавления изображения в качестве ресурса.
В проекте "Ресурсы" перейдите в раздел "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 ответ кажется вполне жизнеспособным. В эти дни, хотя я не думаю, что вы планируете выпустить это на CD.
Ответ 3
Я нашел рабочий способ совместного использования файла ресурсов между многими проектами и поддерживать совместимость VS Designer (работает с VS 2012), это не сложно:
-
Создайте новый файл ресурсов в исходном проекте (названный в моем примере SharedResources.resx)
-
Откройте SharedResources.resx в Designer и измените Access Modifier
на Public
![]()
-
Откройте .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>
-
Замените MY_SOURCE_PROJECT_FOLDER
на относительный путь вашего проекта, содержащий ресурсы, и замените MY_SOURCE_PROJECT_NAMESPACE
пространством имен, указанным в сгенерированном файле SharedResources.Designer.cs
(должно быть ваше глобальное пространство имен проектов)
-
Наслаждайтесь!
![]()
ВАЖНО:
- Когда вы добавляете новые ресурсы в свой файл resx, откройте его из исходного проекта или файл будет добавлен в неправильную папку!
- Когда вы просто добавили новый ресурс, если он не появился в новом проекте, просто перезапустите VS, он должен работать