VisualStudio 使用 DialogPage 存储配置信息
最近在使用和修改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菜单栏”工具”->”选项”):

分析:
只需添加一个类(应该是组件类模板,不过我是通过普通类模板创建的,也行),继承 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{//...}
第一个参数指定配置项设置类,第二个参数是配置项名字,第三个参数是配置页(放在配置项下的)名字,效果:

可以设置多个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
效果:

最后,使用 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; }
效果:

好了,就说这么多吧。网上这方面的内容还是比较少的,希望大家多多交流。
原创文章,转载请注明: 转载自 独立观察员(dlgcy.com)
本文链接地址: [VisualStudio 使用 DialogPage 存储配置信息](https://dlgcy.com/visualstudio-use-dialogpage/)
关注微信公众号 独立观察员博客(DLGCY_BLOG) 第一时间获取最新文章
发表评论