<#> Пользовательский контроль на C# в режиме конструктора выдает ошибку
У меня есть пользовательский класс, который происходит от UserControl
, Код:
public partial class Gallery<T> : UserControl where T : class, IElement, new()
Этот класс работает, как будто он должен работать. Но когда я пытаюсь войти в режим разработки формы, которая содержит эти Gallery
классы, это дает мне ошибки:
Не удалось найти тип "PresentrBuilder.Forms.Gallery". Пожалуйста, убедитесь, что ссылка на сборку, которая содержит этот тип. Если этот тип является частью вашего проекта разработки, убедитесь, что проект был успешно построен.
Переменная 'pictureGallery' либо не объявлена, либо никогда не была назначена.
Заметка: (pictureGallery
на самом деле это Gallery<PictureElement>
).
Как можно решить это? Таким образом, я не могу работать в режиме дизайна, который делает создание моего пользовательского интерфейса довольно сложным.
4 ответа
Дизайнер ненавидит (то есть не поддерживает) общие элементы управления, и это не изменится в ближайшее время, так что не делайте этого. Вместо этого рассмотрите возможность иметь свойство (или подобное), которое принимает Type
и делать некоторую работу во время выполнения (рефлексия и т. д.) - или: не использовать конструктор.
Например, если у вас есть:
public Type ControlType {get;set;} // comparable to T in the original
Ты можешь использовать:
IElement el = (IElement) Activator.CreateInstance(ControlType);
Это даст вам все, что у вас есть (new
, IElement
и т. д.), но он просто не может выполнить проверку во время компиляции.
Иногда в этом случае проще всего создать пустой подкласс, который квалифицирует универсальный параметр.
Это часто делается с помощью ObservableCollection:
public class SomeItemCollection : ObservableCollection<SomeItem>{
}
Это раздражает, но может решить ваши проблемы.
Как и другие, у Visual Studio Designer много проблем с обработкой обобщений в элементах управления. Я сам столкнулся с этим, пытаясь реализовать что-то вроде универсального класса 'viewer'.
Решение, которое работало для меня, заключалось в определении промежуточного класса, как сказал Егор. Если я правильно понимаю ваш вопрос, для вашей ситуации это должно быть примерно так:
public class PictureElementGallery : Gallery<PictureElement>
Затем используйте PictureElementGallery в своей форме вместо галереи
Вместо того, чтобы иметь общий элемент управления, пусть элемент управления взаимодействует с общим классом, который отделен от самого элемента управления. Затем передайте этот класс в контроль.