向属性窗口公开属性

适用范围:yesVisual Studio noVisual Studio for Mac noVisual Studio Code

本演练向“ 属性” 窗口公开对象的公共属性。 对这些属性所做的更改将反映在 “属性” 窗口中。

先决条件

从 Visual Studio 2015 开始,不会从下载中心安装 Visual Studio SDK。 它作为 Visual Studio 安装程序中的一项可选功能包含在内。 也可稍后安装 VS SDK。 有关详细信息,请参阅 安装 Visual Studio SDK

向属性窗口公开属性

在本部分中,将创建自定义工具窗口并在“属性”窗口中显示关联的窗口窗格对象的公共 属性

向属性窗口公开属性

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

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

  3. 打开 MyToolWindow.cs 并添加以下 using 语句:

    using System.Collections;
    using System.ComponentModel;
    using Microsoft.VisualStudio.Shell.Interop;
    
  4. 现在,将以下字段添加到 MyToolWindow 类。

    private ITrackSelection trackSel;
    private SelectionContainer selContainer;
    
    
  5. 将以下代码添加到 MyToolWindow 类。

    private ITrackSelection TrackSelection
    {
        get
        {
            if (trackSel == null)
                trackSel =
                   GetService(typeof(STrackSelection)) as ITrackSelection;
            return trackSel;
        }
    }
    
    public void UpdateSelection()
    {
        ITrackSelection track = TrackSelection;
        if (track != null)
            track.OnSelectChange((ISelectionContainer)selContainer);
    }
    
    public void SelectList(ArrayList list)
    {
        selContainer = new SelectionContainer(true, false);
        selContainer.SelectableObjects = list;
        selContainer.SelectedObjects = list;
        UpdateSelection();
    }
    
    public override void OnToolWindowCreated()
    {
        ArrayList listObjects = new ArrayList();
        listObjects.Add(this);
        SelectList(listObjects);
    }
    

    属性 TrackSelection 使用 GetService 获取 STrackSelection 提供接口的服务 ITrackSelection 。 事件处理程序 OnToolWindowCreatedSelectList 方法共同创建仅包含工具窗口窗格对象本身的选定对象列表。 方法 UpdateSelection 指示 “属性” 窗口显示工具窗口窗格的公共属性。

  6. 生成项目并启动调试。 应显示 Visual Studio 的实验性实例。

  7. 如果 “属性” 窗口不可见,按 F4 将其打开。

  8. 打开 MyToolWindow 窗口。 可以在 “查看>其他窗口”中找到它。

    窗口随即打开,窗口窗格的公共属性将显示在 “属性” 窗口中。

  9. 将“属性”窗口中的 Caption 属性更改为“我的对象属性”。

    MyToolWindow 窗口描述文字相应地更改。

公开工具窗口属性

在本部分中,将添加一个工具窗口并公开其属性。 对属性所做的更改将反映在 “属性” 窗口中。

