5

私はVS 2017のプロジェクトシステムエクステンションを書いています。自分の言語の各プロジェクトには、「スタートアップファイル」というファイルが1つあります。そのファイルをソリューションエクスプローラで太字で表示します。VS 2017カスタムプロジェクトシステムでは、ソリューションエクスプローラでプロジェクト項目を太字にするにはどうすればよいですか?

Python Tools for VS私の探しているものですが、拡張機能は新しいプロジェクトシステムフレームワーク(CPS)上に構築されています。ソリューションエクスプローラのアイテムの外観を変更するCPSの方法はIProjectTreePropertiesProviderですが、テキストスタイルを変更する方法はありません。アイコンのみです。

答えて

4

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); 
    } 
} 
関連する問題