向属性窗口公开属性
本演练向“属性”窗口公开对象的公共属性。 对这些属性所做的更改反映在 “属性” 窗口中。
向属性窗口公开属性
在本部分中,你将创建自定义工具窗口,并在“属性”窗口中显示关联窗口窗格对象的公共属性。
向属性窗口公开属性
每个 Visual Studio 扩展都以 VSIX 部署项目开头,该项目将包含扩展资产。 创建名为
MyObjectPropertiesExtension
的 Visual Studio VSIX 项目。 可以通过搜索“vsix”在“新建项目”对话框中找到 VSIX 项目模板。通过添加名为 <
a0/> 的自定义工具窗口项模板来添加工具窗口。 在“解决方案资源管理器”中,右键单击项目节点并选择“添加”>“新建项”。 在“添加新项”对话框中,转到“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 窗口。 可以在“查看>其他 Windows”中找到它。
此时会打开该窗口,窗口窗格的公共属性将显示在 “属性” 窗口中。
将“属性”窗口中的 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 和 Un检查ed 事件。 在设计视图中选择检查框。 在“属性”窗口中,单击“属性”窗口右上角的事件处理程序按钮。 在文本框中查找“已选中”并键入检查box_Checked,然后找到“未检查”,然后在文本框中键入检查box_Un检查。
添加检查框事件处理程序:
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 并添加名为 <
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; } } }
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。