將屬性公開至 [屬性] 視窗
本逐步解說會將物件的公用屬性公開至 [屬性] 視窗。 您對這些屬性所做的變更會反映在 [屬性] 視窗中。
將屬性公開至 [屬性] 視窗
在本節中,您會建立自訂工具視窗,並在 [屬性] 視窗中顯示相關聯視窗窗格物件的公用屬性。
將屬性公開至 [屬性] 視窗
每個 Visual Studio 擴充功能都是從 VSIX 部署專案開始,其中包含擴充功能資產。 建立名為
MyObjectPropertiesExtension
的 Visual Studio VSIX 專案。 您可以在 [新增專案] 對話方塊中搜尋「vsix」來尋找 VSIX 專案範本。新增名為
MyToolWindow
的自訂工具視窗項目範本,以新增工具視窗。 在 [解決方案總管] 中,以滑鼠右鍵按一下專案節點,並選取 [新增]>[新增項目]。 在 [新增項目] 對話方塊中,移至 [Visual C# 項目]>[擴充性],然後選取 [自訂工具視窗]。 在對話方塊底部的 [名稱] 欄位中,將檔案名稱變更為 MyToolWindow.cs。 如需如何建立自訂工具視窗的詳細資訊,請參閱使用工具視窗建立擴充功能。開啟 MyToolWindow.cs 並使用陳述式新增下列項目:
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 視窗。 您可以在 [檢視]>[其他視窗] 中找到它。
視窗隨即開啟,視窗窗格的公用屬性會出現在 [屬性] 視窗中。
將 [屬性] 視窗中的 [標題] 屬性變更為 [我的物件屬性]。
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 事件。 選取設計檢視中的核取方塊。 在 [屬性] 視窗中,按兩下 [屬性] 視窗右上方的事件處理常式按鈕。 尋找 Checked 並在文字方塊中輸入 checkbox_Checked,然後尋找 Unchecked 並在文字方塊中輸入 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。