在VS 2017自定义项目系统中,如何在解决方案资源管理器中使项目项目变为粗体?

问题描述:

我正在为VS 2017编写一个项目系统扩展,并且我的语言中的每个项目都有一个文件,即“启动文件”。我希望该文件在解决方案资源管理器中以粗体显示。在VS 2017自定义项目系统中,如何在解决方案资源管理器中使项目项目变为粗体?

Python Tools for VS做我在找什么,但我的扩展是建立在新的项目系统框架(CPS)上。改变解决方案资源管理器项目外观的CPS方法是实现IProjectTreePropertiesProvider,但我没有看到任何方式来改变它的文本样式 - 只有图标。

我不确定CPS对此有任何内建功能,但您仍然可以使用“旧”本机/托管Visual Studio界面的组合。这是一个使用IProjectTreePropertiesProvider的示例:

[Export(typeof(IProjectTreePropertiesProvider))] 
[AppliesTo(MyUnconfiguredProject.UniqueCapability)] 
[Order(1000)] 
internal class ProjectTreePropertiesProvider1 : IProjectTreePropertiesProvider 
{ 
    // we need to import that to do COM calls 
    [Import] 
    protected IProjectThreadingService ThreadingService { get; set; } 

    // we want the "old" IVsHierarchy interface 
    [ImportMany(ExportContractNames.VsTypes.IVsHierarchy)] 
    private OrderPrecedenceImportCollection<IVsHierarchy> IVsHierarchies { get; } 
    private IVsHierarchy VsHierarchy => IVsHierarchies.First().Value; 

    [ImportingConstructor] 
    public ProjectTreePropertiesProvider1(UnconfiguredProject unconfiguredProject) 
    { 
     IVsHierarchies = new OrderPrecedenceImportCollection<IVsHierarchy>(projectCapabilityCheckProvider: unconfiguredProject); 
    } 

    /// <summary> 
    /// Calculates new property values for each node in the project tree. 
    /// </summary> 
    /// <param name="propertyContext">Context information that can be used for the calculation.</param> 
    /// <param name="propertyValues">Values calculated so far for the current node by lower priority tree properties providers.</param> 
    public async void CalculatePropertyValues(IProjectTreeCustomizablePropertyContext propertyContext, IProjectTreeCustomizablePropertyValues propertyValues) 
    { 
     // this is from the standard WindowsScript project type sample 
     if (propertyValues.Flags.Contains(ProjectTreeFlags.Common.ProjectRoot)) 
     { 
      // etc.. 
      propertyValues.Icon = KnownMonikers.JSProjectNode.ToProjectSystemType(); 
      // etc.. 
     } 

     // now, we're doing some COM calls, ensure it happens on UI thread 
     await ThreadingService.SwitchToUIThread(); 

     // get the id of some item (this "Start.js" item is from the standard sample) 
     VsHierarchy.ParseCanonicalName("Start.js", out uint id); 

     // get IVsUIShell from service provider 
     VsHierarchy.GetSite(out Microsoft.VisualStudio.OLE.Interop.IServiceProvider sp); 
     var shell = (IVsUIShell)sp.QueryService<IVsUIShell>(); 

     // get solution explorer's window 
     var SolutionExplorer = new Guid(ToolWindowGuids80.SolutionExplorer); 
     shell.FindToolWindow(0, ref SolutionExplorer, out IVsWindowFrame frame); 

     // get solution explorer's DocView 
     frame.GetProperty((int)__VSFPROPID.VSFPROPID_DocView, out object obj); 
     var window = (IVsUIHierarchyWindow2)obj; 

     // change attribute of the item 
     window.SetItemAttribute((IVsUIHierarchy)VsHierarchy, id, (uint)__VSHIERITEMATTRIBUTE.VSHIERITEMATTRIBUTE_Bold, true); 
    } 
}