Visual Studio 2008中如何进行Solution Explorer的扩展性操作?

2026-05-25 08:021阅读0评论SEO资讯
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1804个文字,预计阅读时间需要8分钟。

Visual Studio 2008中如何进行Solution Explorer的扩展性操作?

前言:在可扩展性开发(五)中,我介绍了对Solution、Project和ProjectItem的基本操作。它们面向的是解决方案内容(文件)的物理表示。我们需要使用VS提供的解决方案管理器。

前言

在可扩展性开发(五)中,我介绍了对于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:获取或设置所表示的节点是否已展开;

Visual Studio 2008中如何进行Solution Explorer的扩展性操作?

Parent:节点集合的父节点;

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

更多信息请参看MSDN。

3)UIHierarchyItem

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

Name:节点对象的名称;

Select():选中节点;

更多信息请参看MSDN。

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

CollapseAllProjects示例

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

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

0)添加命令

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

C# Code - 添加CollapseAllProjects命令
OnConnection()
{

//Get"SolutionExplorer"commandbar
CommandBarslnCommandBar=GetCommandBarByName("Solution");
//Addanewcommand
AddNamedCommand2(slnCommandBar,COLLAPSE_ALL_PROJECTS_COMMAND_NAME,
"CollapseAllProjects","CollapseAllProjects",false,0,slnCommandBar.Controls.Count+1);
}

QueryStatus()
{

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

Exec()
{

elseif(commandName==GetCommandFullName(COLLAPSE_ALL_PROJECTS_COMMAND_NAME))
{
CollapseAllProjects();

handled=true;
return;
}
}


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

1)找到所有项目节点

C# Code - 查找所有的项目节点
///<summary>
///解决方案管理器根节点
///</summary>
protectedUIHierarchySolutionExplorerNode
{
get
{
return_applicationObject.ToolWindows.SolutionExplorer;
}
}

///<summary>
///获取指定解决方案内的项目节点
///</summary>
publicList<UIHierarchyItem>GetProjectNodes(Solutionsolution)
{
stringsolutionName=solution.Properties.Item("Name").Value.ToString();
returnGetProjectNodes(SolutionExplorerNode.GetItem(solutionName).UIHierarchyItems);
}

///<summary>
///循环解决方案的顶级节点以获取所有的项目节点
///</summary>
publicList<UIHierarchyItem>GetProjectNodes(UIHierarchyItemstopLevelItems)
{
List<UIHierarchyItem>projects=newList<UIHierarchyItem>();
foreach(UIHierarchyItemitemintopLevelItems)
{
if(IsProjectNode(item))
{
projects.Add(item);
}
elseif(IsSolutionFolder(item))
{
projects.AddRange(GetProjectNodesInSolutionFolder(item));
}
}

returnprojects;
}

///<summary>
///获取解决方案文件夹内的项目节点
///</summary>
privateList<UIHierarchyItem>GetProjectNodesInSolutionFolder(UIHierarchyItemitem)
{
List<UIHierarchyItem>projects=newList<UIHierarchyItem>();

if(IsSolutionFolder(item))
{
foreach(UIHierarchyItemsubIteminitem.UIHierarchyItems)
{
if(IsProjectNode(subItem))
{
projects.Add(subItem);
}
}
}

returnprojects;
}

///<summary>
///判断节点是否为解决方案文件夹
///</summary>
privateboolIsSolutionFolder(UIHierarchyItemitem)
{
return((item.ObjectisProject)&&
((item.ObjectasProject).Kind==ProjectKinds.vsProjectKindSolutionFolder));
}

///<summary>
///判断节点是否为项目(可能是顶级节点,也可能在解决方案文件夹中)
///</summary>
privateboolIsProjectNode(UIHierarchyItemitem)
{
returnIsDirectProjectNode(item)||IsProjectNodeInSolutionFolder(item);
}

///<summary>
///判断节点是否为顶级的项目
///</summary>
privateboolIsDirectProjectNode(UIHierarchyItemitem)
{
return((item.ObjectisProject)&&((item.ObjectasProject).Kind!=ProjectKinds.vsProjectKindSolutionFolder));
}

///<summary>
///判断节点是否为包含在解决方案文件夹中的项目
///</summary>
privateboolIsProjectNodeInSolutionFolder(UIHierarchyItemitem)
{
return(item.ObjectisProjectItem&&((ProjectItem)item.Object).ObjectisProject&&
((Project)((ProjectItem)item.Object).Object).Kind!=ProjectKinds.vsProjectKindSolutionFolder);
}

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

2)折叠所有项目节点

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

