Потомки родовых форм не могут отображаться в конструкторе форм! - PullRequest
3 голосов
/ 25 февраля 2011

У меня есть базовая базовая форма, а потомки не работают в конструкторе. Это, очевидно, хорошо известная проблема, и тот же ответ дан здесь и здесь , чтобы назвать только два места.

Это решение, похоже, работает для всех остальных, и когда я его реализую, по крайней мере, я получаю другую ошибку:

«Не удалось найти ресурсы, подходящие для указанной культуры или нейтральной культуры. Убедитесь, что« MyBaseForm`1.resources »был правильно встроен или связан со сборкой« MyAssembly »во время компиляции или что все требуемые спутниковые сборки загружаемый и полностью подписанный. "

Мои занятия:

public partial class MyBaseForm<T> : Form { }

#if DEBUG
public partial class MyIntForm_Design : MyBaseForm<int> {
}
#endif

public partial class MyIntForm
#if DEBUG
: MyIntForm_Design {
#else
: MyBaseForm<int> {
#endif
}

Теперь через какое кольцо я должен прыгнуть?

РЕДАКТИРОВАТЬ: OMG, я нашел проблему - ну, вроде. Базовая форма имеет свой набор свойств Icon, который создал что-то в файле ресурсов. Когда я убрал значок и перекомпилировал, базовая форма неожиданно работает!

Теперь ответьте на этот вопрос тому, кто найдет обходной путь, чтобы я мог сохранить значок в своей базовой форме!

Ответы [ 2 ]

3 голосов
/ 27 февраля 2011

На самом деле я нашел более простой обходной путь, который не рискует быть перезаписан всякий раз, когда вы вносите косметические изменения в базовую базовую форму: просто заставьте универсальную форму наследовать от другой конкретной формы BaseForm, где свойство Icon (и любые другие ресурсы) ) установлены.

Таким образом:

public partial class MyBaseForm<T> : BaseForm { }

Работает угощение!

2 голосов
/ 25 февраля 2011

Исходя из моих комментариев, мне удалось заставить это решение работать:

Исправить встроенные ресурсы для универсального UserControl

То, что, кажется, делаетприсваивая ресурсу другое имя, чтобы удалить универсальный тип, но связывая имя с правильным типом.В вашем примере я сделал следующее:

System.ComponentModel.ComponentResourceManager resources = new CustomComponentResourceManager (typeof (MyBaseForm <>), "MyBaseForm");

Я положилэто в InitializeComponent универсального базового элемента управления (я использовал UserControl для моего тестирования), и это исправило конструктор конкретного класса.Однако мне все равно пришлось включить обходной путь промежуточного класса, чтобы указать тип для универсального аргумента.

Это не мешает конструктору выложить ваши изменения при его регенерации, и я не знаю способа удалить их.это из дизайнерского кода.Оригинальный постер этой ссылки также имеет эту проблему.Тем не менее, быстрое исправление вместо преимуществ не является плохим компромиссом, если вы не забудете это сделать!

...