Как добавить службу в контекст дескриптора типа сетки свойств в .Net? - PullRequest
2 голосов
/ 13 апреля 2010

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

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

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

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

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

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

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

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

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

1 Ответ

1 голос
/ 14 апреля 2010

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

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

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

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

...