向属性窗口公开属性
适用范围:Visual Studio
Visual Studio for Mac
Visual Studio Code
本演练向“ 属性” 窗口公开对象的公共属性。 对这些属性所做的更改将反映在 “属性” 窗口中。
先决条件
从 Visual Studio 2015 开始,不会从下载中心安装 Visual Studio SDK。 它作为 Visual Studio 安装程序中的一项可选功能包含在内。 也可稍后安装 VS SDK。 有关详细信息,请参阅 安装 Visual Studio SDK。
向属性窗口公开属性
在本部分中,将创建自定义工具窗口并在“属性”窗口中显示关联的窗口窗格对象的公共 属性 。
向属性窗口公开属性
每个 Visual Studio 扩展都以 VSIX 部署项目开头,该项目将包含扩展资产。 创建名为 的
MyObjectPropertiesExtension
Visual Studio VSIX 项目。 可以通过搜索“vsix”在“ 新建项目 ”对话框中找到 VSIX 项目模板。通过添加名为
MyToolWindow
的自定义工具窗口项模板来添加工具窗口。 在“解决方案资源管理器”中,右键单击项目节点并选择“添加”>“新建项” 。 在 “添加新项”对话框中,转到 “Visual C# 项>扩展性 ”,然后选择“ 自定义工具窗口”。 在对话框底部的“ 名称 ”字段中,将文件名更改为 “MyToolWindow.cs”。 有关如何创建自定义工具窗口的详细信息,请参阅 使用工具窗口创建扩展。打开 MyToolWindow.cs 并添加以下 using 语句:
using System.Collections; using System.ComponentModel; using Microsoft.VisualStudio.Shell.Interop;
现在,将以下字段添加到
MyToolWindow
类。private ITrackSelection trackSel; private SelectionContainer selContainer;
将以下代码添加到
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
指示 “属性” 窗口显示工具窗口窗格的公共属性。生成项目并启动调试。 应显示 Visual Studio 的实验性实例。
如果 “属性” 窗口不可见,按 F4 将其打开。
打开 MyToolWindow 窗口。 可以在 “查看>其他窗口”中找到它。
窗口随即打开,窗口窗格的公共属性将显示在 “属性” 窗口中。
将“属性”窗口中的 Caption 属性更改为“我的对象属性”。
MyToolWindow 窗口描述文字相应地更改。
公开工具窗口属性
在本部分中,将添加一个工具窗口并公开其属性。 对属性所做的更改将反映在 “属性” 窗口中。
公开工具窗口属性
打开 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 复选框获取其状态。
打开 MyToolWindowControl.xaml.cs ,并将 MyToolWindowControl 构造函数替换为以下代码。
private MyToolWindow pane; public MyToolWindowControl(MyToolWindow pane) { InitializeComponent(); this.pane = pane; checkBox.IsChecked = false; }
这允许
MyToolWindowControl
访问MyToolWindow
窗格。在 MyToolWindow.cs 中
MyToolWindow
,按如下所示更改构造函数:base.Content = new MyToolWindowControl(this);
更改为 MyToolWindowControl 的设计视图。
删除按钮,并将“工具箱”中的“检查”框添加到左上角。
添加 Checked 和 Unchecked 事件。 选中设计视图中的复选框。 在 “属性” 窗口中,单击“ 属性 ”窗口 (右上角的“事件处理程序”按钮) 。 在文本框中查找 “已选中 ”并键入 “checkbox_Checked ”,然后在文本框中键入“ 未选中 ”并键入 “checkbox_Unchecked ”。
添加检查框事件处理程序:
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(); }
生成项目并启动调试。
在实验实例中,打开 MyToolWindow 窗口。
在“ 属性” 窗口中查找窗口的属性。 IsChecked 属性显示在窗口底部的“我的属性”类别下。
选中“MyToolWindow”窗口中的“检查”框。 “属性”窗口中的 IsChecked 更改为 True。 清除“MyToolWindow”窗口中的“检查”框。 “属性”窗口中的 IsChecked 更改为 False。 在“属性”窗口中更改 IsChecked 的值。 “MyToolWindow”窗口中的“检查”框将更改为与新值匹配。
注意
如果必须释放显示在“属性”窗口中的对象,请先使用
null
选择容器调用OnSelectChange
。 释放属性或对象后,可以更改为已更新 SelectableObjects 和 SelectedObjects 列表的选择容器。
更改选择列表
在本部分中,将添加基本属性类的选择列表,并使用工具窗口界面选择要显示的选择列表。
更改选择列表
打开 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; } } }
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); }
在 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(); }
生成项目并启动调试。
在实验实例中,打开 MyToolWindow 窗口。
选择“MyToolWindow”窗口中的“检查”框。 “ 属性” 窗口显示
Simple
对象属性 SomeText 和 ReadOnly。 清除该复选框。 窗口的公共属性显示在 “属性” 窗口中。注意
SomeText 的显示名称为“我的文本”。
最佳做法
在本演练中, ISelectionContainer 实现 ,以便可选择的对象集合和所选对象集合是同一个集合。 只有所选对象会显示在“属性浏览器”列表中。 有关更完整的 ISelectionContainer 实现,请参阅 Reference.ToolWindow 示例。
Visual Studio 工具窗口在 Visual Studio 会话之间保留。 有关保留工具窗口状态的详细信息,请参阅 ProvideProfileAttribute。