创建选项页

本演练创建一个简单的“工具/选项”页,该页使用属性网格来检查和设置属性。

若要将这些属性保存到设置文件并从中还原它们,请按照以下步骤操作,然后查看 “创建设置”类别

MPF 提供了两个类,可帮助你创建工具选项页、 Package 类和 DialogPage 类。 通过对类进行子类化 Package ,创建 VSPackage 来为这些页面提供容器。 通过派生自 DialogPage 类创建每个工具选项页。

创建“工具选项”网格页

在本部分中,将创建一个简单的“工具选项”属性网格。 使用此网格来显示和更改属性的值。

创建 VSIX 项目并添加 VSPackage

  1. 每个 Visual Studio 扩展都以 VSIX 部署项目开头,该项目将包含扩展资产。 创建名为 MyToolsOptionsExtension 的 Visual Studio VSIX 项目。 可以通过搜索“vsix”在“新建项目”对话框中找到 VSIX 项目模板

  2. 通过添加名为 MyToolsOptionsPackage 的 Visual Studio 包项模板添加 VSPackage。 在“解决方案资源管理器”中,右键单击项目节点并选择“添加”>“新建项”。 在“添加新项”对话框中,转到“Visual C# 项>扩展性”并选择“Visual Studio 包”。 在 对话框底部的“名称 ”字段中,将文件名更改为 MyToolsOptionsPackage.cs。 有关如何创建 VSPackage 的详细信息,请参阅 使用 VSPackage 创建扩展。

