В дополнение к точному и правильному ответу Резы (который я принял как ответ) по этой довольно специализированной теме:
Существует много возможных / жизнеспособных способов подключения дизайнера Winforms и его зависимые объекты (набор инструментов, сетка свойств и т. д.), поэтому последовательность / время добавления определенных сервисов дизайнера в контейнер сервисов области разработки будут отличаться. Некоторые службы должны быть добавлены явно (например, INameCreationService
или IToolboxService
); другие добавляются фреймворком.
Я еще не пришел к выводу, когда именно фреймворк добавляет BehaviorService
к контейнеру сервисов, но я пришел к выводу, что этот сервис добавляется в любой работающий сервис проектирования (то есть тот, который позволяет вам перетащите уже добавленные элементы управления вокруг поверхности дизайна с помощью мыши).
Кроме того, многие объекты в пространстве имен System.ComponentModel.Design
предлагают доступ к набору доступных служб, предоставляя метод GetService()
. (В ответе Резы используется метод GetService
объекта Site.) Если вы обнаружите, что GetService(typeof(BehaviorService))
не может вернуть действительный объект BehaviorService
, это обычно означает, что BehaviorService
еще не еще не было добавлен в область дизайна ... Я говорю "пока", потому что перетаскивание элементов управления, уже размещенных на поверхности конструктора, требует наличия BehaviorService
в контейнере службы хоста. Поэтому, если ваша попытка получить экземпляр BehaviorService
с помощью метода GetService
не удалась, есть вероятность, что BehaviorService
просто еще не был добавлен в конструкторскую среду. Чтобы решить эту проблему, вам обычно нужно просто переместить код для перехвата событий BehaviorService
куда-нибудь вниз по течению.
Чтобы проверить, какие сервисы уже добавлены в область проектирования, вы можете проверить коллекцию объекта ServiceContainer
объекта поверхности проектирования Services
, которая содержит исчерпывающий список сервисов. Как предлагает Реза, хорошим местом для добавления кода, необходимого для подключения к событиям BehaviorService
, является обработчик событий OnHandleCreated
базовой формы.
Если вы устанавливаете только цвет фона, попробуйте заменить ControlBrush
для ListBox, согласно этого ответа .