Как добавить службу в контекст дескриптора типа таблицы свойств в .Net?

У меня есть приложение, которое позволяет пользователю выбирать изображение во время разработки либо в виде простого изображения, либо из списка изображений.

Пока все круто, за исключением того, что это происходит не из браузера свойств Visual Studio, а из сетки свойств, которая является частью редактора типов.

Моя проблема в том, что и средство выбора изображений (фактически средство выбора ресурсов), и преобразователь типов списков изображений полагаются на некоторые службы времени разработки для выполнения своей работы. В случае списка изображений это IReferenceService, а в случае средства выбора ресурсов - это служба с именем _DTE.

В первом случае редактирования из обозревателя свойств Visual Studio я мог бы получить ссылку на эти службы, но (1) как я могу добавить их в контекст дескриптора типа моей сетки свойств?

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

ЭТА: Я до сих пор не знаю, как это сделать, но теперь знаю, что это возможно.

(1) Элемент управления подклассом и добавьте свойство, тип которого представляет собой массив кнопок.
(2) Добавьте его в форму.
(3) Выберите новый элемент управления в службе дизайна и отредактируйте новое свойство в браузере свойств.
(4) Всплывает диалоговое окно редактора коллекции
(5) Добавить кнопку
(6) Редактировать изображение и список изображений - редактор типов и преобразователь типов, соответственно, ведут себя как им следует.

ETA2: Хорошо, мне становится тепло. Похоже, вы делаете это через свойство Site в таблице свойств. Я могу создать новый сайт и передать ему контекст дескриптора типа, на который у меня есть ссылка, и тогда он должен иметь все услуги. Я попробую ...

ETA3: Да, вот и все. Добавлю ответ.


person Jules    schedule 13.04.2010    source источник


Ответы (1)


Благодаря рефлектору и фреймворку CollectionEditor я нашел ответ через свойство Site объекта PropertyGrid. Это то что ты делаешь:

(1) Сохраните ссылку на контекст ITypeDescriptor. Это можно сделать при первом редактировании в браузере свойств или в области конструктора.

(2) После создания собственной сетки свойств установите для свойства «Сайт» новый сайт, содержащий все службы из исходного контекста.

Вместо того, чтобы изобретать колесо, используйте отражатель, перейдите в System.ComponentModel.Design.CollectionEditor.PropertyGridSite и запишите код.

person Jules    schedule 13.04.2010