开发Visual Studio Extensions获取当前的前景色

时间:2015-06-11 05:40:15

标签: wpf visual-studio visual-studio-2013

在我的WPF用户控件中,如果用户有一个黑暗的主题,我的所有文本默认为黑色将难以阅读。使用 VS 当前颜色的正确方法是什么。

1 个答案:

答案 0 :(得分:0)

您可以通过两种方式编写自己的Visual Studio样式画笔并与控件合并。

另一方面,您可以从Windows注册表中选择VS主题的资源。很久以前我使用Utility类从windows Registry中选择当前主题。

public enum VsTheme
{
    Unknown = 0, 
    Light, 
    Dark, 
    Blue
}

public class ThemeUtil
{
    private static readonly IDictionary<string, VsTheme> Themes = new Dictionary<string, VsTheme>()
    {
        { "de3dbbcd-f642-433c-8353-8f1df4370aba", VsTheme.Light }, 
        { "1ded0138-47ce-435e-84ef-9ec1f439b749", VsTheme.Dark }, 
        { "a4d6a176-b948-4b29-8c66-53c97a1ed7d0", VsTheme.Blue }
    };

    public static VsTheme GetCurrentTheme()
    {
        string themeId = GetThemeId();
        if (string.IsNullOrWhiteSpace(themeId) == false)
        {
            VsTheme theme;
            if (Themes.TryGetValue(themeId, out theme))
            {
                return theme;
            }
        }

        return VsTheme.Unknown;
    }

    public static string GetThemeId()
    {
        const string CategoryName = "General";
        const string ThemePropertyName = "CurrentTheme";
        string keyName = string.Format(@"Software\Microsoft\VisualStudio\11.0\{0}", CategoryName);

        using (RegistryKey key = Registry.CurrentUser.OpenSubKey(keyName))
        {
            if (key != null)
            {
                return (string)key.GetValue(ThemePropertyName, string.Empty);
            }
        }

        return null;
    }
}

我找到了另一种方法。我可以直接使用xaml中的visual studio主题颜色资源。对于这些,您需要 Microsoft.VisualStudio.Shell.12.0。(对于VS2013)它是VisualStudio版本的可分发组件。一旦您通过项目添加,您可以直接访问所有画笔作为XAML本身的关键。例如

Background="{DynamicResource {x:Static vsfx:VsBrushes.EnvironmentBackgroundGradientKey}}"

NameSpace必须添加为

xmlns:vsfx="clr-namespace:Microsoft.VisualStudio.Shell;assembly=Microsoft.VisualStudio.Shell.12.0"

您可以从以下MSDN链接中引用所有画笔

https://msdn.microsoft.com/en-us/library/microsoft.visualstudio.shell.vsbrushes(v=vs.120).aspx

如果您想要检测主题更改事件本身,可以使用 VSColorTheme.ThemeChanged 事件

https://msdn.microsoft.com/en-us/library/microsoft.visualstudio.platformui.vscolortheme.themechanged.aspx