继上一篇VSPackge插件系列简单介绍如何正确的获取DTE之后,就一直没发VSPackge插件系列的文章了,最近同事也想了解如何在代码中与VS交互,特发一篇文章示例一些简单功能是如何调用,也以备以后查阅之用。

  为了方便的调用vs的提供的服务,我这里写了一个类对vs的一些常用功能进行封装了,像什么当前选择项,当前编辑器,当前窗口,输出窗口的调用等等。还有解决方案里的选择改变事件的监听等等,更多功能还待挖掘中。

    public class Ide
{ private Ide()
{
_dte2 = (DTE2)ServiceProvider.GlobalProvider.GetService(typeof(DTE));
_dte2.Events.SelectionEvents.OnChange += new _dispSelectionEvents_OnChangeEventHandler(SelectionEvents_OnChange);
} #region Singlton private static Ide _Ide = new Ide(); public static Ide Instance
{
get
{
return _Ide;
}
}
#endregion #region Propertys private DTE2 _dte2 = null; public DTE2 DTE2
{
get
{
return _dte2;
}
} public Window ActiveWindow
{
get
{
CheckDTE();
return _dte2.ActiveWindow;
}
} public Document ActiveDocument
{
get
{
CheckDTE();
return _dte2.ActiveDocument;
}
} public IEnumerable<Project> ActiveProjects
{
get
{
CheckDTE();
Array prjs = (Array)_dte2.ActiveSolutionProjects;
foreach (var prj in prjs)
{
yield return prj as Project;
} }
} public Project SelectedProject
{
get
{
if (ActiveProjects.Count() > )
{
throw new Exception("Project is Multi-Selection");
}
return ActiveProjects.FirstOrDefault();
}
} public ToolWindows ToolWindows
{
get
{
CheckDTE();
return _dte2.ToolWindows;
}
} /// <summary>
/// 解决方案管理器中显示层次结构树数据的项
/// </summary>
public IEnumerable<UIHierarchyItem> ExplorerSelectedItems
{
get
{
CheckDTE();
Array selectedItems = (Array)_dte2.ToolWindows.SolutionExplorer.SelectedItems;
foreach (var item in selectedItems)
{
yield return item as UIHierarchyItem;
} }
} /// <summary>
/// 返回选择的工程或工程中的项
/// </summary>
public IEnumerable<SelectedItem> SelectedItems
{
get
{
CheckDTE();
SelectedItems selectedItems = _dte2.SelectedItems;
foreach (var item in selectedItems)
{
yield return item as SelectedItem;
} }
} public StatusBar StatusBar
{
get
{
CheckDTE();
return _dte2.StatusBar;
}
} public OutputWindowPane OutputWindow
{
get
{
var outpanes = ToolWindows.OutputWindow.OutputWindowPanes;
foreach (OutputWindowPane pane in outpanes)
{
if (pane.Name.Equals("GLIde"))
{
return pane;
}
}
return ToolWindows.OutputWindow.OutputWindowPanes.Add("GLIde");
}
} public ErrorList ErrorWindow
{
get
{
return ToolWindows.ErrorList;
}
} private void CheckDTE()
{
if (_dte2 == null)
{
throw new Exception("DTE service not found");
}
}
#endregion #region Events public event Action<object, EventArgs> SelectionChanged; void SelectionEvents_OnChange()
{
if (SelectionChanged != null)
{
SelectionChanged(this, new EventArgs());
}
} #endregion } public static class Extentions
{
public static void WriteLine(this OutputWindowPane outputPane, string context)
{
outputPane.OutputString(context + Environment.NewLine);
}
}

这其中也参考了一篇比较旧的文章,看来研究VS的人不是甚多,不知道是何原因,还是各位大侠私藏了自己的技术。

http://www.cnblogs.com/dragon/archive/2005/04/01/130204.html

以下是调用示例代码,状态栏的文本提示,处理动画,获取选中项名称,获取当前选中工程,当前激活窗口等等。

