如何更改ClassificationFormatDefinition

时间:2017-12-23 21:35:00

标签: c# visual-studio vsix

我的Visual Studio扩展(VSIX)派生自Ook语言示例(找到here)。基本上,我有以下ClassificationFormatDefinition函数loadSavedColor加载用户配置的颜色。一切正常。

[Name("some_unique_name")]
internal sealed class OokE : ClassificationFormatDefinition
{
    public OokE()
    {
        DisplayName = "ook!"; //human readable version of the name
        ForegroundColor = loadSavedColor();
    }
}

问题:在用户配置了新颜色后,我希望使类OokE的现有实例无效,或者更改现有实例并设置ForegroundColor。但无论我做什么,语法颜色都不会更新。

我试过了:

  1. 获取对课程OokE的引用并更新ForegroundColor
  2. 使相应的ClassificationTypeDefinition

    无效

    [导出(typeof运算(ClassificationTypeDefinition))] [名称("!OOK&#34)] 内部静态ClassificationTypeDefinition ookExclamation = null;

1 个答案:

答案 0 :(得分:1)

通过代码筛选数小时后,我可以创建一些有效的东西。使用UpdateFont调用的以下方法colorKeyName等于“some_unique_name”可以解决问题。我希望它对某人有用。

private void UpdateFont(string colorKeyName, Color c)
{
    var guid2 = Guid.Parse("{A27B4E24-A735-4d1d-B8E7-9716E1E3D8E0}");
    var flags = __FCSTORAGEFLAGS.FCSF_LOADDEFAULTS | __FCSTORAGEFLAGS.FCSF_PROPAGATECHANGES;
    var store = GetService(typeof(SVsFontAndColorStorage)) as IVsFontAndColorStorage;

    if (store.OpenCategory(ref guid2, (uint)flags) != VSConstants.S_OK) return;
    store.SetItem(colorKeyName, new[]{ new ColorableItemInfo
        {
            bForegroundValid = 1,
            crForeground = (uint)ColorTranslator.ToWin32(c)
        }});
    store.CloseCategory();
}

设置新颜色后,您需要使用以下代码清除缓存:

IVsFontAndColorCacheManager cacheManager = this.GetService(typeof(SVsFontAndColorCacheManager)) as IVsFontAndColorCacheManager;
cacheManager.ClearAllCaches();
var guid = new Guid("00000000-0000-0000-0000-000000000000");
cacheManager.RefreshCache(ref guid);
guid = new Guid("{A27B4E24-A735-4d1d-B8E7-9716E1E3D8E0}"); // Text editor category