共用方式為


新增或變更的行為與編輯器介面卡

如果您要更新針對較早版本的 Visual Studio 的核心編輯器] 中,撰寫的程式碼,而您打算使用編輯器介面卡 (或相容性修正減緩),而不是使用新的 API,您應該注意下列編輯器介面卡,相對於前一個核心編輯器的行為差異。

功能

使用 SetSite()

您必須呼叫SetSite時 CoCreate 文字緩衝區裡,文字檢視和程式碼視窗,然後再執行的任何其他運算。 不過,這不是有必要,如果您使用IVsEditorAdaptersFactoryService來建立它們,因為這項服務的 Create() 方法本身呼叫SetSite

裝載在自已的內容中的 IVsCodeWindow 和 IVsTextView

您可以主持兩者IVsCodeWindowIVsTextView在自已的內容使用 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] 窗格將轉型IVsTextViewIVsUIElementPane及呼叫GetUIObject。 第二個, GetWindowHandle仍會傳回 HWND,但這個 HWND 可以僅可用於檢查它的位置,並將焦點設定在其上。 您必須使用這個 HWND 收到 WM_PAINT 訊息,因為它並不會影響編輯器] 中繪製視窗的方式。 這個 HWND 存在於只為了轉換為新的 「 編輯器 」 程式碼的介面卡。 強烈建議您應使用VIF_NO_HWND_SUPPORT如果您的元件需要處理,所傳回的 HWND 的限制受限於 HWND GetWindowHandle ,而在這種模式。

將陣列當做參數傳遞原生程式碼

有許多傳統編輯器 API 中的方法具有參數,包括其計數和陣列。 以下是範例:

AppendViewOnlyMarkerTypes

RemoveViewOnlyMarkerTypes

如果您在原生程式碼呼叫這些方法,您必須一次傳遞中只有一個項目。 如果您傳遞一個以上的項目中,呼叫都會被拒絕,主要 interop 實作的問題。

問題是更複雜的方法如SetIgnoreMarkerTypes。 每次呼叫這個方法時,它會清理前一類型的清單會被忽略的標記,所以您不能直接呼叫這個方法有三種不同的標記類型的三次。 唯一的補救辦法是在 managed 程式碼只呼叫這個方法。

執行緒處理

您應該一律呼叫緩衝區的配接器,從 UI 執行緒。 緩衝區的配接器是一個受管理的物件,表示呼叫它的 managed 程式碼將會略過 COM 封送處理,而且您的呼叫將不會自動進行封送處理至 UI 執行緒。 如果您從背景執行緒呼叫緩衝區的配接器,您必須使用Invoke或類似的方法。

LockBuffer 方法

所有的 LockBuffer() 方法會被取代。 以下是範例:

LockBuffer

LockBuffer

LockBuffer

認可的事件

認可不支援事件。 呼叫這些事件的建議的方法會傳回失敗碼的方法。

IVsPreliminaryTextChangeCommitEvents

IVsFinalTextChangeCommitEvents

IVsUndoRedoClusterWithCommitEvents

TextEditorEvents

TextEditorEvents不會再引發 Commit() 上。 相反地,它們砲火上每個文字變更。

文字標記

您必須呼叫InvalidateIVsTextMarker物件當您將它們移除。 在舊版中,您必須只發行的資料標記。

行號

各種不同的方法,在IVsTextViewIVsTextViewEx、 行號會對應到基礎緩衝區的行號、 不行號大綱和自動換 Visual Studio 2008年所示的因素。

受影響的方法如下 (清單不夠詳盡):

大綱

用戶端的IVsHiddenTextSession將會看到只使用加入那些大綱區域AddHiddenRegionsAddHiddenRegionsEx。 它們不會看到臨機操作的區域,因為它們不會加入到編輯器介面卡。 同樣地,這些用戶端不會看到分層顯示新增的語言 (包括 C# 和 c + +) 新的程式碼編輯器,而不是編輯器介面卡所使用的區域。

線條的高度

在新的編輯器中,文字行可以有不同的高度,取決於字型大小和可能移動線相對於其他行的行可能轉換。 例如,由方法傳回的行高GetLineHeight是套用任何線條轉換中使用預設字型大小一條線的高度。 這個高度可能會也可能不會反映在檢視中的資料行的實際高度。

事件記錄和復原

在新的編輯器中,檢視會繼續執行作業,例如呈現,並復原叢集為開啟狀態時,即使持續引發事件。 這是傳統檢視中,不會執行這些作業,直到關閉後的復原叢集中的不同。

IntelliSense

智慧標籤

沒有智慧標籤,以建立配接器支援IVsSmartTagDataIVsSmartTagTipWindow,以及IVsSmartTagTipWindow2介面。

DTE

未實作 IncrementalSearch

未實作的方法

有些方法並未實作於文字緩衝區的配接器、 文字檢視配置器,以及文字層的介面卡。

介面

未實作

IVsTextBuffer

未實作 Reload(false)

IVsTextBufferCoordinator

EnumSpans

SetBufferMappingModes

SetSpanMappings

IVsTextLines

GetMarkerData

ReleaseMarkerData

IVsTextLayer

CanReplaceLines

CopyLineText

CreateTrackingPoint

EnumLayerMarkers

GetBaseBuffer

GetLengthOfLine

GetLineCount

GetLineText

GetMarkerData

LockBufferEx

MapLocalSpansToTextOriginatingLayer

ReleaseMarkerData

ReplaceLines

ReplaceLinesEx

UnlockBufferEx

IVsFindTarget

Find

Replace

IVsLayeredTextView

GetSelectedAtom

IVsTextView

GetSelectionDataObject

PositionCaretForEditing

RestrictViewRange

UpdateViewFrameCaption

IVsTextViewEx

GetSmartTagRect

InvokeInsertionUI

SetHoverWaitTimer

IVsCodeWindow

SetViewClassID

IVsIntellisenseHost

AfterCompletorCommit

BeforeCompletorCommit

Exec

GetContextLocation

GetServiceProvider

GetSmartTagRect

GetSubjectCaretPos

GetSubjectSelection

GetSubjectText

QueryStatus

ReplaceSubjectTextSpan

SetSubjectCaretPos

SetSubjectSelection

UpdateSmartTagWindow

IVsTextViewIntellisenseHost

SetSubjectFromPrimaryBuffer已實作的介面卡,但忽略大綱的 ui。

IVsHiddenRegionEx

GetBannerAttr已實作的介面卡,但忽略大綱的 ui。