        private void button1_Click(object sender, RoutedEventArgs e)
{
Ide.Instance.StatusBar.Progress(true, "doing something", , );
Ide.Instance.StatusBar.Animate(true, vsStatusAnimation.vsStatusAnimationDeploy);
//Ide.Instance.StatusBar.Progress(false); tbDisplay.Text += "SelectedItems:" + Environment.NewLine;
foreach (var item in Ide.Instance.SelectedItems)
{
tbDisplay.Text += item.Name + Environment.NewLine;
} tbDisplay.Text += "ExplorerSelectedItems:" + Environment.NewLine;
foreach (var item in Ide.Instance.ExplorerSelectedItems)
{
tbDisplay.Text += item.Name + Environment.NewLine;
} tbDisplay.Text += "ActiveProjects:" + Environment.NewLine;
foreach (var item in Ide.Instance.ActiveProjects)
{
tbDisplay.Text += item.Name + Environment.NewLine;
} tbDisplay.Text += "ActiveWindow:" + Environment.NewLine;
tbDisplay.Text += Ide.Instance.ActiveWindow.Caption + Environment.NewLine; //tbDisplay.Text += "ActiveDocument:" + Environment.NewLine;
//tbDisplay.Text += Ide.Instance.ActiveDocument.Name + Environment.NewLine; //tbDisplay.Text += "SelectedProject:" + Environment.NewLine;
//tbDisplay.Text += Ide.Instance.SelectedProject.Name + Environment.NewLine; Ide.Instance.OutputWindow.WriteLine("Hello world!"); }

效果截图

欢迎各位提供更多的使用心得,共同进步!

VSPackge插件系列:常用IDE功能的封装的更多相关文章

  1. VSPackge插件系列:简单文本编辑器的实现

    相比其它开发环境,VS的好用就不用多说了,尽管VS很人性化,但是针对具体的我们想实现的功能时,会力不从心,也许会有很多现成的插件,但是作为一名程序员,我还是喜欢自己去写一些东西,因为这样能随心所欲的想 ...

  2. VSPackge插件系列:如何正确获取DTE

    做VS插件开发,不得不了解DTE,有了DTE我们就可以与VS交互了,比如说获取当前选择的文件,比如说获取当前主窗口,比如说获取编译器等等,关于DTE接口更多的说明我把接口地址贴出来方便大家查阅. ht ...

  3. javascript功能插件大集合 前端常用插件 js常用插件

    转载来源:https://github.com/jobbole/aw... 包管理器管理着 javascript 库,并提供读取和打包它们的工具.•npm – npm 是 javascript 的包管 ...

  4. [Unity3D插件]2dToolKit系列三 碰撞检测功能的实现以及障碍物的随机摆放

    貌似有一段时间没更新2dtoolkit系列了,这段时间一直在忙着其他事情,今天开始继续这个插件系列的教程,网上搜索,貌似关于这个插件的教程无非还是跟官方的教程很类似,有的甚至都没有自己照着亲手实践一遍 ...

  5. Impala系列: Impala常用的功能函数

    --=======================查看内置的函数--=======================hive 不需要进入什么内置数据库, 即可使用 show functions 命令列出 ...

  6. IntelliJ IDEA插件系列

    参考: IntelliJ IDEA插件系列 1. activate-power-mode 和 Power mode II 根据Atom的插件activate-power-mode的效果移植到IDEA上 ...

  7. 使用 PySide2 开发 Maya 插件系列二:继承 uic 转换出来的 py 文件中的类 Ui_Form

    使用 PySide2 开发 Maya 插件系列二:继承 uic 转换出来的 py 文件中的类 Ui_Form 开发环境: Wing IDE 6.1 步骤1: 打开 Wing IDE,创建一个新的 pr ...

  8. C#进阶系列——一步一步封装自己的HtmlHelper组件:BootstrapHelper(三:附源码)

    前言:之前的两篇封装了一些基础的表单组件,这篇继续来封装几个基于bootstrap的其他组件.和上篇不同的是,这篇的有几个组件需要某些js文件的支持. 本文原创地址:http://www.cnblog ...

  9. C#进阶系列——一步一步封装自己的HtmlHelper组件:BootstrapHelper

    前言:之前学习过很多的Bootstrap组件,博主就在脑海里构思:是否可以封装一套自己Bootstrap组件库呢.再加上看到MVC的Razor语法里面直接通过后台方法输出前端控件的方式,于是打算仿照H ...

随机推荐

  1. unity3d实现序列帧动画

    首先准备一个序列帧图片如下的AngryBird: 场景中随便创建一个物体,这里以Cube为例 将图片拖放到Cube上,这样会在Cube的6各面都有3个bird,为了美观显示一个鸟,我们调整材质的Til ...

  2. Xcode中Info.plist文件各个键的作用说明【搜藏】

    Localiztion native development region --- CFBundleDevelopmentRegion 本地化相关,如果⽤户所在地没有相应的语言资源,则用这个key的v ...

  3. (二)GameMaker:Studio ——使用等高图生成3D地形

    上一篇,我们讲解了GM中导入模型的方法,这节我们来讲地形. 源文件地址:http://pan.baidu.com/share/link?shareid=685772423&uk=2466343 ...

  4. 关于photoshop钢笔工具中各点对应到“贝塞尔曲线”中的含义(cocos2d-x与iOS)

    1.程序中贝塞尔曲线的简单介绍,只介绍曲线部分.程序中的贝塞尔曲线需要四个点:起始点(startPoint) ,控制点1(controlPoint1),控制点2(controlPoint2),结束点( ...

  5. 《Oracle Database 12c DBA指南》第二章 - 安装Oracle和创建数据库(2.2 安装数据库软件)

    当前关于12c的中文资料比较少,本人将关于DBA的一部分官方文档翻译为中文,很多地方为了帮助中国网友看懂文章,没有按照原文句式翻译,翻译不足之处难免,望多多指正. 2.2 安装数据库软件 这部分简短讲 ...

  6. “Clean Code” 读书笔记序

    最近开始研读 Robert C.Martin 的 “Clean Code”,为了巩固学习,会把每一章的笔记整理到博客中.而这篇博文作为一个索引和总结,会陆续加入各章的笔记链接,以及全部读完后的心得体会 ...

  7. C++ 我想这样用(一)

    虽然还是菜鸟,但我是一个地地道道的c程序员,甚至一度很讨厌C++(虽然现在也是). 为了在不用C++的情况下学习和使用面向对象而长期奔走,曾经用过一年的Python,后终放弃.之后很长一段时间里摆弄O ...

  8. cocos2d-x 技能冷却特效

    转自:http://blog.csdn.net/qiurisuixiang/article/details/8779540 1 在CSDN上看到某同学实现的Dota技能冷却效果,自己平时也玩Dota, ...

  9. oracle查找重复记录

    SELECT *FROM t_info aWHERE ((SELECT COUNT(*)          FROM t_info          WHERE Title = a.Title) &g ...

  10. Session笔记

    一.Session机制 session机制採用的是在server端保持 HTTP 状态信息的方案 . server使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息. 当程序须要为某个cli ...