VSPackge插件系列:常用IDE功能的封装
2013-07-26 14:45
429 查看
继上一篇VSPackge插件系列简单介绍如何正确的获取DTE之后,就一直没发VSPackge插件系列的文章了,最近同事也想了解如何在代码中与VS交互,特发一篇文章示例一些简单功能是如何调用,也以备以后查阅之用。
为了方便的调用vs的提供的服务,我这里写了一个类对vs的一些常用功能进行封装了,像什么当前选择项,当前编辑器,当前窗口,输出窗口的调用等等。还有解决方案里的选择改变事件的监听等等,更多功能还待挖掘中。
这其中也参考了一篇比较旧的文章,看来研究VS的人不是甚多,不知道是何原因,还是各位大侠私藏了自己的技术。
/article/4776152.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的人不是甚多,不知道是何原因,还是各位大侠私藏了自己的技术。
/article/4776152.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 实用功能及常用快捷键
- 在JSP中用bean封装常用的功能
- 封装一个简单好用的打印Log的工具类And快速开发系列 10个常用工具类
- vscode常用插件
- 封装 RecyclerView, 打造为一个非常实用的开发工具 , 添加一些开发中常用的功能 , 例如下拉刷新, 分页, 自动加载 , 加载错误等等
- 100多个经典常用的PHP功能插件大全实例演示和下载
- jQuery常用的插件及功能汇总-持续
- VS Code 常用插件列表
- 插件功能Android Studio vs eclipse
- VS Code折腾记 - (4) 常用必备插件推荐【前端】
- 安卓常用功能——已封装好
- My97DatePicker日期插件的常用功能说明
- 【狂云歌之unity_vr】开发unity插件——一次搞定unity编辑器常用功能
- SQL Prompt:SQL智能提示功能的SQL Server和VS插件
- (四)ReactNative VSCode IDE开发插件
- Visual Studio 2010 操作技巧系列:常用功能心得笔记
- VSCode 常用快捷键与插件
- C++与C#对常用数据结构封装的对比(STL vs System.Collections.Generic)
- laravel 课程学习系列五----------------第五章 Laravel框架常用功能