新增或變更的行為與編輯器介面卡
如果您要更新針對較早版本的 Visual Studio 的核心編輯器] 中,撰寫的程式碼,而您打算使用編輯器介面卡 (或相容性修正減緩),而不是使用新的 API,您應該注意下列編輯器介面卡,相對於前一個核心編輯器的行為差異。
功能
使用 SetSite()
您必須呼叫SetSite時 CoCreate 文字緩衝區裡,文字檢視和程式碼視窗,然後再執行的任何其他運算。 不過,這不是有必要,如果您使用IVsEditorAdaptersFactoryService來建立它們,因為這項服務的 Create() 方法本身呼叫SetSite。
裝載在自已的內容中的 IVsCodeWindow 和 IVsTextView
您可以主持兩者IVsCodeWindow和IVsTextView在自已的內容使用 Win32 模式] 或 [WPF 模式。 不過,您應該記住有兩種模式的一些差異。
使用 Win32 和 WPF 版本 IVsCodeWindow
程式碼編輯器] 視窗衍生自WindowPane,它會實作較舊的 Win32 IVsWindowPane介面,以及新的 WPF IVsUIElementPane介面。 您可以使用Microsoft#VisualStudio#Shell#Interop#IVsWindowPane#CreatePaneWindow方法,以建立以 HWND 為基礎裝載環境中,或Microsoft#VisualStudio#Shell#Interop#IVsUIElementPane#CreateUIElementPane方法,以建立 WPF 的裝載環境。 基礎的編輯器一定會使用 WPF 中,但是您可以建立一種適合您控管的需求,如果您內嵌此視窗窗格直接插入您自己的內容的視窗窗格。
使用 Win32 和 WPF 版本 IVsTextView
您可以設定IVsTextView Win32 模式 」 或 「 WPF 的模式。
當編輯器原廠預設位於 HWND,建立文字檢視中,以及GetWindowHandle會傳回 HWND。 您不應該使用此模式中內嵌編輯器] 內 [WPF 控制項。
若要設定文字的檢視為 WPF 模式,您必須呼叫Initialize並傳入VIF_NO_HWND_SUPPORT ,其中一項元件的初始化旗標中InitView參數。 您可以取得FrameworkElement藉由呼叫CreateUIElementPane。
WPF 模式不同於 Win32 模式下,有兩種方式。 首先,您還可以文字檢視放在 WPF 內容。 您可以存取 [WPF] 窗格將轉型IVsTextView到IVsUIElementPane及呼叫GetUIObject。 第二個, GetWindowHandle仍會傳回 HWND,但這個 HWND 可以僅可用於檢查它的位置,並將焦點設定在其上。 您必須使用這個 HWND 收到 WM_PAINT 訊息,因為它並不會影響編輯器] 中繪製視窗的方式。 這個 HWND 存在於只為了轉換為新的 「 編輯器 」 程式碼的介面卡。 強烈建議您應使用VIF_NO_HWND_SUPPORT如果您的元件需要處理,所傳回的 HWND 的限制受限於 HWND GetWindowHandle ,而在這種模式。
將陣列當做參數傳遞原生程式碼
有許多傳統編輯器 API 中的方法具有參數,包括其計數和陣列。 以下是範例:
如果您在原生程式碼呼叫這些方法,您必須一次傳遞中只有一個項目。 如果您傳遞一個以上的項目中,呼叫都會被拒絕,主要 interop 實作的問題。
問題是更複雜的方法如SetIgnoreMarkerTypes。 每次呼叫這個方法時,它會清理前一類型的清單會被忽略的標記,所以您不能直接呼叫這個方法有三種不同的標記類型的三次。 唯一的補救辦法是在 managed 程式碼只呼叫這個方法。
執行緒處理
您應該一律呼叫緩衝區的配接器,從 UI 執行緒。 緩衝區的配接器是一個受管理的物件,表示呼叫它的 managed 程式碼將會略過 COM 封送處理,而且您的呼叫將不會自動進行封送處理至 UI 執行緒。 如果您從背景執行緒呼叫緩衝區的配接器,您必須使用Invoke或類似的方法。
LockBuffer 方法
所有的 LockBuffer() 方法會被取代。 以下是範例:
認可的事件
認可不支援事件。 呼叫這些事件的建議的方法會傳回失敗碼的方法。
IVsPreliminaryTextChangeCommitEvents
IVsFinalTextChangeCommitEvents
IVsUndoRedoClusterWithCommitEvents
TextEditorEvents
TextEditorEvents不會再引發 Commit() 上。 相反地,它們砲火上每個文字變更。
文字標記
您必須呼叫Invalidate的IVsTextMarker物件當您將它們移除。 在舊版中,您必須只發行的資料標記。
行號
各種不同的方法,在IVsTextView和IVsTextViewEx、 行號會對應到基礎緩衝區的行號、 不行號大綱和自動換 Visual Studio 2008年所示的因素。
受影響的方法如下 (清單不夠詳盡):
大綱
用戶端的IVsHiddenTextSession將會看到只使用加入那些大綱區域AddHiddenRegions或AddHiddenRegionsEx。 它們不會看到臨機操作的區域,因為它們不會加入到編輯器介面卡。 同樣地,這些用戶端不會看到分層顯示新增的語言 (包括 C# 和 c + +) 新的程式碼編輯器,而不是編輯器介面卡所使用的區域。
線條的高度
在新的編輯器中,文字行可以有不同的高度,取決於字型大小和可能移動線相對於其他行的行可能轉換。 例如,由方法傳回的行高GetLineHeight是套用任何線條轉換中使用預設字型大小一條線的高度。 這個高度可能會也可能不會反映在檢視中的資料行的實際高度。
事件記錄和復原
在新的編輯器中,檢視會繼續執行作業,例如呈現,並復原叢集為開啟狀態時,即使持續引發事件。 這是傳統檢視中,不會執行這些作業,直到關閉後的復原叢集中的不同。
IntelliSense
- UpdateTipWindow方法會失敗,如果您傳入的類別,但未實作其中一個IVsTextTipWindow2或IVsMethodTipWindow3。 不再支援主控描繪的快顯功能表的自訂 Win32。
智慧標籤
沒有智慧標籤,以建立配接器支援IVsSmartTagData, IVsSmartTagTipWindow,以及IVsSmartTagTipWindow2介面。
DTE
未實作 IncrementalSearch。
未實作的方法
有些方法並未實作於文字緩衝區的配接器、 文字檢視配置器,以及文字層的介面卡。
介面 |
未實作 |
---|---|
未實作 Reload(false)。 |
|
SetSubjectFromPrimaryBuffer已實作的介面卡,但忽略大綱的 ui。 |
|
GetBannerAttr已實作的介面卡,但忽略大綱的 ui。 |