У меня есть пользовательский класс, который происходит из UserControl
. Код:
public partial class Gallery<T> : UserControl where T : class, IElement, new()
Это классные работы как он, как предполагается, работает. Но, когда я пытаюсь ввести режим проектирования формы, которая содержит их Gallery
классы, это дает мне ошибки:
Не удалось найти тип 'PresentrBuilder. Формы. Галерея'. Удостоверьтесь, что на блок, который содержит этот тип, ссылаются. Если этот тип является частью Вашего проекта разработки, удостоверьтесь, что проект был успешно разработан.
Переменная 'pictureGallery' является или необъявленной или никогда не присваивалась.
Примечание: (pictureGallery
на самом деле a Gallery<PictureElement>
).
Как может решить это? Таким образом, я не могу работать в режиме проектирования, который делает создание моего userinterface довольно трудно.
Разработчик ненавидит (т.е. не поддерживает) общие элементы управления, и это не изменится в ближайшее время, поэтому не делайте этого. Вместо этого рассмотрите возможность наличия свойства (или аналогичного), которое принимает тип
, и выполните некоторую работу во время выполнения (отражение и т. Д.) - или: не используйте конструктор.
Например, если у вас есть :
public Type ControlType {get;set;} // comparable to T in the original
Вы можете использовать:
IElement el = (IElement) Activator.CreateInstance(ControlType);
Это даст вам все, что у вас есть на данный момент ( новый
, IElement
и т. Д.) - но он просто не может выполнить никакой проверки при компиляции -время.
Sometimes the easiest thing to do in this case is to make an empty subclass that qualifies the generic parameter.
This is often done with the ObservableCollection:
public class SomeItemCollection : ObservableCollection<SomeItem>{
}
It is kind of irritating, but it may solve your problems.
Как утверждали другие, у Visual Studio Designer есть много проблем с обработкой универсальных шаблонов в элементах управления. Я сам столкнулся с этим, когда пытался реализовать что-то вроде общего класса «просмотрщика свойств».
Решение, которое сработало для меня, определяло промежуточный класс, как сказал Егор. Если я правильно понимаю ваш вопрос, для вашей ситуации это должно быть примерно так:
public class PictureElementGallery : Gallery<PictureElement>
Затем используйте PictureElementGallery в вашей форме вместо Gallery
Instead of having a generic control, have the control interact with a generic class that is separate from the control itself. Then pass this class into the control.