• 艾伟:Visual Studio 2008 可扩展性开发(六):操作Solution Explorer 狼人:


    前言

    可扩展性开发(五)中,我介绍了对于Solution、Project、ProjectItem的基本操作。可以认为它们面向的是解决方案内容的物理(文件)表示,我们需要使用VS提供的解决方案管理器(Solution Explorer)来管理它们。毫无疑问,解决方案管理器是VS中最重要的UI元素之一,本文将介绍对它的操作。

    工具窗口内的层次结构

    如果你观察一下解决方案管理器和服务器管理器(Server Explorer),就会发现它们都使用树形结构来表现背后的数据。在AOM中,UIHierarchyUIHierarchyItemsUIHierarchyItem用于表示这样的层次结构。UIHierarchy表示根节点,它的UIHierarchyItems集合表示其所包含的第一级子节点(UIHierarchyItem),每一个UIHierarchyItem同时也有UIHierarchyItems属性,如此递归下去。这种结构很像它们所表示的数据:Solution、Project以及ProjectItem。在使用这些对象之前,先大致了解一下它们的主要成员:

    1)UIHierarchy

    Parent:节点对象的父节点;

    SelectedItems:当前节点选中的子节点集合;

    UIHierarchyItems:当前节点的子节点集合;

    DoDefaultAction():对节点进行默认操作,类似于进行双击或按下回车键;

    GetItem():按指定路径返回一个子节点;

    SelectDown():选中当前选中节点的下个节点;

    SelectUp():选中当前选中节点的上个节点;

    更多信息请参看MSDN

    2)UIHierarchyItems集合

    Expanded:获取或设置所表示的节点是否已展开;

    Parent:节点集合的父节点;

    Item():返回集合中的一项;

    更多信息请参看MSDN

    3)UIHierarchyItem

    IsSelected:获取节点是否被选中;

    Name:节点对象的名称;

    Select():选中节点;

    更多信息请参看MSDN

    有了这些知识,我们现在有能力去探索对解决方案管理器的操作了。

    CollapseAllProjects示例

    项目刚开始的时候,项目的数量也许还不太多,随着程序规模的增大,项目数量也会不断增加,这时要找到某个项目或者某个文件,就变得越来越麻烦,你得先把大量的项目折叠起来。如果有一个命令,可以快速地折叠起所有项目,就方便多了:

    collapse-all-projects-menu

    这里的思路很简单,只要找到所有的项目节点,依次查看每个项目,如果项目展开了,就把它折叠起来。

    0)添加命令

    之前我们曾添加过CloseAllDocuments和NPetshopSlnGenerator命令(见可扩展性开发),它们分别加在文本编辑器的标签和Tools菜单上,这里的过程没什么不同:

    C# Code - 添加CollapseAllProjects命令
    OnConnection()
    {
        
        
    // Get "Solution Explorer" command bar
        CommandBar slnCommandBar = GetCommandBarByName("Solution");
        
    // Add a new command
        AddNamedCommand2(slnCommandBar, COLLAPSE_ALL_PROJECTS_COMMAND_NAME,
            
    "Collapse All Projects""Collapse All Projects"false0, slnCommandBar.Controls.Count + 1);
    }

    QueryStatus()
    {
        
        
    else if (commandName == GetCommandFullName(COLLAPSE_ALL_PROJECTS_COMMAND_NAME))
        {
            status 
    = (vsCommandStatus)vsCommandStatus.vsCommandStatusSupported | vsCommandStatus.vsCommandStatusEnabled;
            
    return;
        }
    }

    Exec()
    {
        
        
    else if (commandName == GetCommandFullName(COLLAPSE_ALL_PROJECTS_COMMAND_NAME))
        {
            CollapseAllProjects();

            handled 
    = true;
            
    return;
        }
    }


    这里通过“Solution”找到解决方案节点的上下文菜单。

    1)找到所有项目节点

    C# Code - 查找所有的项目节点

    也许比预想的要复杂些,主要的原因是解决方案文件夹的存在,解决方案文件夹本身也被看作Project对象,同时它又可以包含其它真正的项目,所以在查找项目的时候要分两种情况。先查找解决方案下面的项目,然后再查找解决方案文件夹下面的项目。

    2)折叠所有项目节点

    C# Code - 折叠所有项目节点
    private void CollapseAllProjects()
    {
        Solution sln 
    = _applicationObject.Solution;
        List
    <UIHierarchyItem> projects = GetProjectNodes(sln);
        
    foreach (UIHierarchyItem item in projects)
        {
            CollapseProject(item);
        }
    }

    private void CollapseProject(UIHierarchyItem project)
    {
        
    if (project.UIHierarchyItems.Expanded)
        {
            
    if (IsDirectProjectNode(project))
            {
                project.UIHierarchyItems.Expanded 
    = false;
            }
            
    else if (IsProjectNodeInSolutionFolder(project))
            {
                project.Select(vsUISelectionType.vsUISelectionTypeSelect);
                SolutionExplorerNode.DoDefaultAction();
            }
        }
    }


    这里就简单了,对于每个项目,通过Expanded属性判断它是否已展开,如果是的话将其折叠起来,此时也要分两种情况进行考虑。

    以后就不用再为那些包含数十个项目的解决方案发愁了:)

    可以从这里下载代码,也可以在这里下载可运行的Add-In(解压缩后将文件放在[My Documents Path]\Visual Studio 2008\Addins下)。

    我们身在何处?

    在解决方案、项目和项之后,本文介绍了对解决方案管理器的操作,现在我们有办法来解决这些方面的问题了。接下来,我将介绍Add-In开发的重头戏——文本编辑器的操作。

    参考

    《Professional Visual Studio® 2008 Extensibility》
    《Working with Microsoft Visual Studio® 2005》
    PowerCommands Project

  • 相关阅读:
    1.3.6 详解build.gradle文件——Android第一行代码(第二版)笔记
    1.3.5 详解项目中的资源——Android第一行代码(第二版)笔记
    1.3.4分析你的第一个Android程序——Android第一行代码(第二版)笔记
    1.3创建你的第一个Android项目——Android第一行代码(第二版)笔记
    1.2搭建开发环境——Android第一行代码(第二版)笔记
    1.1.3 Android应用开发特色——Android第一行代码(第二版)笔记
    函数与方法的区别
    你真的知道敏捷到底是什么吗?
    某个应用的CPU使用率居然达到100%,我该怎么办?
    异常 lock buffer failed for format 0x23
  • 原文地址:https://www.cnblogs.com/waw/p/2156841.html
Copyright © 2020-2023  润新知