閱讀英文

共用方式為


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

如果您要更新針對較早版本的 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

未實作的方法

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