Как заставить конструктор Windows Forms использовать ресурсы из внешней сборки? - PullRequest
8 голосов
/ 01 сентября 2010

У меня есть некоторые ресурсы (в данном случае изображения) в файле ресурсов, которые я использую для элементов управления в моем проекте Windows Forms. Диалог выбора ресурсов Visual Studio не очень хорошо поддерживает выбор изображений из файлов ресурсов, если они не находятся в определенных местах, но вы можете редактировать файл конструктора напрямую, и это прекрасно работает; приложение компилируется и работает правильно, а конструктор Windows Forms достаточно умен, чтобы не испортить мой отредактированный код.

// in an assembly named ResourceConsumer
this.button1.Image = global::ResourceConsumer.Properties.Resources.Close32x32;

Теперь я хочу переместить эти ресурсы во внешнюю сборку, чтобы они могли использоваться несколькими приложениями. Я могу настроить сборку так, чтобы она без проблем открывала доступ к ее ресурсам (если я использую Visual Studio 2008 или более позднюю версию), и это прекрасно работает. Когда я изменяю код конструктора, чтобы ссылаться на изображение из его нового местоположения, код компилируется и работает правильно, но теперь конструктор Windows Forms меняет мой код всякий раз, когда он генерирует код; он встраивает двоичный файл изображения в локальный файл ресурсов и ссылается на него оттуда.

// ResourceProducer is an external assembly containing resources
this.button1.Image = global::ResourceProducer.Properties.Resources.Exit32x32;

изменено конструктором Windows Forms на:

this.button1.Image = ((System.Drawing.Image)(resources.GetObject("button1.Image")));

Конструктор Windows Forms, похоже, понимает, что нужно извлекать ресурс из одной и той же сборки, но не из внешней. Есть ли способ заставить конструктор Windows Forms разрешить мне использовать ресурс из внешней сборки?

Ответы [ 2 ]

3 голосов
/ 21 октября 2011

У меня точно такая же проблема , и может быть альтернативный подход, в зависимости от вашей кодовой базы. Если свойства, которые были изменены для ссылки на определенный ресурс, находятся в пользовательских элементах управления, вы можете добавить атрибут [[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] к этим свойствам (переопределить или скрыть их, если необходимо), и конструктор оставит их в покое.

Однако, если свойства относятся к базовым элементам пользовательского интерфейса (например, Form.BackgroundImage), вам также придется их переопределить или скрыть, и я не уверен, насколько это желательно.

2 голосов
/ 01 сентября 2010

Нет, дизайнер не поддерживает это.Важно то, что это работает так, как это происходит, иначе локализация через спутниковые сборки не будет работать.

Вы можете сделать это, но вы должны написать код самостоятельно.Почти то, что вы найдете в файле Resources.Designer.cs.Подумайте, стоит ли это усилий, это не очень легко обслуживать, и совместное использование сборок ресурсов не является большой оптимизацией.Терабайтный диск составляет менее ста долларов.

Кстати: никогда Редактируйте файл Resources.Designer.cs самостоятельно.

...