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