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

2

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

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

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

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

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

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

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

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

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

Теги:
propertygrid

1 ответ

1
Лучший ответ

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

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню