向属性窗口公开属性

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

向属性窗口公开属性

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

向属性窗口公开属性

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

  2. 通过添加名为 <a0/> 的自定义工具窗口项模板来添加工具窗口。 在“解决方案资源管理器”中,右键单击项目节点并选择“添加”>“新建项”。 在“添加新项”对话框中,转到“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 接口的服务。 OnToolWindowCreated事件处理程序和SelectList方法共同创建仅包含工具窗口窗格对象本身的选定对象列表。 该方法 UpdateSelection 告知 “属性” 窗口显示工具窗口窗格的公共属性。

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

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

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

    此时会打开该窗口,窗口窗格的公共属性将显示在 “属性” 窗口中。

  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;
    }
    

    这会授予 MyToolWindowControlMyToolWindow 窗格的访问权限。

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

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

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

  6. 添加 Checked 和 Un检查ed 事件。 在设计视图中选择检查框。 在“属性”窗口中,单击“属性”窗口右上角的事件处理程序按钮。 在文本框中查找“已选中”并键入检查box_Checked,然后找到“未检查”,然后在文本框中键入检查box_Un检查

  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 并添加名为 <a0/> 的公共类。

    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