Как я могу сопоставить тему Visual Studio при создании окна инструментов VSIX?

Я создаю расширение для Visual Studio (2012+), которое включает в себя окно инструментов. Я надеялся оформить окно идентично, чтобы оно соответствовало текущей теме Visual Studio. Однако мне очень сложно понять, как это сделать.

Эта почта предполагает, что применение стиля - это все, что требуется, но это не соответствует моему опыту до сих пор (даже создание проекта VSIX по умолчанию в VS2017 и добавление окна инструментов показывает кнопку, которая, я бы сказал, является стандартным WPF в теме и не на тему VS, по крайней мере, при использовании темной темы VS в VS2017).

Эта почта задал аналогичный вопрос, и решение в то время, казалось, заключалось в создании аналогичных элементов управления с использованием бесплатного набора инструментов. Однако это было для VS2012 6 лет назад, и я надеюсь, что в наши дни решение станет более доступным. Выбор этого пути не кажется очень перспективным.

Другое решение - применить Visual Studio VsBrushes и VsColors к элементам управления WPF. Это, вероятно, поможет мне найти решение, но стили - это больше, чем цвета, поэтому это не кажется очень удовлетворительным.

Есть ли способ применить стили основных элементов управления Visual Studio (кнопка, текстовое поле, список, дерево и т. д.) К моему окну инструментов VSIX, чтобы оно выглядело как дома в Visual Studio?

Спасибо за любые предложения!

Как насчет привязки к статическим ресурсам VS? stackoverflow.com/questions/18913208/…

Leo Liu-MSFT 06.07.2018 09:45

Это решение, на котором я остановился. По сути, это немного более простое решение, чем использование VsColors и VsBrushes. Я думаю, что смогу приблизиться к внешнему виду VS, но он не будет таким же без использования того же XAML, что и VS.

GrantTheAnt 07.07.2018 23:56
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
7
2
1 740
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

How can I match Visual Studio's theme when creating a VSIX tool window?

Вы можете попробовать привязку к статическим ресурсам VS:

<ResourceDictionary xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vs_shell = "clr-namespace:Microsoft.VisualStudio.PlatformUI;assembly=Microsoft.VisualStudio.Shell.11.0">
<Style TargetType = "Label">
    <Setter Property = "Foreground" Value = "{DynamicResource {x:Static vs_shell:EnvironmentColors.ToolWindowTextBrushKey}}"/>
</Style>
<Style TargetType = "TextBox">
    <Setter Property = "Foreground" Value = "{DynamicResource {x:Static vs_shell:EnvironmentColors.ToolWindowTextBrushKey}}"/>
    <Setter Property = "Background" Value = "{DynamicResource {x:Static vs_shell:EnvironmentColors.ToolWindowBackgroundBrushKey}}"/>
</Style>
</ResourceDictionary>

Подробнее см. EnvironmentColors Класс.

Примечание. Чтобы получить точно такую ​​же тему, вам необходимо использовать тот же XAML, который использует VS. Спасибо @GrantTheAnt.

Мне кажется, что правильный ответ на этот вопрос: вы не должны / Microsoft не хочет, чтобы вы это делали. Эта почта излагает обоснование этого. TL; DR сообщения, похоже, заключается в том, что MS не хочет, чтобы сторонние окна выглядели как официальные окна VS, потому что это может вызвать путаницу для пользователей. Я думаю, это достаточно справедливо, но обратная сторона этого заключается в том, что VS выглядит довольно уродливо с окнами, оформленными по-разному.

Если - как и я - вы все еще хотите продвигать и стилизовать свои окна, как VS, лучшим вариантом, кажется, будет пойти с постом @ Leo выше и использовать EnvironmentColors. Вы не получите стилей, но, по крайней мере, сможете довольно близко подойти к цветам. Это хороший блог, в котором говорится об этом подробнее.

Я приму ответ Лео на том основании, что это лучшее из возможных решений.

В качестве еще одного дополнения к этому, при написании моего расширения Visual Studio я действительно хотел, чтобы окно моего инструмента выглядело как можно более похоже на окно Visual Studio. Иногда мне было невероятно сложно найти правильное значение EnvironmentColors. Как минимум, правильное значение цвета должно работать для стандартных / предоставленных тем Visual Studio. Итак, разочарованный, я написал небольшое приложение, чтобы помочь мне определить правильное значение, которое я сделал доступным на http://niahtextfilter.com/environmentcolorsfinder/. Чтобы использовать его, вы указываете желаемое значение цвета RGB, и приложение будет отображать наиболее вероятных кандидатов EnvironmentColors. Чтобы получить наиболее точных кандидатов, вы можете указать цвет, который хотите отображать для каждой темы (темный, обычный, синий) - этого легко добиться, если вы сделаете снимок экрана с образцом элемента пользовательского интерфейса Visual Studio в каждой теме и выберете цвет. нужный вам пиксель.

Это помогло мне достаточно хорошо сопоставить окно инструментов с Visual Studio:

Niah Text Filter

Надеюсь, это поможет и другим!

Это выглядит очень полезным, но на какой версии оболочки он основан? Он возвращает мне EnvironmentColor, которых нет в Microsoft.VisualStudio.Shell.15.0.

Good Night Nerd Pride 11.10.2020 13:24

Вы хотите сделать его открытым, чтобы кто-нибудь мог его обновить?

Good Night Nerd Pride 11.10.2020 13:56

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

GrantTheAnt 12.10.2020 03:31

Ставил сюда: bitbucket.org/grantdavies/vsenvironmentcolorsfinder/src/mast‌ er

GrantTheAnt 12.10.2020 08:03

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

Good Night Nerd Pride 16.10.2020 15:04

Отличная работа! Цветная пипетка - действительно хорошее улучшение качества жизни.

GrantTheAnt 17.10.2020 00:39

Я знаю, что это старый вопрос, но я решил расширить ответы. Вдруг кому-то пригодится.

Помимо назначения цвета, вы также можете назначать стили стандартным компонентам (Button, ComboBox и т. д.). Все стили находятся в классе VsResourceKeys.

Например:

<Button Style = "{DynamicResource {x:Static vsshell:VsResourceKeys.ButtonStyleKey}}" />

Также здесь вы можете видеть все цвета на одном изображении для разных цветовых схем (темный, светлый, синий).

Другие вопросы по теме