【问题标题】:How can I match Visual Studio's theme when creating a VSIX tool window?创建 VSIX 工具窗口时如何匹配 Visual Studio 的主题?
【发布时间】:2018-07-04 22:16:44
【问题描述】:

我正在为 Visual Studio (2012+) 创建一个包含工具窗口的扩展。我希望将窗口设置为相同的样式以匹配 Visual Studio 的当前主题。但是,我很难弄清楚如何去做。

This post 建议完全不应用任何样式,但这与我迄今为止的经验不符(即使在 VS2017 中创建默认 VSIX 项目并添加工具窗口也会显示一个按钮,我认为是主题中的标准 WPF 而不是 VS 主题,至少在 VS2017 中使用深色 VS 主题时)。

This post 提出了类似的问题,当时的解决方案似乎是使用免费工具包创建类似的控件。但是,那是 VS2012 和 6 年前的情况,我希望这些天有更多可用的解决方案。走这条路似乎不太适合未来。

另一个解决方案是将 Visual Studio 的 VsBrushes 和 VsColors 应用于 WPF 控件。这可能让我找到了解决办法——但样式不仅仅是颜色,所以看起来不太令人满意。

有没有一种方法可以将 Visual Studio 的基本控件样式(按钮、文本框、列表视图、树视图等)应用到我的 VSIX 工具窗口,使其在 Visual Studio 中看起来和感觉就像在家里一样?

感谢您的任何建议!

【问题讨论】:

  • 绑定到静态VS资源怎么样? stackoverflow.com/questions/18913208/…
  • 这是我确定的解决方案。它基本上比使用 VsColors 和 VsBrushes 稍微容易一些。我想我可以接近 VS 的外观和感觉,但如果不使用 VS 使用的确切 XAML,它不会完全相同。

标签: wpf xaml visual-studio-extensions vsix vs-extensibility


【解决方案1】:

创建 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 Class

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

【讨论】:

    【解决方案2】:

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

    它帮助我很好地将我的工具窗口与 Visual Studio 相匹配:

    我希望它也可以帮助其他人!

    【讨论】:

    • 这看起来很有帮助,但是这是基于什么shell版本?它给了我在Microsoft.VisualStudio.Shell.15.0 中找不到的EnvironmentColors。
    • 您是否愿意将其开源以便有人可以更新它?
    • 好的,我会看看能不能把它放到公共的 bitbucket 仓库中。
    • 我在GitHub 上发布了您应用的更新版本。不错的奖励:它允许直接从屏幕上选择颜色,因此不必再截取屏幕截图了 :) 如果您认为这侵犯了您的版权或者您希望将其合并到原始存储库中,请告诉我。
    【解决方案3】:

    我觉得这个问题的正确答案是:你不应该这样做/微软不希望你这样做。 This post 概述了这背后的基本原理。该帖子的 TLDR 似乎是 MS 不希望第三方窗口看起来像官方 VS 窗口,因为它可能会给用户造成混淆。我想这很公平,但另一方面是 VS 在不同主题/样式的窗口中看起来很丑。

    如果 - 像我一样 - 你仍然想像 VS 一样推动和设计你的窗口,最好的选择似乎是使用上面@Leo 的帖子并使用 EnvironmentColors。您不会得到样式,但至少可以与颜色非常接近。 This is a good blog 对此进行了更深入的介绍。

    我会接受 Leo 的回答,因为它是可用的最佳解决方案。

    【讨论】:

      【解决方案4】:

      我知道这是一个老问题,但我决定扩展答案。突然间它会对某人有用。

      除了颜色分配,您还可以为标准组件(按钮、组合框等)分配样式。所有样式都在VsResourceKeys 类中。

      例如:

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

      还有here,您可以在一张图片中看到不同配色方案(深、浅、蓝色)的所有颜色。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-06-15
        • 2020-06-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多