Как я могу сопоставить тему 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?

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


person GrantTheAnt    schedule 04.07.2018    source источник
comment
Как насчет привязки к статическим ресурсам VS? stackoverflow.com/questions/18913208/   -  person Leo Liu-MSFT    schedule 06.07.2018
comment
Это решение, на котором я остановился. По сути, это немного более простое решение, чем использование VsColors и VsBrushes. Я думаю, что смогу приблизиться к внешнему виду VS, но он не будет таким же без использования того же XAML, что и VS.   -  person GrantTheAnt    schedule 08.07.2018


Ответы (4)


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

Вы можете попробовать привязку к статическим ресурсам 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.

person Leo Liu-MSFT    schedule 09.07.2018

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

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

Текстовый фильтр Ниа

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

person GrantTheAnt    schedule 20.08.2019
comment
Это выглядит очень полезным, но на какой версии оболочки он основан? Это возвращает мне EnvironmentColor, которых нет в Microsoft.VisualStudio.Shell.15.0. - person Good Night Nerd Pride; 11.10.2020
comment
Вы хотите сделать его открытым, чтобы кто-нибудь мог его обновить? - person Good Night Nerd Pride; 11.10.2020
comment
Конечно, я посмотрю, смогу ли я поместить его в публичное репозиторий битбакетов. - person GrantTheAnt; 12.10.2020
comment
Я поместил это здесь: bitbucket.org/grantdavies/vsenvironmentcolorsfinder/src/master - person GrantTheAnt; 12.10.2020
comment
Я разместил обновленную версию вашего приложения на GitHub. Приятный бонус: он позволяет выбирать цвет прямо с экрана, поэтому больше не нужно делать скриншоты :) Пожалуйста, дайте мне знать, если вы считаете, что это нарушает ваши авторские права, или вы хотите, чтобы это было объединено с исходным репо. - person Good Night Nerd Pride; 16.10.2020
comment
Отличная работа! Цветная пипетка - действительно хорошее улучшение качества жизни. - person GrantTheAnt; 17.10.2020

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

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

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

person GrantTheAnt    schedule 09.07.2018

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

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

Например:

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

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

person Snowy Owl    schedule 09.02.2021