VisualStudio 使用 DialogPage 存储配置信息

VisualStudio 使用 DialogPage 存储配置信息

VisualStudio 使用 DialogPage 存储配置信息

——独立观察员 2018.04.01

最近在使用和修改VisualStudio扩展插件 CopyWithLocation (该插件功能为:复制代码时自动带上方法名、类名等,本人略作修改,添加带上命名空间功能)时留意到它的配置选项功能,由于该插件比较简单,所以正好借此研究一下VS插件的配置选项功能如何实现。

我在该插件的原有的相关功能处添加了一个"Test"项,以测试该功能,完整代码如下:

public class CopyWithLocationOptions : DialogPage
{
    [DisplayName("Method copy format")]
    [Description("Use \"{0}.{1}.{2} [{3}] \\r\\n{4}\" to copy method like \"NameSpace.MyClass.MyMethod [LineStart-LineEnd] \r\n Selected code\"")]
    public string MethodCopyFormat { get; set; }
   
    [DisplayName("Class copy format")]
    [Description("Use \"{0}.{1} [{3}] \\r\\n{4}\" to copy class like \"NameSpace.MyClass [LineStart-LineEnd] \r\n Selected code\"")]
    public string ClassCopyFormat { get; set; }
   
    [DisplayName("Code block copy format")]
    [Description("Use \"{1}\\{2} [{3}] \\r\\n{4}\" to copy code block like \"FilePath\\FileName [LineStart-LineEnd] \r\n Selected code\"")]
    public string CodeBlockCopyFormat { get; set; }
   
    [DisplayName("配置项名称")]
    [Description("配置项介绍")]
    public string Test { get; set; }
   
    public override void ResetSettings()
    {
        MethodCopyFormat = null;
        ClassCopyFormat = null;
        CodeBlockCopyFormat = null;
   
        base.ResetSettings();
    }
   
    protected override void OnActivate(CancelEventArgs e)
    {
        LoadDefaultSettingsIfNecessary();
   
        base.OnActivate(e);
    }
   
    public void LoadDefaultSettingsIfNecessary()
    {
        MethodCopyFormat = string.IsNullOrEmpty(MethodCopyFormat) ? "{0}.{1}.{2} [{3}] \r\n{4}" : MethodCopyFormat;
        ClassCopyFormat = string.IsNullOrEmpty(ClassCopyFormat) ? "{0}.{1} [{3}] \r\n{4}" : ClassCopyFormat;
        CodeBlockCopyFormat = string.IsNullOrEmpty(CodeBlockCopyFormat) ? "{1}\\{2} [{3}] \r\n{4}" : CodeBlockCopyFormat;
        Test = string.IsNullOrEmpty(Test) ? "配置项默认值" : Test;
    }
}

 

效果(点击VS菜单栏"工具"->"选项"):

VisualStudio 使用 DialogPage 存储配置信息插图

 

分析:

只需添加一个类(应该是组件类模板,不过我是通过普通类模板创建的,也行),继承 Microsoft.VisualStudio.Shell.DialogPage 类,然后设置一个公共属性,即可作为一个配置项,可自动存取配置信息。

[DisplayName("配置项名称")]
[Description("配置项介绍")]
public string Test { get; set; }

 

可在重写的 OnActivate 方法中对配置项的值进行初始化,比如为空时设置一个默认值,这样用户删除配置项的值,保存后重新打开设置窗口就可以获取默认值了。

Test = string.IsNullOrEmpty(Test) ? "配置项默认值" : Test;

 

然后需要在 XXXPackage.cs 文件中,使用 ProvideOptionPage 特性来指定配置页:

[ProvideOptionPage(typeof(NoteExtensionsOptions), "NoteExtensionsOptions Category", "NoteExtensionsOptions Page", 1000, 1001, true)]
public sealed class Command1Package : Package{//...}

 

第一个参数指定配置项设置类,第二个参数是配置项名字,第三个参数是配置页(放在配置项下的)名字,效果:

VisualStudio 使用 DialogPage 存储配置信息插图1

 

可以设置多个ProvideOptionPage来组织配置页面:

[ProvideOptionPage(typeof(NoteExtensionsOptions), "NoteExtensionsOptions Category", "NoteExtensionsOptions Page", 1000, 1001, true)]
[ProvideOptionPage(typeof(NoteExtensionsOptions), "NoteExtensionsOptions Category", "NoteExtensionsOptions Page 2", 1000, 1001, true)]
[ProvideOptionPage(typeof(NoteExtensionsOptions), "NoteExtensionsOptions Category 2", "NoteExtensionsOptions Page", 1000, 1001, true)]
public sealed class Command1Package : Package

 

效果:

VisualStudio 使用 DialogPage 存储配置信息插图2

 

最后,使用 Category 特性设置配置类里的属性可进行配置项的分组,未设置则分到"杂项"组:

[Category("设置项类别")]
[DisplayName("设置项1")]
[Description("描述1")]
public string MethodCopyFormat { get; set; }
  
[DisplayName("设置项2")]
[Description("描述2")]
public string ClassCopyFormat { get; set; }
   
[DisplayName("设置项3")]
[Description("描述3")]
public string CodeBlockCopyFormat { get; set; }

 

效果:

VisualStudio 使用 DialogPage 存储配置信息插图3

 

好了,就说这么多吧。网上这方面的内容还是比较少的,希望大家多多交流。

 

0 0 评分
文章评分
订阅
提醒
guest
0 评论
行内反馈
查看所有评论
0
若有所思?请评论!x
()
x