2009-12-17 2 views
7

У меня есть пользовательский класс, который происходит от UserControl. Код:C# напечатано <T> usercontrol в режиме проектирования дает ошибку

public partial class Gallery<T> : UserControl where T : class, IElement, new() 

Это classworks, как он должен работать. Но, когда я пытаюсь войти в режим проектирования формы, которая содержит эти Gallery классы, это дает мне ошибки:

  • Не удалось найти тип «PresentrBuilder.Forms.Gallery». Пожалуйста, убедитесь, что в сборке , содержащей этот тип, указаны ссылки. Если этот тип является частью вашего проекта разработки , убедитесь, что проект был успешно выполнен .

  • Переменная 'pictureGallery' либо не объявлена, либо никогда не была назначена .

Примечание: (pictureGallery на самом деле является Gallery<PictureElement>).

Как это можно решить? Таким образом, я не могу работать в режиме разработки, что затрудняет создание моего пользовательского интерфейса.

ответ

12

Дизайнер ненавидит (т. Е. Не поддерживает) общие элементы управления, и это не скоро изменится, поэтому не делайте этого. Вместо этого рассмотрите наличие свойства (или аналогичного), которое принимает Type, и выполняйте некоторую работу во время выполнения (отражение и т. Д.) - или: не используйте конструктор.

Например, если у вас есть:

public Type ControlType {get;set;} // comparable to T in the original 

Вы можете использовать:

IElement el = (IElement) Activator.CreateInstance(ControlType); 

Это даст вам все, что в настоящее время есть (new, IElement и т.д.) - но это только может» t делать какие-либо проверки во время компиляции.

+0

Прошло пять лет с тех пор, как был задан этот вопрос. Что-то изменилось в новых версиях Visual Studio? – Misiu

+0

@ Misiu not AFAIK –

+0

Определенно не потому, что сейчас у меня такая же проблема. – nicV

11

Иногда проще всего сделать в этом случае пустой подкласс, который квалифицирует общий параметр.

Это часто делается с ObservableCollection:

public class SomeItemCollection : ObservableCollection<SomeItem>{ 

} 

Это вид раздражает, но это может решить ваши проблемы.

1

Вместо того, чтобы иметь общий элемент управления, необходимо, чтобы элемент управления взаимодействовал с общим классом, который отделен от самого элемента управления. Затем передайте этот класс в элемент управления.

3

Как и все остальные, Visual Studio Designer имеет множество проблем с обработкой дженериков в элементах управления. Я столкнулся с этим сам, пытаясь реализовать что-то вроде универсального класса viewer.

Решение, которое работало для меня, определяло промежуточный класс, как сказал Егор.Если я правильно понимаю ваш вопрос, для вашей ситуации, это должно быть что-то вроде этого:

public class PictureElementGallery : Gallery<PictureElement> 

Затем используйте PictureElementGallery на форме, а не галереи < PictureElement>. Дизайнер не должен беспокоиться об этом.

 Смежные вопросы

  • Нет связанных вопросов^_^