在 Visual Studio 中使用颜色
在 Visual Studio 中,颜色主要用于通信工具,而不仅仅是修饰。 在想要以下情况下使用颜色,并保留颜色:
传达含义或附属关系(例如平台或语言修饰符)
吸引注意(例如,指示状态更改)
提高可读性并提供用于导航 UI 的地标
提高可取性
存在多个选项,用于将颜色分配给 Visual Studio 中的 UI 元素。 有时很难弄清楚应该使用哪种选项,或者如何使用它。 本主题将帮助你:
了解用于在 Visual Studio 中定义颜色的不同服务和系统。
为给定元素选择正确的选项。
正确使用所选选项。
注意
切勿将十六进制、RGB 或系统颜色硬编码为 UI 元素。 使用服务可以灵活地优化色调。 此外,如果没有服务,将无法利用 VSColor 服务的主题切换功能。
将颜色分配给 Visual Studio 接口元素的方法
选择最适合 UI 元素的方法。
Your UI | 方法 | 分别是哪两个参数? |
---|---|---|
已嵌入或独立对话框。 | 系统颜色 | 允许操作系统定义 UI 元素的颜色和外观(如常见对话框控件)的系统名称。 |
你具有想要与整体 VS 环境一致的自定义 UI,并且具有与共享令牌的类别和语义含义匹配的 UI 元素。 | 常见共享颜色 | 特定 UI 元素的现有预定义颜色标记名称 |
你有一个单个功能或一组功能,并且没有类似元素的共享颜色。 | 自定义颜色 | 特定于某个区域且不打算与其他 UI 共享的颜色令牌名称 |
你想要允许最终用户自定义 UI 或内容(例如,对于文本编辑器或专用设计器窗口)。 | 最终用户自定义 (工具 > 选项对话框) |
在 “字体和颜色” 页中定义的设置特定于一个 UI 功能的“工具>选项”对话框或专用页面。 |
Visual Studio 主题
Visual Studio 具有三种不同的颜色主题:浅色、深色和蓝色。 它还会检测高对比度模式,该模式是专为辅助功能设计的全系统颜色主题。
当用户首次使用 Visual Studio 时,系统会提示用户选择主题,以后可以通过转到 “工具 > 选项 > 环境 > 常规 ”并从“颜色主题”下拉菜单中选择新主题来切换主题。
用户也可以使用控制面板将其整个系统切换到多个高对比度主题之一。 如果用户选择高对比度主题,则 Visual Studio 颜色主题选择器不再影响 Visual Studio 中的颜色,尽管当用户退出高对比度模式时保存任何主题更改。 有关高对比度模式的详细信息,请参阅 “选择高对比度颜色”。
VSColor 服务
Visual Studio 提供了一种称为 VSColor 服务的环境颜色服务,它允许将 UI 元素的颜色值绑定到包含每个 Visual Studio 主题颜色值的命名条目。 这可确保颜色会自动更改,以反映当前用户选择的主题或系统高对比度模式。 使用服务意味着所有与主题相关的颜色更改的实现在一个位置进行处理,如果使用的是服务的常用共享颜色,UI 将在 Visual Studio 的未来版本中自动反映新主题。
实现
Visual Studio 源代码包含多个包定义文件,其中包含令牌名称和每个主题各自的颜色值列表。 颜色服务读取这些包定义文件中定义的 VSColor。 这些颜色在 XAML 标记或代码中引用,然后通过 IVsUIShell5.GetThemedColor
方法或 DynamicResource 映射加载。
系统颜色
公共控件默认引用系统颜色。 如果希望 UI 使用系统颜色,例如在创建嵌入对话或独立对话时,无需执行任何操作。
VSColor 服务中的常见共享颜色
接口元素应反映整个 Visual Studio 环境。 通过重用适合你设计的 UI 组件的常见共享颜色,可确保界面与其他 Visual Studio 界面保持一致,并且添加或更新主题时颜色会自动更新。
在使用常用共享颜色之前,请确保了解如何正确使用它们。 对常见共享颜色的不正确使用可能会导致用户的不一致、令人沮丧或令人困惑的体验。
用户可自定义的颜色
请参阅: 为最终用户公开颜色
有时,你需要允许最终用户自定义 UI,就像创建代码编辑器或设计图面时一样。 可在“工具>选项”对话框的“字体和颜色”部分找到可自定义的 UI 组件,用户可以选择更改前景色、背景色或同时更改这两者。
“工具 > 选项”对话框
VSColor 服务
Visual Studio 提供环境颜色服务,也称为 VSColor 服务或 shell 颜色服务。 此服务允许将 UI 元素的颜色值绑定到包含每个主题颜色的名称值颜色集。 VSColor 服务必须用于所有 UI 元素,以便颜色自动更改以反映当前用户选择的主题,以便绑定到环境颜色服务的 UI 将与 Visual Studio 的未来版本中的新主题集成。
服务的工作原理
环境颜色服务读取在 UI 组件的 .pkgdef 中定义的 VSColors。 然后,这些 VSColor 在 XAML 标记或代码中引用,并通过 IVsUIShell5.GetThemedColor
或 DynamicResource
映射加载。
环境颜色服务体系结构
访问服务
有多种不同的方法来访问 VSColor 服务,具体取决于所使用的颜色令牌类型以及你拥有的代码类型。
预定义的环境颜色
从本机代码
shell 提供一项服务,用于访问 COLORREF
颜色。 服务/接口为:
IVsUIShell2::GetVSSysColorEx(VSSYSCOLOR dwSysColIndex, DWORD *pdwRGBval)
在文件 VSShell80.idl 中,枚举 __VSSYSCOLOREX
具有 shell 颜色常量。 若要使用它,请作为索引值传入 MSDN 中记录的值 enum __VSSYSCOLOREX
之一或 Windows 系统 API GetSysColor
接受的常规索引号。 执行此操作将返回应在第二个参数中使用的颜色的 RGB 值。
如果使用新颜色存储笔或画笔,则必须 AdviseBroadcastMessages
(从 Visual Studio shell 中关闭)并侦 WM_SYSCOLORCHANGE
听和 WM_THEMECHANGED
消息。
若要在本机代码中访问颜色服务,需要进行类似于下面的调用:
pUIShell2->GetVSSysColorEx(VSCOLOR_COLOR_NAME, &rgbLOCAL_COLOR);
注意
COLORREF
返回GetVSSysColorEx()
的值仅包含主题颜色的 R、G、B 组件。 如果主题条目使用透明度,则返回之前,alpha 通道值将被取消卡。 因此,如果需要将感兴趣的环境颜色用于透明度通道非常重要的位置,则应使用 IVsUIShell5.GetThemedColor
,而不是 IVsUIShell2::GetVSSysColorEx
本主题后面的说明。
从托管代码
通过本机代码访问 VSColor 服务非常简单。 但是,如果正在处理托管代码,则确定如何使用该服务可能很棘手。 考虑到这一点,下面是演示此过程的 C# 代码片段:
private void VSColorPaint(object sender, System.Windows.Forms.PaintEventArgs e)
{
//getIVSUIShell2
IVsUIShell2 uiShell2 = Package.GetService(typeof(SVsUIShell)) as IVsUIShell2;
Debug.Assert (uiShell2 != null, "failed to get IVsUIShell2");
if (uiShell2 != null)
{
//get the COLORREF structure
uint win32Color;
uiShell2.GetVSSysColorEx((int)__VSSYSCOLOREX.VSCOLOR_SMARTTAG_HOVER_FILL, out win32Color);
//translate it to a managed Color structure
Color myColor = ColorTranslator.FromWin32((int)win32Color);
//use it
e.Graphics.FillRectangle(new SolidBrush(myColor), 0, 0, 100, 100);
}
}
如果在 Visual Basic 中工作,请使用:
Dim myColor As Color = ColorTranslator.FromWin32((Integer)win32Color)
从 WPF UI
可以通过导出到应用程序 ResourceDictionary
的值绑定到 Visual Studio 颜色。 下面是使用颜色表中的资源以及绑定到 XAML 中的环境字体数据的示例。
<Style TargetType="{x:Type Button}">
<Setter Property="TextBlock.FontFamily"
Value="{DynamicResource VsFont.EnvironmentFontFamily}" />
<Setter Property="TextBlock.FontSize"
Value="{DynamicResource VsFont.EnvironmentFontSize}" />
<Setter Property="Background"
Value="{DynamicResource VsBrush.EnvironmentBackgroundGradient}" />
</Style>
托管代码的帮助程序类和方法
对于托管代码,shell 的托管包框架库 (Microsoft.VisualStudio.Shell.12.0.dll
) 包含几个帮助程序类,方便使用主题颜色。
MPF 中的类中的 Microsoft.VisualStudio.Shell.VsColors
帮助程序方法包括 GetThemedGDIColor()
和 GetThemedWPFColor()
。 这些帮助程序方法将主题条目 System.Drawing.Color
的颜色值作为或 System.Windows.Media.Color
要在 WinForms 或 WPF UI 中使用。
IVsUIShell5 shell5;
Button button = new Button();
button.BackColor = GetThemedGDIColor(shell5, SolutionExplorerColors.SelectedItemBrushKey);
button.ForeColor = GetThemedGDIColor(shell5, SolutionExplorerColors.SelectedItemTextBrushKey);
/// <summary>
/// Gets a System.Drawing.Color value from the current theme for the given color key.
/// </summary>
/// <param name="vsUIShell">The IVsUIShell5 service, used to get the color's value.</param>
/// <param name="themeResourceKey">The key to find the color for.</param>
/// <returns>The current theme's value of the named color.</returns>
public static System.Drawing.Color GetThemedGDIColor(this IVsUIShell5 vsUIShell, ThemeResourceKey themeResourceKey)
{
Validate.IsNotNull(vsUIShell, "vsUIShell");
Validate.IsNotNull(themeResourceKey, "themeResourceKey");
byte[] colorComponents = GetThemedColorRgba(vsUIShell, themeResourceKey);
// Note: The Win32 color we get back from IVsUIShell5.GetThemedColor is ABGR
return System.Drawing.Color.FromArgb(colorComponents[3], colorComponents[0], colorComponents[1], colorComponents[2]);
}
private static byte[] GetThemedColorRgba(IVsUIShell5 vsUIShell, ThemeResourceKey themeResourceKey)
{
Guid category = themeResourceKey.Category;
__THEMEDCOLORTYPE colorType = __THEMEDCOLORTYPE.TCT_Foreground
if (themeResourceKey.KeyType == ThemeResourceKeyType.BackgroundColor || themeResourceKey.KeyType == ThemeResourceKeyType.BackgroundBrush)
{
colorType = __THEMEDCOLORTYPE.TCT_Background;
}
// This call will throw an exception if the color is not found
uint rgbaColor = vsUIShell.GetThemedColor(ref category, themeResourceKey.Name, (uint)colorType);
return BitConverter.GetBytes(rgbaColor);
}
public static System.Windows.Media.Color GetThemedWPFColor(this IVsUIShell5 vsUIShell, ThemeResourceKey themeResourceKey)
{
Validate.IsNotNull(vsUIShell, "vsUIShell");
Validate.IsNotNull(themeResourceKey, "themeResourceKey");
byte[] colorComponents = GetThemedColorComponents(vsUIShell, themeResourceKey);
return System.Windows.Media.Color.FromArgb(colorComponents[3], colorComponents[0], colorComponents[1], colorComponents[2]);
}
该类还可用于获取给定 WPF 颜色资源键的 VSCOLOR 标识符,反之亦然。
public static string GetColorBaseKey(int vsSysColor);
public static bool TryGetColorIDFromBaseKey(string baseKey, out int vsSysColor);
类方法 VsColors
查询 VSColor 服务,以便在每次调用颜色值时返回颜色值。 若要获取颜色值, System.Drawing.Color
性能更好的替代方法是改用类的方法 Microsoft.VisualStudio.PlatformUI.VSColorTheme
,该方法缓存从 VSColor 服务获取的颜色值。 类在内部订阅 shell 广播消息事件,并在发生主题更改事件时取消卡缓存的值。 此外,该类还提供一个 。用于订阅主题更改的 NET 友好事件。 使用 ThemeChanged
事件添加新处理程序,并使用 GetThemedColor()
该方法获取感兴趣的颜色值 ThemeResourceKeys
。 示例代码如下所示:
public MyWindowPanel()
{
InitializeComponent();
// Subscribe to theme changes events so we can refresh the colors
VSColorTheme.ThemeChanged += VSColorTheme_ThemeChanged;
RefreshColors();
}
private void VSColorTheme_ThemeChanged(ThemeChangedEventArgs e)
{
RefreshColors();
// Also post a message to all the children so they can apply the current theme appropriately
foreach (System.Windows.Forms.Control child in this.Controls)
{
NativeMethods.SendMessage(child.Handle, e.Message, IntPtr.Zero, IntPtr.Zero);
}
}
private void RefreshColors()
{
this.BackColor = VSColorTheme.GetThemedColor(EnvironmentColors.ToolWindowBackgroundColorKey);
this.ForeColor = VSColorTheme.GetThemedColor(EnvironmentColors.ToolWindowTextColorKey);
}
protected override void Dispose(bool disposing)
{
if (disposing)
{
VSColorTheme.ThemeChanged -= this.VSColorTheme_ThemeChanged;
base.Dispose(disposing);}
}
选择高对比度颜色
Windows 使用多个高对比度系统级主题来增加文本、背景和图像的颜色对比度,使元素在屏幕上更加明显。 出于辅助功能原因,当用户切换到高对比度主题时,Visual Studio 界面元素必须正确响应。
只有少数系统颜色可用于高对比度主题。 选择系统颜色名称时,请记住以下提示:
选择与着色的元素具有相同语义含义 的系统颜色。 例如,如果要为窗口中的文本选择高对比度颜色,请使用 WindowText 而不是 ControlText。
选择前景/背景对 在一起,或者你不相信你的颜色选择适用于所有高对比度主题。
确定 UI 的哪些部分最为重要,并确保内容区域脱颖而出。 你会丢失很多细节,颜色色调的细微差异通常会区分,因此使用强边框颜色是常见的定义内容区域,因为不同内容区域没有颜色变体。
系统颜色集
WPF 团队博客上的 表:SystemColors 参考 指示完整的系统颜色名称集,以及每个主题中显示的相应色调。
将这组有限的颜色应用于 UI 时, 预期你会丢失“普通”主题中存在的微妙细节。 下面是一个 UI 示例,其中包含用于区分工具窗口中区域的微妙灰色。 与在高对比度模式下显示的同一窗口配对时,可以看到所有背景都是相同的色调,并且这些区域的边框单独由边框指示:
高对比度中如何丢失微妙细节的示例
在编辑器中选择文本颜色
着色文本用于编辑器或设计图面上,以指示含义,例如允许轻松识别类似项的组。 但是,在高对比度主题中,无法区分三种以上的文本颜色。 WindowText、GrayText 和 HotTrackText 是 WindowBackground 图面上唯一可用的颜色。 由于不能使用三种以上颜色,因此请在高对比度模式下仔细选择想要显示的最重要差异。
编辑器图面上允许的每个标记名称的色调,因为它们显示在每个高对比度主题中:
高对比度编辑器比较
蓝色主题中的编辑器图面示例:
蓝色主题中的编辑器
高对比度 #1 主题中的编辑器
使用模式
许多常见的 UI 元素已经定义了高对比度颜色。 在选择自己的系统颜色名称时,可以引用这些使用模式,以便 UI 元素与类似的组件一致。
系统颜色 | 使用情况 |
---|---|
ActiveCaption | - 悬停和按鼠标悬停时的活动 IDE 和木筏窗口按钮标志符号 - IDE 和木筏窗口的标题栏背景 - 默认状态栏背景 |
ActiveCaptionText | - 标题栏前台的活动 IDE 和木筏窗口(文本和字形) - 悬停和按下活动窗口按钮的背景和边框 |
控制 | - 组合框、下拉列表和搜索控件默认和禁用的背景,包括下拉按钮 - 停靠目标按钮背景 - 命令栏背景 - 工具窗口背景 |
ControlDark | - IDE 背景 - 菜单和命令栏分隔符 - 命令栏边框 - 菜单阴影 - 工具窗口选项卡默认和悬停边框和分隔符 - 文档井溢出按钮背景 - 停靠目标字形边框 |
ControlDarkDark | - 未聚焦的选定文档选项卡窗口 |
ControlLight | - 自动隐藏选项卡边框 - 组合框和下拉列表边框 - 停靠目标背景和边框 |
ControlLightLight | - 选定、重点的临时边框 |
ControlText | - 组合框和下拉列表标志符号 - 工具窗口未选中选项卡文本 |
GrayText | - 组合框和下拉列表禁用边框、下拉字形、文本和菜单项文本 - 禁用的菜单文本 - 搜索控件“搜索选项”标题文本 - 搜索控件节分隔符 |
亮点 | - 所有悬停和按下的背景和边框,组合框下拉按钮背景和文档溢出按钮边框除外 - 所选项背景 |
HighlightText | - 所有悬停和按下前景色(文本和字形) - 焦点工具窗口和文档选项卡窗口控件前景 - 焦点工具窗口标题栏边框 - 重点、选定的临时选项卡前台 - 悬停时文档井溢出按钮边框,然后按 - 所选图标边框 |
HotTrack | - 按下时滚动条拇指背景和边框 - 按下时滚动条箭头字形 |
InactiveCaption | - 悬停时非活动 IDE 和漂流窗口按钮标志符号 - IDE 和木筏窗口的标题栏背景 - 禁用的搜索控件背景 |
InactiveCaptionText | - 非活动 IDE 和木筏窗口标题栏前台(文本和字形) - 悬停时非活动窗口按钮背景和边框 - 未聚焦的工具窗口按钮背景和边框 - 禁用的搜索控件前台 |
菜单 | - 下拉菜单背景 - 选中并禁用检查标记背景 |
MenuText | - 下拉菜单边框 - 复选标记 - 菜单字形 - 下拉菜单文本 - 所选图标边框 |
Scrollbar | - 滚动条和滚动条箭头背景,所有状态 |
窗口 | - 自动隐藏选项卡背景 - 菜单栏和命令架背景 - 打开和临时选项卡的未聚焦或未选择的文档窗口选项卡背景和文档边框 - 未聚焦工具窗口标题栏背景 - 工具窗口选项卡背景,既已选中,又未选中 |
WindowFrame | - IDE 边框 |
WindowText | - 自动隐藏选项卡前台 - 所选工具窗口选项卡前景 - 未对焦的文档窗口选项卡和未对焦或未选中的临时选项卡前台 - 树视图默认前景并将鼠标悬停在未选择的标志符号上 - 工具窗口选定的选项卡边框 - 滚动条拇指背景、边框和字形 |
为最终用户公开颜色
有时,你希望允许最终用户自定义 UI,就像创建代码编辑器或设计图面时一样。 执行此操作的最常见方法是使用 “工具 > 选项 ”对话框。 除非具有需要特殊控件的高度专用 UI,否则呈现自定义的最简单方法是通过对话框“环境”部分中的“字体和颜色”页。 对于公开自定义的每个元素,用户可以选择更改前景色、背景色或两者兼有。
为可自定义颜色生成 VSPackage
VSPackage 可以通过自定义类别控制字体和颜色,并在“字体和颜色”属性页上显示项目。 使用此机制时,VSPackages 必须实现 IVsFontAndColorDefaultsProvider 接口及其关联的接口。
原则上,此机制可用于修改所有现有显示项和包含它们的类别。 但是,它不应用于修改文本编辑器类别或其显示项。 有关“文本编辑器”类别的详细信息,请参阅 “字体和颜色概述”。
若要实现自定义类别或显示项,VSPackage 必须:
在注册表中创建或标识类别。 IDE 的 字体和颜色 属性页的实现使用此信息来正确查询支持给定类别的服务。
在注册表中创建或标识组(可选)。 定义表示两个或多个类别的联合的组可能很有用。 如果定义了组,IDE 会自动合并子类别并分发组中的显示项。
实现 IDE 支持。
处理字体和颜色更改。
创建或标识类别
在类别的非本地化名称下[HKLM\SOFTWARE\Microsoft \Visual Studio\\<Visual Studio version\>\FontAndColors\\<Category\>]
<Category>
构造特殊类型的类别注册表项。
使用两个值填充注册表:
名称 | 类型 | 数据 | 说明 |
---|---|---|---|
类别 | REG_SZ | GUID | 创建用于标识类别的 GUID |
包 | REG_SZ | GUID | 支持类别的 VSPackage 服务的 GUID |
注册表中指定的服务必须为相应类别提供 IVsFontAndColorDefaults 的实现。
创建或标识组
在组的非本地化名称下[HKLM\SOFTWARE\Microsoft \Visual Studio\\<Visual Studio version\>\FontAndColors\\<group\>]
<group>
构造特殊类型的类别注册表项。
使用两个值填充注册表:
名称 | 类型 | 数据 | 说明 |
---|---|---|---|
类别 | REG_SZ | GUID | 创建用于标识类别的 GUID |
包 | REG_SZ | GUID | 支持类别的 VSPackage 服务的 GUID |
注册表中指定的服务必须为相应的组提供实现 IVsFontAndColorGroup 。
IVsFontAndColorGroup
的实现
实现 IDE 支持
实现 GetObject,它返回 IVsFontAndColorDefaults 接口或 IVsFontAndColorGroup IDE 的接口,用于提供的每个类别或组 GUID。
对于它支持的每个类别,VSPackage 实现 IVsFontAndColorDefaults 接口的单独实例。
通过 IVsFontAndColorDefaults 实现的方法必须提供 IDE:
类别中的显示项列表
显示项的可本地化名称
显示类别的每个成员的信息
注意
每个类别必须至少包含一个显示项。
IDE 使用 IVsFontAndColorGroup 接口定义多个类别的联合。
它的实现为 IDE 提供了:
构成给定组的类别列表
访问支持组中每个类别的 IVsFontAndColorDefaults 实例
可本地化的组名称
更新 IDE
IDE 将缓存有关字体和颜色设置的信息。 因此,在对 IDE 字体和颜色配置进行任何修改后,确保缓存是最佳做法。
更新缓存是通过 IvsFontAndColorCacheManager 接口完成的,可以全局或仅对所选项执行。
处理字体和颜色更改
为了正确支持 VSPackage 显示的文本着色,支持 VSPackage 的着色服务必须响应通过“字体和颜色”属性页进行的用户发起的更改。
为此,VSPackage 必须:
通过实现 IVsFontAndColorEvents 接口来处理 IDE 生成的事件。 IDE 在用户修改“字体和颜色”页后调用相应的方法。 例如,如果选择了新字体, 它将调用 OnFontChanged 方法。
或
轮询 IDE 以获取更改。 这可以通过系统实现的 IVsFontAndColor存储 接口来完成。 虽然主要支持持久性, 但 GetItem 方法可以获取显示项的字体和颜色信息。 有关字体和颜色设置的详细信息,请参阅 MSDN 文章:访问存储的字体和颜色设置。
注意
若要确保轮询结果正确,请使用 IVsFontAndColorCacheManager 接口来确定是否需要缓存刷新和更新,然后再调用 IVsFontAndColor存储 接口的检索方法。
注册自定义字体和颜色类别而不实现接口
下面的代码示例演示如何在不实现接口的情况下注册自定义字体和颜色类别:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\8.0Exp\FontAndColors\CSharp Tool Window]
"Package"="{F5E7E71D-1401-11D1-883B-0000F87579D2}"
"Category"="{9FF46859-A47E-47bf-8AC5-EC3DBE69D1FE}"
"ToolWindowPackage"="{7259e420-6241-4e0d-b535-5b820671d183}"
"NameID"=dword:00000064
对于此代码示例:
"NameID"
= 包中本地化类别名称的资源 ID"ToolWindowPackage"
= 包 GUID"Category"="{9FF46859-A47E-47bf-8AC5-EC3DBE69D1FE}"
只是一个示例,实际值可以是实现者提供的新 GUID。
设置 Font 和 Color 属性类别 GUID
下面的代码示例演示如何设置类别 GUID。
// m_pView is your IVsTextView
IVsTextEditorPropertyCategoryContainer spPropCatContainer =
(IVsTextEditorPropertyCategoryContainer)m_pView;
if (spPropCatContainer != null)
{
IVsTextEditorPropertyContainer spPropContainer;
Guid GUID_EditPropCategory_View_MasterSettings =
new Guid("{D1756E7C-B7FD-49a8-B48E-87B14A55655A}");
hr = spPropCatContainer.GetPropertyCategory(
ref GUID_EditPropCategory_View_MasterSettings,
out spPropContainer);
if(hr == 0)
{
hr =
spPropContainer.SetProperty(
VSEDITPROPID.VSEDITPROPID_ViewGeneral_FontCategory,
catGUID);
hr =
spPropContainer.SetProperty(
VSEDITPROPID.VSEDITPROPID_ViewGeneral_ColorCategory,
catGUID);
}
}