公开工具窗口属性

  1. 打开 MyToolWindow.cs,并将公共布尔属性 IsChecked 添加到 MyToolWindow 类。

    [Category("My Properties")]
    [Description("MyToolWindowControl properties")]
    public bool IsChecked
    {
        get {
            if (base.Content == null)  return false;
            return (bool)(( MyToolWindowControl) base.Content).checkBox.IsChecked;
        }
        set {
            ((MyToolWindowControl) base.Content).checkBox.IsChecked = value;
        }
    }
    

    此属性从稍后创建的 WPF 复选框获取其状态。

  2. 打开 MyToolWindowControl.xaml.cs ,并将 MyToolWindowControl 构造函数替换为以下代码。

    private MyToolWindow pane;
    public MyToolWindowControl(MyToolWindow pane)
    {
        InitializeComponent();
        this.pane = pane;
        checkBox.IsChecked = false;
    }
    

    这允许 MyToolWindowControl 访问 MyToolWindow 窗格。

  3. MyToolWindow.csMyToolWindow ,按如下所示更改构造函数:

    base.Content = new MyToolWindowControl(this);
    
  4. 更改为 MyToolWindowControl 的设计视图。

  5. 删除按钮,并将“工具箱”中的“检查”框添加到左上角。

  6. 添加 Checked 和 Unchecked 事件。 选中设计视图中的复选框。 在 “属性” 窗口中,单击“ 属性 ”窗口 (右上角的“事件处理程序”按钮) 。 在文本框中查找 “已选中 ”并键入 “checkbox_Checked ”,然后在文本框中键入“ 未选中 ”并键入 “checkbox_Unchecked ”。

  7. 添加检查框事件处理程序:

    private void checkbox_Checked(object sender, RoutedEventArgs e)
    {
        pane.IsChecked = true;
        pane.UpdateSelection();
    }
    private void checkbox_Unchecked(object sender, RoutedEventArgs e)
    {
        pane.IsChecked = false;
        pane.UpdateSelection();
    }
    
  8. 生成项目并启动调试。

  9. 在实验实例中,打开 MyToolWindow 窗口。

    在“ 属性” 窗口中查找窗口的属性。 IsChecked 属性显示在窗口底部的“我的属性”类别下。

  10. 选中“MyToolWindow”窗口中的“检查”框。 “属性”窗口中的 IsChecked 更改为 True。 清除“MyToolWindow”窗口中的“检查”框。 “属性”窗口中的 IsChecked 更改为 False。 在“属性”窗口中更改 IsChecked 的值。 “MyToolWindow”窗口中的“检查”框将更改为与新值匹配。

    注意

    如果必须释放显示在“属性”窗口中的对象,请先使用null选择容器调用 OnSelectChange 。 释放属性或对象后,可以更改为已更新 SelectableObjectsSelectedObjects 列表的选择容器。

更改选择列表

在本部分中,将添加基本属性类的选择列表,并使用工具窗口界面选择要显示的选择列表。

更改选择列表

  1. 打开 MyToolWindow.cs 并添加名为 Simple的公共类。

    public class Simple
    {
        private string someText = "";
    
        [Category("My Properties")]
        [Description("Simple Properties")]
        [DisplayName("My Text")]
        public string SomeText
        {
            get { return someText; }
            set { someText = value; }
        }
    
        [Category("My Properties")]
        [Description("Read-only property")]
        public bool ReadOnly
        {
            get { return false; }
        }
    }
    
  2. SimpleObject向 类添加属性MyToolWindow,以及两种方法,用于在窗口窗格和 Simple 对象之间切换“属性”窗口选择。

    private Simple simpleObject = null;
    public Simple SimpleObject
    {
        get
        {
            if (simpleObject == null) simpleObject = new Simple();
            return simpleObject;
        }
    }
    
    public void SelectSimpleList()
    {
        ArrayList listObjects = new ArrayList();
        listObjects.Add(SimpleObject);
        SelectList(listObjects);
    }
    
    public void SelectThisList()
    {
        ArrayList listObjects = new ArrayList();
        listObjects.Add(this);
        SelectList(listObjects);
    }
    
  3. MyToolWindowControl.cs 中,将 检查 框处理程序替换为以下代码行:

    private void checkbox_Checked(object sender, RoutedEventArgs e)
     {
        pane.IsChecked = true;
        pane.SelectSimpleList();
        pane.UpdateSelection();
    }
    private void checkbox_Unchecked(object sender, RoutedEventArgs e)
    {
        pane.IsChecked = false;
        pane.SelectThisList();
        pane.UpdateSelection();
    }
    
  4. 生成项目并启动调试。

  5. 在实验实例中,打开 MyToolWindow 窗口。

  6. 选择“MyToolWindow”窗口中的“检查”框。 “ 属性” 窗口显示 Simple 对象属性 SomeTextReadOnly。 清除该复选框。 窗口的公共属性显示在 “属性” 窗口中。

    注意

    SomeText 的显示名称为“我的文本”。

最佳做法

在本演练中, ISelectionContainer 实现 ,以便可选择的对象集合和所选对象集合是同一个集合。 只有所选对象会显示在“属性浏览器”列表中。 有关更完整的 ISelectionContainer 实现,请参阅 Reference.ToolWindow 示例。

Visual Studio 工具窗口在 Visual Studio 会话之间保留。 有关保留工具窗口状态的详细信息,请参阅 ProvideProfileAttribute

请参阅