首先,声明站在出处。
---------------------------------------------------------华丽的分割线----------------------------------------------------------------------------------
原文章标题:VS插件开发,个性化VS-IDE编辑器,瞬间高 大 上
原文章地址:http://www.cnblogs.com/LonelyShadow/p/3964879.html
----------------------------------------------------------我再割-----------------------------------------------------------------------------------------
本人新手一枚,无意之间发现这篇文章所以就花了一下午做了一个像模像样的吧。(其实很简单的好吧)
好了,废话不多说,想看文章。
之前的默认的VS界面:
主题也只有默认的两三个,而且不能自定义添加:
这距离我们的目标,自定义主题、背景、透明等等,感觉貌似相差甚远:
这张是原作的成果展示:(下面也来张我自己的)
这张就是我的啦~~
再来一张看看效果吧
【步骤】
其实,整体步骤非常简单,大家想一下:我们不能直接去设置更改VS的东西,但是VS不是有一个插件的功能么?
那我们能不能自己写一个插件,来设置VS的相关功能,最后实现这个效果呢?答案是:那是必须的。
大概步骤如下:
1.创建VS插件项目,在启动时读取指定图片资源,填充VS的IDE编辑器
2.使用现有插件设置相应模块的透明色
具体步骤如下:
【一、准备工作】
VS提供了一个“Visual Studio Package”项目的模板,我们可以根据这个模板,创建一个VS的插件项目,
以此开发相应的插件。
但是这个项目模板有的Visual Studio安装包中并没有默认附带,需要另行下载。
我使用的是VS2012,自带默认就有,VS2013自测没有,VS2010貌似也有 以前用的记不清了,
如果没有这个模板需要另行下载,其他版本大家自己看看。
“新建项目 - 模板 - 其他项目类型 - Visual Studio Package”:
如果你发现你的VS新建项目中,在模板列表中找不到“Visual Studio Package”,
大家可以去搜索或直接微软官网软件下载找“Visual Studio SDK ****”,****表示你的VS版本,
不同版本的VS,SDK不同。
这里我插一句:我的是VS2013,所以没有自带的,我是自己去网上下的,下面就直接提供微软官方下载链接啦。
下载地址:http://www.microsoft.com/en-us/download/details.aspx?id=40758
下载后,是在线安装程序,大概也就十几M,在线安装的SDK大小也就一百多M,非常快。(安装注意最好关闭VS哦。)
安装成功后,你打开VS,新建项目,就可以看到这个项目模板了。
【二、新建项目】
打开VS - “新建项目 - 其他项目类型 - Visual Studio Package”,项目名称随意,比如我的“Guying.Package.IDEBackground”:
然后确定:
下一步,开发语言选择你的,在这里我当然选择“Visual C#”啦,哈哈,下面的默认就O了:
下一步,输入公司名称、插件名称、版本号、指定Icon图标、插件说明信息:
下一步,什么都别选:
下一步,不要测试项目:
最后点击Finish完成,项目就创建完成了:(如下图)
【三、编写插件代码】
找到项目中插件的.cs文件“****Package.cs”:
这个文件就好比“控制台项目”中的“Program.cs”,对,插件运行时,会启动这个代码文件。
我们只需要在这个文件中,插入修改Visual Studio IDE的代码即可。
起初的“***Package.cs”文件中,去掉注释后,只有如下代码:
using System;
using System.Diagnostics;
using System.Globalization;
using System.Runtime.InteropServices;
using System.ComponentModel.Design;
using Microsoft.Win32;
using Microsoft.VisualStudio;
using Microsoft.VisualStudio.Shell.Interop;
using Microsoft.VisualStudio.OLE.Interop;
using Microsoft.VisualStudio.Shell;
namespace LonelyShadow.Guying_Package_IDEBackground
{
[PackageRegistration(UseManagedResourcesOnly = true)]
[InstalledProductRegistration("#110", "#112", "1.0", IconResourceID = 400)]
[Guid(GuidList.guidGuying_Package_IDEBackgroundPkgString)]
public sealed class Guying_Package_IDEBackgroundPackage : Package
{
public Guying_Package_IDEBackgroundPackage()
{
Debug.WriteLine(string.Format(CultureInfo.CurrentCulture, "Entering constructor for: {0}", this.ToString()));
}
protected override void Initialize()
{
Debug.WriteLine(string.Format(CultureInfo.CurrentCulture, "Entering Initialize() of: {0}", this.ToString()));
base.Initialize();
}
}
}
起始的“****Package.cs”文件的代码
我们可以发现,包含两个函数:一个无参构造和“Initialize()”方法,这个就不用我介绍了吧,大家都懂的。嘿嘿。
在这里,我需要说的是,可能大家细心的已经发现了,你在这个项目中新建窗体,显示的是WPF的应用程序。
是的,不仅仅是Vista系统,Visual Studio也是用WPF来开发UI的。
那我们是不是也可以在这个WPF插件项目中来控制VS呢?哈哈。。
①添加需要的WPF等DLL组件引用:
Microsoft.VisualStudio.CoreUtility.dll
Microsoft.VisualStudio.Text.UI.dll
Microsoft.VisualStudio.Text.UI.Wpf.dll
PresentationCore.dll
PresentationFramework.dll
System.ComponentModel.Composition.dll
System.Xaml.dll
WindowsBase.dll
②然后,我们回到“****Package.cs”文件中,找到“Initialize()”初始化的方法中,为当前启动程序(也就是咱们运行的Visual Studio的实例)的主窗口添加Loaded事件:
protected override void Initialize()
{
Debug.WriteLine(string.Format(CultureInfo.CurrentCulture, "Entering Initialize() of: {0}", this.ToString()));
base.Initialize();
// 为当前启动程序(Visual Studio)的主窗口添加Loaded事件“MainWindow_Loaded”
Application.Current.MainWindow.Loaded += MainWindow_Loaded;
}
为当前启动程序(Visual Studio)的主窗口添加Loaded事件“MainWindow_Loaded”
③ 然后,当然,编写上面添加的这个“MainWindow_Loaded”的方法,读取指定的图片资源,填充到Visual Studio IDE编辑器中:
void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
var rWindow = (Window)sender;
//加载图片
var rImageSource = BitmapFrame.Create(new Uri(@"E:\\孤影\\照片\\桌面\\shut.jpg"/*图片路径*/), BitmapCreateOptions.None, BitmapCacheOption.OnLoad);
rImageSource.Freeze();
var rImageControl = new Image()
{
Source = rImageSource,
Stretch = Stretch.UniformToFill, //按比例填充
HorizontalAlignment = HorizontalAlignment.Center, //水平方向中心对齐
VerticalAlignment = VerticalAlignment.Center, //垂直方向中心对齐
};
Grid.SetRowSpan(rImageControl, 4);
var rRootGrid = (Grid)rWindow.Template.FindName("RootGrid", rWindow);
rRootGrid.Children.Insert(0, rImageControl);
}
读取指定的图片资源,填充到Visual Studio IDE编辑器中
在这一步,你可以自我发挥,比如用上IO流,读取一个配置文件,获取配置数据,动态显示等等。是吧。。。。哈哈。
我再插一句:我不会,我才初学,好多都不懂,有哪位大神有闲情回的,求教啊,大恩不言谢。
(据说可以让程序每隔半小时自己换背景什么之类的,好向往)
④为了方便调试,请在“****Package.cs”文件的类声明上加上如下属性定义:
[ProvideAutoLoad(UIContextGuids.NoSolution)]
[ProvideAutoLoad(UIContextGuids.SolutionExists)]
⑤ 紧接着,新建一个类文件“EditorBackground.cs”,参考代码如下,亲们复制的时候,注意我的命名空间和你的是不是一样的哦:
using Microsoft.VisualStudio.Text.Classification;
using Microsoft.VisualStudio.Text.Editor;
using Microsoft.VisualStudio.Utilities;
using System;
using System.ComponentModel.Composition;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Threading;
namespace LonelyShadow.Guying_Package_IDEBackground
{
[Export(typeof(IWpfTextViewCreationListener))]
[ContentType("Text")]
[ContentType("BuildOutput")]
[TextViewRole(PredefinedTextViewRoles.Document)]
class Listener : IWpfTextViewCreationListener
{
[Import]
IEditorFormatMapService EditorFormatMapService = null;
public void TextViewCreated(IWpfTextView rpTextView)
{
new EditorBackground(rpTextView);
//去掉断点边栏的背景
var rProperties = EditorFormatMapService.GetEditorFormatMap(rpTextView).GetProperties("Indicator Margin");
rProperties["BackgroundColor"] = Colors.Transparent;
rProperties["Background"] = Brushes.Transparent;
}
}
class EditorBackground
{
IWpfTextView r_TextView;
ContentControl r_Control;
Grid r_ParentGrid;
Canvas r_ViewStack;
public EditorBackground(IWpfTextView rpTextView)
{
r_TextView = rpTextView;
r_Control = (ContentControl)r_TextView;
r_TextView.Background = Brushes.Transparent;
r_TextView.BackgroundBrushChanged += TextView_BackgroundBrushChanged;
r_TextView.Closed += TextView_Closed;
r_Control.Loaded += TextView_Loaded;
}
void MakeBackgroundTransparent()
{
r_TextView.Background = Brushes.Transparent;
r_ViewStack.Background = Brushes.Transparent;
r_ParentGrid.ClearValue(Grid.BackgroundProperty);
}
void TextView_Loaded(object sender, RoutedEventArgs e)
{
if (r_ParentGrid == null)
r_ParentGrid = (Grid)r_Control.Parent;
if (r_ViewStack == null)
r_ViewStack = (Canvas)r_Control.Content;
MakeBackgroundTransparent();
}
void TextView_BackgroundBrushChanged(object sender, BackgroundBrushChangedEventArgs e)
{
r_Control.Dispatcher.BeginInvoke(new Action(() =>
{
while (r_ParentGrid.Background != null)
MakeBackgroundTransparent();
}), DispatcherPriority.Render);
}
void TextView_Closed(object sender, EventArgs e)
{
//清除委托,以防内存泄露
r_TextView.Closed -= TextView_Closed;
r_TextView.BackgroundBrushChanged -= TextView_BackgroundBrushChanged;
}
}
}
EditorBackground.cs
⑥ 最后,大家找到项目中的“source.extension.vsixmanifest”文件并打开,找到上面的“Assets”,点击右边的“New”:
Type选择“Microsoft.VisualStudio.MefComponent”
Source选择一个现有的项目
Project就选择当前这个插件项目即可
(例如下图:)最后一个可不填
⑦然后OK、大家生成项目,进入项目的“bin\debug”文件夹,找到生成的插件,关掉VS,双击安装即可:
最后打开VS,瞅瞅,如果VS启动异常报错,闪退等,如果指定的图片资源存在,则表示你的插件有问题了,
请运行“devenv.exe /safemode”卸载掉刚刚这个插件就行了。
【不要以为到这就完了,哼哼,还有很多呢~~~】
【东西太多了,一篇写不完,再开一篇】