5

Piszę rozszerzenie systemu projektowego dla VS 2017, a każdy projekt w moim języku ma jeden plik, który jest "plikiem startowym". Chcę, aby ten plik był pogrubiony w Eksploratorze rozwiązań.W niestandardowym systemie projektów VS 2017, w jaki sposób można pogrubić projekt w eksploratorze rozwiązań?

Python Tools for VS robi to, czego szukam, ale moje rozszerzenie jest oparte na nowej strukturze systemu projektowego (CPS). Sposób CPS zmiany wyglądu elementów eksploratora rozwiązań polega na implementacji IProjectTreePropertiesProvider, ale nie widzę żadnego sposobu na zmianę stylu tekstu - tylko ikony.

Odpowiedz

4

Nie jestem pewien, czy CPS ma w tym coś wbudowanego, ale nadal można użyć kombinacji "starych" natywnych/zarządzanych interfejsów Visual Studio. Jest to przykład korzystający z usługi 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); 
    } 
}