如何在创建VSIX工具窗口时匹配Visual Studio的主题?

12

我正在为Visual Studio (2012+)创建一个扩展,其中包括一个工具窗口。我希望将窗口的样式与当前Visual Studio的主题完全相同。然而,我在弄清如何实现这一点方面遇到了很大的困难。

这篇文章建议不应用任何样式就足够,但是到目前为止我的体验与此不符(即使在VS2017中创建默认的VSIX项目并添加工具窗口,该按钮也是标准的WPF风格,而不是VS主题,至少在使用VS2017的深色主题时是这样)。

这篇文章提出了一个类似的问题,当时的解决方法似乎是使用免费工具包创建类似的控件。然而,那是针对VS2012和6年前的情况,我希望现在能够找到更好的解决方案。采用这种方法似乎不太有前途。

另一种解决方案是将Visual Studio的VsBrushes和VsColors应用于WPF控件。这可能让我离解决方案更近了一步,但样式不仅仅是颜色,因此这似乎并不是很令人满意。

有没有一种方法可以将Visual Studio的基本控件样式(按钮,文本框,列表视图,树视图等)应用于我的VSIX工具窗口,使其在Visual Studio中看起来和感觉上都更加协调?

感谢任何建议!


绑定到静态的VS资源怎么样?https://dev59.com/i2Mk5IYBdhLWcg3w2RaT - Leo Liu
这就是我定下的解决方案。它基本上比使用 VsColors 和 VsBrushes 更容易一些。我认为我可以接近 VS 的外观和感觉,但如果不使用 VS 使用的确切XAML,它将不会完全相同。 - GrantTheAnt
4个回答

9
当创建一个VSIX工具窗口时,如何匹配Visual Studio的主题?
你可以尝试绑定静态的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 类

注意:要获得完全相同的主题,您需要使用 VS 使用的确切 XAML。感谢 @GrantTheAnt。


6

我知道这是个老问题,但我决定进一步扩展答案。突然之间,这可能对某些人有用。

除了颜色分配之外,您还可以为标准组件(Button、ComboBox等)分配样式。所有样式都在VsResourceKeys类中。

例如:

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

此外,在这里 您可以看到不同颜色方案(深色、浅色、蓝色)的所有颜色在一张图片中的显示。


5
作为对此的另一个跟进,当我编写我的Visual Studio扩展时,我真的希望我的工具窗口尽可能像Visual Studio窗口一样。有时候,我发现很难找到正确的EnvironmentColors值。至少,正确的颜色值应该适用于默认/提供的Visual Studio主题。所以,我感到沮丧,写了一个小应用程序来帮助我找到正确的值,我已经在http://niahtextfilter.com/environmentcolorsfinder/上提供了这个应用程序。要使用它,您需要指定您想要的RGB颜色值,应用程序将显示最可能的EnvironmentColors候选项。为了获得最准确的候选项,您可以为每个主题(深色、常规、蓝色)提供您想要显示的颜色——如果您在每个主题中拍摄一个样本Visual Studio UI元素的截图,并取色所需的像素,这很容易实现。

它帮助我把我的工具窗口与Visual Studio相匹配得相当不错:

Niah Text Filter

我希望它也能帮助其他人!


这看起来非常有帮助,但是它基于哪个shell版本?它给我返回了在Microsoft.VisualStudio.Shell.15.0中找不到的EnvironmentColors。 - Good Night Nerd Pride
你能否考虑将它开源,这样别人就可以更新它了吗? - Good Night Nerd Pride
1
好的,我会看看能否将它放到公共的Bitbucket仓库中。 - GrantTheAnt
1
我把它放在这里:https://bitbucket.org/grantdavies/vsenvironmentcolorsfinder/src/master/ - GrantTheAnt
1
我在GitHub上放了你应用程序的更新版本。不错的奖励:它允许直接从屏幕上选择颜色,这样就不必再截图了 :) 请让我知道如果您觉得这侵犯了您的版权或者您希望将其合并到原始存储库中。 - Good Night Nerd Pride
干得好!取色器是一个非常不错的QOL改进。 - GrantTheAnt

3
我觉得这个问题的正确答案是:你不应该这么做/微软不希望你这么做。 这篇文章 概述了这背后的理由。文章的TLDR似乎是,微软不想让第三方窗口看起来像官方的VS窗口,因为这可能会让用户感到困惑。我想这很公平,但反过来,VS会因为不同的主题/样式窗口而变得相当丑陋。
如果你像我一样仍然想要继续并像VS一样设计你的窗口,最好的选择似乎是使用@Leo上面的帖子并使用EnvironmentColors。你得不到样式,但至少可以用颜色接近。这是一个很好的博客,更深入地介绍了这个问题。

我会接受Leo的答案,因为它是当前最佳解决方案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接