<#> Пользовательский контроль на 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 в своей форме вместо галереи . У дизайнера не должно быть проблем с этим.

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

Другие вопросы по тегам