【转载】【一】VS个性化背景界面设置,自己也该有享受代码的权利。

首先,声明站在出处。

---------------------------------------------------------华丽的分割线----------------------------------------------------------------------------------

原文章标题: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”卸载掉刚刚这个插件就行了。


【不要以为到这就完了,哼哼,还有很多呢~~~】

【东西太多了,一篇写不完,再开一篇】




  • 7
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值