创建“工具选项”属性网格

  1. 代码编辑器中打开 MyToolsOptionsPackage 文件。

  2. 添加以下 using 语句。

    using System.ComponentModel;
    
  3. 声明一个 OptionPageGrid 类并从中派生它 DialogPage

    public class OptionPageGrid : DialogPage
    {  }
    
  4. 向类应用一个ProvideOptionPageAttributeVSPackage要分配给该类的选项类别和 OptionPageGrid 的选项页名称。 结果应如下所示:

    [PackageRegistration(UseManagedResourcesOnly = true)]
    [InstalledProductRegistration("#110", "#112", "1.0", IconResourceID = 400)]
    [ProvideMenuResource("Menus.ctmenu", 1)]
    [Guid(GuidList.guidMyToolsOptionsPkgString)]
    [ProvideOptionPage(typeof(OptionPageGrid),
        "My Category", "My Grid Page", 0, 0, true)]
    public sealed class MyToolsOptionsPackage : Package
    
  5. OptionInteger 属性添加到 OptionPageGrid 类。

    public class OptionPageGrid : DialogPage
    {
        private int optionInt = 256;
    
        [Category("My Category")]
        [DisplayName("My Integer Option")]
        [Description("My integer option")]
        public int OptionInteger
        {
            get { return optionInt; }
            set { optionInt = value; }
        }
    }
    

    注意

    默认实现 DialogPage 支持具有适当转换器或结构或数组的属性,这些属性可以扩展到具有适当转换器的属性。 有关转换器的列表,请参阅 System.ComponentModel 命名空间。

  6. 生成项目并启动调试。

  7. 在 Visual Studio 的实验实例中,在 “工具” 菜单上单击“ 选项”。

    在左窗格中,应会看到 “我的类别”。 (选项类别按字母顺序列出,因此它应显示在列表的一半左右。打开 “我的类别 ”,然后单击“ 我的网格”页。 选项网格显示在右窗格中。 属性类别为 “我的选项”,属性名称为 “我的整数”选项。 属性说明 “我的整数”选项显示在窗格底部。 将值从其初始值为 256 更改为其他值。 单击“确定”,然后重新打开“我的网格”页 可以看到新值仍然存在。

    还可以通过 Visual Studio 的搜索框使用“选项”页。 在 IDE 顶部附近的搜索框中,键入 “我的类别 ”,你将看到 “我的类别 -> 我的网格”页 列在结果中。

创建工具选项自定义页

在本部分中,你将使用自定义 UI 创建“工具选项”页。 使用此页可显示和更改属性的值。

  1. 代码编辑器中打开 MyToolsOptionsPackage 文件。

  2. 添加以下 using 语句。

    using System.Windows.Forms;
    
  3. 在类前面OptionPageGrid添加类OptionPageCustom。 从 DialogPage中派生新类。

    public class OptionPageCustom : DialogPage
    {
        private string optionValue = "alpha";
    
        public string OptionString
        {
            get { return optionValue; }
            set { optionValue = value; }
        }
    }
    
  4. 添加 GUID 属性。 添加 OptionString 属性:

    [Guid("00000000-0000-0000-0000-000000000000")]
    public class OptionPageCustom : DialogPage
    {
        private string optionValue = "alpha";
    
        public string OptionString
        {
            get { return optionValue; }
            set { optionValue = value; }
        }
    }
    
  5. 将第二个 ProvideOptionPageAttribute 应用到 VSPackage 类。 此属性为类分配选项类别和选项页名称。

    [PackageRegistration(UseManagedResourcesOnly = true)]
    [InstalledProductRegistration("#110", "#112", "1.0", IconResourceID = 400)]
    [ProvideMenuResource("Menus.ctmenu", 1)]
    [Guid(GuidList.guidMyToolsOptionsPkgString)]
    [ProvideOptionPage(typeof(OptionPageGrid),
        "My Category", "My Grid Page", 0, 0, true)]
    [ProvideOptionPage(typeof(OptionPageCustom),
        "My Category", "My Custom Page", 0, 0, true)]
    public sealed class MyToolsOptionsPackage : Package
    
  6. 将名为 MyUserControl 的新 用户控件 添加到项目。

  7. TextBox 控件添加到用户控件。

    “属性”窗口中,单击工具栏上的“事件”按钮,然后双击“离开事件。 新的事件处理程序将显示在 MyUserControl.cs 代码中

  8. 将公共 OptionsPage 字段、 Initialize 方法添加到控件类,并更新事件处理程序以将选项值设置为文本框的内容:

    public partial class MyUserControl : UserControl
    {
        public MyUserControl()
        {
            InitializeComponent();
        }
    
        internal OptionPageCustom optionsPage;
    
        public void Initialize()
        {
            textBox1.Text = optionsPage.OptionString;
        }
    
        private void textBox1_Leave(object sender, EventArgs e)
        {
            optionsPage.OptionString = textBox1.Text;
        }
    }
    

    optionsPage 字段保存对父 OptionPageCustom 实例的引用。 该方法Initialize显示在 OptionString TextBox。 事件处理程序将 TextBox OptionString当前值写入焦点离开 TextBox 时。

  9. 在包代码文件中,将属性的重写 OptionPageCustom.Window 添加到类以 OptionPageCustom 创建、初始化和返回实例 MyUserControl。 类现在应如下所示:

    [Guid("00000000-0000-0000-0000-000000000000")]
    public class OptionPageCustom : DialogPage
    {
        private string optionValue = "alpha";
    
        public string OptionString
        {
            get { return optionValue; }
            set { optionValue = value; }
        }
    
        protected override IWin32Window Window
        {
            get
            {
                MyUserControl page = new MyUserControl();
                page.optionsPage = this;
                page.Initialize();
                return page;
            }
        }
    }
    
  10. 生成并运行该项目。

  11. 在实验实例中,单击“工具>选项”。

  12. 找到 “我的类别 ”,然后选择 “我的自定义页面”。

  13. 更改 OptionString 的值。 单击“确定”,然后重新打开“我的自定义页面”。 可以看到新值已保留。

访问选项

在本部分中,你将从承载关联工具选项页的 VSPackage 获取选项的值。 同一技术可用于获取任何公共属性的值。

  1. 在包代码文件中,将名为 OptionInteger 的公共属性添加到 MyToolsOptionsPackage 类。

    public int OptionInteger
    {
        get
        {
            OptionPageGrid page = (OptionPageGrid)GetDialogPage(typeof(OptionPageGrid));
            return page.OptionInteger;
        }
    }
    
    

    此代码调用 GetDialogPage 创建或检索 OptionPageGrid 实例。 OptionPageGrid 调用 LoadSettingsFromStorage 以加载其选项,即公共属性。

  2. 现在,添加名为 MyToolsOptionsCommand 的自定义命令项模板以显示值。 在“添加新项”对话框中,转到 Visual C#>Extensibility 并选择“自定义命令”。窗口底部的“名称 ”字段中,将命令文件名更改为 MyToolsOptionsCommand.cs

  3. MyToolsOptionsCommand 文件中,将命令 ShowMessageBox 方法的正文替换为以下内容:

    private void ShowMessageBox(object sender, EventArgs e)
    {
        MyToolsOptionsPackage myToolsOptionsPackage = this.package as MyToolsOptionsPackage;
        System.Windows.Forms.MessageBox.Show(string.Format(CultureInfo.CurrentCulture, "OptionInteger: {0}", myToolsOptionsPackage.OptionInteger));
    }
    
    
  4. 生成项目并启动调试。

  5. 在实验实例的 “工具” 菜单上,单击“ 调用 MyToolsOptionsCommand”。

    消息框显示当前值 OptionInteger

“打开选项”页

在本部分中,你将为按钮添加命令和事件以打开选项页

  1. 首先添加名为 OpenPageCommand.cs 的文件。

  2. 然后,打开 OpenPageCommand.cs 并更改 Execute 方法。

    private void Execute(object sender, EventArgs e)
    {
        ThreadHelper.ThrowIfNotOnUIThread();
        Type optionsPageType = typeof(OptionPageCustom);
        Instance.package.ShowOptionPage(optionsPageType);
    }
    
  3. 运行项目,然后单击“调用”按钮(默认情况下位于“工具”选项下),然后可以看到选项页面已打开。

  4. 有关打开选项页的更多详细信息,请参阅以下文档