我正在为Visual Studio(2012+)创建一个涉及工具窗口的扩展。我希望为窗口设置相同的样式以匹配Visual Studio的当前主题。但是,我在解决方法上遇到了很多麻烦。
This post建议根本不应用任何样式,但这与我到目前为止的经验不符(即使在VS2017中创建默认的VSIX项目并添加工具窗口也显示了一个按钮,至少在VS2017中使用深色VS主题时,争论是主题中的标准WPF而不是VS主题。
This post提出了类似的问题,当时的解决方案似乎是使用免费工具包来创建类似的控件。但是,那是针对VS2012和6年前的,我希望现在有更多可用的解决方案。采取这条路线似乎不是很未来的证据。
另一种解决方案是将Visual Studio的VsBrushes和VsColors应用于WPF控件。这可能使我找到了解决方案的某种方式-但样式不只是颜色,因此似乎不太令人满意。
是否可以将Visual Studio的基本控件样式(按钮,文本框,列表视图,树视图等)应用于我的VSIX工具窗口,以使其在Visual Studio中看起来像在家一样?
谢谢您的建议!
答案 0 :(得分:3)
在创建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。
答案 1 :(得分:2)
作为对此的另一后续操作,在编写Visual Studio扩展时,我真的很想让我的工具窗口看起来尽可能像Visual Studio窗口。有时,我发现很难找到正确的EnvironmentColors值。至少,正确的颜色值应该在默认/提供的Visual Studio主题中起作用。因此,沮丧的是,我写了一个小应用程序来帮助我确定正确的值,该值已在http://niahtextfilter.com/environmentcolorsfinder/上提供。要使用它,请指定所需的RGB颜色值,然后该应用程序将显示最可能的EnvironmentColors候选对象。为了获得最准确的候选者,您可以提供每个主题要显示的颜色(深色,常规,蓝色)-如果您为每个主题中的示例Visual Studio UI元素进行屏幕截图并获得色滴,则很容易实现您需要的像素。
它帮助我将工具窗口与Visual Studio很好地匹配:
我希望它也能帮助其他人!
答案 2 :(得分:1)
我觉得这个问题的正确答案是:您不应该/微软不希望您这样做。 This post概述了其背后的原理。该帖子的TLDR似乎是MS不想让第三方窗口看起来像官方VS窗口,因为这可能会使用户感到困惑。我想这很公平,但是相反的是,VS的主题/样式窗口不同,看起来丑陋了。
如果-像我一样-如果您仍然希望像VS一样推动和设置窗口样式,最好的选择似乎是与上面@Leo的帖子一起使用并使用EnvironmentColors。您不会得到样式,但是至少可以与颜色非常接近。 This is a good blog概述了这一点。
我会接受Leo的回答,因为它是现有的最佳解决方案。
答案 3 :(得分:0)
我知道这是一个老问题,但我决定扩展答案。突然对某人有用。
除了颜色分配之外,您还可以为标准组件(按钮、组合框等)分配样式。所有样式都在 VsResourceKeys 类中。
例如:
<Button Style="{DynamicResource {x:Static vsshell:VsResourceKeys.ButtonStyleKey}}" />
此外,here 您可以在一张图片中看到不同配色方案(深色、浅色、蓝色)的所有颜色。