privatevoidCollapseProject(UIHierarchyItemproject)
{
if(project.UIHierarchyItems.Expanded)
{
if(IsDirectProjectNode(project))
{
project.UIHierarchyItems.Expanded=false;
}
elseif(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

本文共计1804个文字,预计阅读时间需要8分钟。

Visual Studio 2008中如何进行Solution Explorer的扩展性操作?

前言:在可扩展性开发(五)中,我介绍了对Solution、Project和ProjectItem的基本操作。它们面向的是解决方案内容(文件)的物理表示。我们需要使用VS提供的解决方案管理器。

前言

在可扩展性开发(五)中,我介绍了对于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:获取或设置所表示的节点是否已展开;

Visual Studio 2008中如何进行Solution Explorer的扩展性操作?

Parent:节点集合的父节点;

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

更多信息请参看MSDN。

3)UIHierarchyItem

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

Name:节点对象的名称;

Select():选中节点;

更多信息请参看MSDN。

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

CollapseAllProjects示例

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

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

0)添加命令

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

C# Code - 添加CollapseAllProjects命令
OnConnection()
{

//Get"SolutionExplorer"commandbar
CommandBarslnCommandBar=GetCommandBarByName("Solution");
//Addanewcommand
AddNamedCommand2(slnCommandBar,COLLAPSE_ALL_PROJECTS_COMMAND_NAME,
"CollapseAllProjects","CollapseAllProjects",false,0,slnCommandBar.Controls.Count+1);
}

QueryStatus()
{

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

Exec()
{

elseif(commandName==GetCommandFullName(COLLAPSE_ALL_PROJECTS_COMMAND_NAME))
{
CollapseAllProjects();

handled=true;
return;
}
}


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

1)找到所有项目节点

C# Code - 查找所有的项目节点
///<summary>
///解决方案管理器根节点
///</summary>
protectedUIHierarchySolutionExplorerNode
{
get
{
return_applicationObject.ToolWindows.SolutionExplorer;
}
}

///<summary>
///获取指定解决方案内的项目节点
///</summary>
publicList<UIHierarchyItem>GetProjectNodes(Solutionsolution)
{
stringsolutionName=solution.Properties.Item("Name").Value.ToString();
returnGetProjectNodes(SolutionExplorerNode.GetItem(solutionName).UIHierarchyItems);
}

///<summary>
///循环解决方案的顶级节点以获取所有的项目节点
///</summary>
publicList<UIHierarchyItem>GetProjectNodes(UIHierarchyItemstopLevelItems)
{
List<UIHierarchyItem>projects=newList<UIHierarchyItem>();
foreach(UIHierarchyItemitemintopLevelItems)
{
if(IsProjectNode(item))
{
projects.Add(item);
}
elseif(IsSolutionFolder(item))
{
projects.AddRange(GetProjectNodesInSolutionFolder(item));
}
}

returnprojects;
}

///<summary>
///获取解决方案文件夹内的项目节点
///</summary>
privateList<UIHierarchyItem>GetProjectNodesInSolutionFolder(UIHierarchyItemitem)
{
List<UIHierarchyItem>projects=newList<UIHierarchyItem>();

if(IsSolutionFolder(item))
{
foreach(UIHierarchyItemsubIteminitem.UIHierarchyItems)
{
if(IsProjectNode(subItem))
{
projects.Add(subItem);
}
}
}

returnprojects;
}

///<summary>
///判断节点是否为解决方案文件夹
///</summary>
privateboolIsSolutionFolder(UIHierarchyItemitem)
{
return((item.ObjectisProject)&&
((item.ObjectasProject).Kind==ProjectKinds.vsProjectKindSolutionFolder));
}

///<summary>
///判断节点是否为项目(可能是顶级节点,也可能在解决方案文件夹中)
///</summary>
privateboolIsProjectNode(UIHierarchyItemitem)
{
returnIsDirectProjectNode(item)||IsProjectNodeInSolutionFolder(item);
}

///<summary>
///判断节点是否为顶级的项目
///</summary>
privateboolIsDirectProjectNode(UIHierarchyItemitem)
{
return((item.ObjectisProject)&&((item.ObjectasProject).Kind!=ProjectKinds.vsProjectKindSolutionFolder));
}

///<summary>
///判断节点是否为包含在解决方案文件夹中的项目
///</summary>
privateboolIsProjectNodeInSolutionFolder(UIHierarchyItemitem)
{
return(item.ObjectisProjectItem&&((ProjectItem)item.Object).ObjectisProject&&
((Project)((ProjectItem)item.Object).Object).Kind!=ProjectKinds.vsProjectKindSolutionFolder);
}

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

2)折叠所有项目节点

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

privatevoidCollapseProject(UIHierarchyItemproject)
{
if(project.UIHierarchyItems.Expanded)
{
if(IsDirectProjectNode(project))
{
project.UIHierarchyItems.Expanded=false;
}
elseif(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