自訂使用者介面 (原始檔控制 VSPackage)
VSPackage 會透過 Visual Studio 命令資料表 (.vsct) 檔案宣告其功能表項目及其預設狀態。 Visual Studio 整合開發環境 (IDE) 會以預設狀態顯示功能表項目,直到載入 VSPackage 為止。 之後,會呼叫 QueryStatus 方法來啟用或停用功能表項目。
VSPackage 可以設定登錄機碼,以便根據命令使用者介面 (UI) 內容自動載入 VSPackage,不過,通常原始檔控制 VSPackage 應該視需要載入,而不只是切換至特定的 UI 內容。 如需 AutoLoadPackages 登錄機碼的詳細資訊,請參閱管理 VSPackage。
VSPackage UI
原始檔控制套件會實作為 VSPackage,而且不會使用 Visual Studio 中的任何 UI。 每個原始檔控制 VSPackage 都必須指定自己的 UI 元素,例如功能表項目、功能表群組、工具視窗、工具列,以及設定原始檔控制 VSPackage 特定選項的任何必要 UI。 您可以以靜態或動態方式啟用這些 UI 元素。 靜態 UI 元素會定義在 .vsct 檔案中,並顯示是否載入 VSPackage。 動態 UI 元素可能會根據特定的命令 UI 內容來顯示,例如 vsContextNoSolution,或呼叫 QueryStatus 方法的結果。 動態 UI 元素的可見性符合 VSPackage 延遲載入的策略。
原始檔控制 VSPackage 的 UI 條件限制
因為原始檔控制 VSPackage 在載入 IDE 之後無法從 IDE 中移除,所以 VSPackage 必須能夠進入非作用中狀態。 當 VSPackage 收到不再作用中的通知時,VSPackage 會停用其 UI 並忽略任何外部 IDE 互動。 VSPackage 的 QueryStatus 方法實作應該會在 VSPackage 不處於作用中狀態時隱藏命令。
每個原始檔控制 VSPackage 都必須實作 IVsSccProvider
介面。 介面上的兩種方法 (SetActive 和 SetInactive) 必須由 VSPackage 實作。
原始檔控制 VSPackage 可能已訂閱各種 IDE 事件,這些事件是由 IVsSolutionEvents3、IVsTrackProjectDocumentsEvents2 等所實作。 此外,VSPackage 可能已實作啟用登錄的回呼介面,例如 IVsSolutionPersistence。 當處於非作用中狀態時,必須全部忽略這些介面。
下列清單顯示受原始檔控制 VSPackage 作用中狀態影響的介面:
追蹤專案文件事件。
解决方案事件。
解決方案持續性介面。 處於非作用中狀態時,套件不應該寫入 .sln 和 .suo 檔案。
屬性擴充項。
當原始檔控制 VSPackage 處於非作用中狀態時,不會呼叫必要的 IVsQueryEditQuerySave2 和 IVsSccManager2,以及任何與原始檔控制相關聯的選用介面。
當 Visual Studio IDE 啟動時,Visual Studio 會將命令 UI 內容設定為目前預設原始檔控制 VSPackage 識別碼的識別碼。 這會導致作用中原始檔控制 VSPackage 的靜態 UI 出現在 IDE 中,而不會實際載入 VSPackage。 Visual Studio 會暫停 VSPackage 以透過 IVsRegisterScciProvider 使用 Visual Studio 進行註冊,再對 VSPackage 進行任何呼叫。
下表說明 Visual Studio IDE 如何隱藏不同 UI 項目的特定詳細資料。
UI 專案 | 描述 |
---|---|
功能表和工具列 | 原始檔控制套件必須在 .vsct 檔案的 VisibilityConstraints 區段中,將初始功能表和工具列可見性狀態設定為原始檔控制套件識別碼。 這可讓 Visual Studio IDE 適當地設定功能表項目的狀態,而不需要載入 VSPackage 並呼叫 QueryStatus 方法的實作。 |
工具視窗 | 原始檔控制 VSPackage 會在設為非作用中狀態時隱藏它擁有的任何工具視窗。 |
原始檔控制 VSPackage 特定選項頁面 | 登錄機碼 HKLM\SOFTWARE\Microsoft\VisualStudio\X.Y\ToolsOptionsPages\VisibilityCmdUIContexts 可讓 VSPackage 設定其需要顯示其選項頁面的內容。 此機碼下的登錄項目必須使用原始檔控制服務的服務識別碼 (SID) 來建立,並將 DWORD 值指派為 1。 每當原始檔控制 VSPackage 在內容中發生 UI 事件時,如果 VSPackage 為作用中,就會呼叫 VSPackage。 |