Я написал расширение Visual Studio 2013, которое поддерживает конструктор Windows.Forms. Когда разработчик меняет элементы управления в окне дизайнера, расширение пытается убедиться, что результат соответствует нашим рекомендациям по стилю пользовательского интерфейса. Если обнаружены возможные нарушения, они перечислены в окне инструмента. Это все отлично работает. Но теперь я хотел бы отметить несовместимые элементы управления в окне дизайнера, например, красной рамкой или чем-то вроде этого.
К сожалению, я не нашел способа рисовать украшения на элементах управления в окне дизайнера. Я знаю, что вы можете рисовать эти украшения, если разрабатываете свой собственный ControlDesigner
, но мне нужно сделать это "извне" дизайнера элементов управления. У меня есть только IDesignerHost
из Dte2.ActiveWindow
и я могу получить доступ к Controls и ControlDesigners через этот хост. Я не мог найти способ добавить украшения "извне" ControlDesigners. Мой обходной путь на данный момент - поймать Paint-Events элементов управления и попытаться нарисовать оттуда мои украшения. Это не работает хорошо для всех элементов управления (например, ComboBox и т.д.), Потому что не все элементы управления позволяют вам рисовать на них. Поэтому мне пришлось использовать их родительский элемент управления Paint. И у этого решения есть и другие недостатки.
Я надеюсь, что кто-то может сказать мне, если есть лучший способ. Я почти уверен, что должен быть один: если вы используете Menu-> View-> Tab Order (не уверен насчет правильного заголовка меню на английском, я использую немецкую IDE), вы можете видеть, что сама IDE Умеет украшать элементы управления (нет скриншота, потому что это мой первый пост на SO), и я уверен, что он не использует такую работу, как я. Как оно это делает?
Я гуглил это уже несколько недель. Спасибо за любую помощь, совет, исследование отправных точек....
ОБНОВИТЬ:
Может быть, с этим снимком экрана становится немного яснее:
Эти синие пронумерованные вставки - это то, что Visual Studio показывает при выборе порядка табуляции в меню "Вид". И мой вопрос, как это делается в IDE.
Как уже упоминалось, я пытался сделать это в событии Paint
элементов управления, но, например, ComboBox на самом деле не поддерживает это событие. И если я использую родительское событие Paint
я могу рисовать только "вокруг" дочерних элементов управления, потому что они нарисованы после родительского.
Я также думал об использовании отражения на элементах управления или ControlDesigner
, но я не уверен, как подключить защищенный метод OnPaintAdornments
. И я не думаю, что разработчики IDE использовали эти "грязные" трюки.