2017-12-23 2 views
0

내 Visual Studio 확장 (VSIX)은 Ook 언어 예제 (here)에서 파생됩니다. 기본적으로 사용자가 구성한 색상을로드하는 loadSavedColor 기능을 가진 다음 ClassificationFormatDefinition이 있습니다. 모든 것이 잘 작동합니다.ClassificationFormatDefinition을 변경하는 방법

[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")] 내부의 정적 ClassificationTypeDefinition ookExclamation = NULL;

답변

1

코드를 통해 선별 한 후 몇 시간 씩 작동하는 것을 만들 수있었습니다. 다음 메소드 UpdateFontcolorKeyName과 같으며 "some_unique_name"과 같습니다. 나는 그것이 누군가에게 유용하기를 바란다.

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 
:

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(); 
} 

새로운 색상을 설정 한 후, 다음과 같은 코드로 캐시를 삭제해야합니다