【问题标题】:In a VS 2017 custom project system, how can I make a project item bold in the Solution Explorer?在 VS 2017 自定义项目系统中,如何在解决方案资源管理器中将项目项设为粗体?
【发布时间】:2017-07-26 12:37:16
【问题描述】:

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

Python Tools for VS 可以满足我的要求,但我的扩展是建立在新的项目系统框架 (CPS) 之上的。更改解决方案资源管理器项目外观的 CPS 方法是实现 IProjectTreePropertiesProvider,但我看不到任何方法可以用它更改文本样式——只有图标。

【问题讨论】:

    标签: visual-studio visual-studio-2017 vs-extensibility extensibility common-project-system


    【解决方案1】:

    我不确定 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);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-24
      • 1970-01-01
      相关资源
      最近更新 更多