VSPackge插件系列:常用IDE功能的封装
2013-07-26 20:49
489 查看
继上一篇VSPackge插件系列简单介绍如何正确的获取DTE之后,就一直没发VSPackge插件系列的文章了,最近同事也想了解如何在代码中与VS交互,特发一篇文章示例一些简单功能是如何调用,也以备以后查阅之用。
为了方便的调用vs的提供的服务,我这里写了一个类对vs的一些常用功能进行封装了,像什么当前选择项,当前编辑器,当前窗口,输出窗口的调用等等。还有解决方案里的选择改变事件的监听等等,更多功能还待挖掘中。
http://www.cnblogs.com/dragon/archive/2005/04/01/130204.html
以下是调用示例代码,状态栏的文本提示,处理动画,获取选中项名称,获取当前选中工程,当前激活窗口等等。
欢迎各位提供更多的使用心得,共同进步!
为了方便的调用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() > 1) { 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", 90, 100); 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功能的封装
- Vs .Net IDE 实用功能及常用快捷键
- Android地图应用新视界--mapbox的常用功能封装工具类
- Jquery系列(七) 常用插件
- 插件功能Android Studio vs eclipse
- VSCode常用插件
- Eclipse中Maven插件部分常用功能命令介绍
- 在JSP中用bean封装常用的功能
- 共享两个做项目最常用功能操作的封装类 (zhuan)
- vscode常用插件
- 【原】C++与C#对常用数据结构封装的对比(STL vs System.Collections.Generic)
- SQL Prompt:SQL智能提示功能的SQL Server和VS插件
- iOS通用库--常用功能二之下拉选择框的封装
- WorldWind学习系列十六:3D Cross Section插件功能分析——TerrainViewer
- Visual Studio 2010 操作技巧系列:常用功能心得笔记
- VC++6.0 VS 插件系列(绝对经典)
- C++与C#对常用数据结构封装的对比(STL vs System.Collections.Generic)
- maven常用插件功能
- (九)ReactNative IDE VSCode插件
- [封装插件]鼠标拖动元素跟随功能