与编辑器适配器的新的或已更改的行为

如果更新编写 Visual Studio 核心编辑器的早期版本,并且,的代码计划使用编辑器适配器 (或填充) 使用新 API,而不是,您应了解在编辑适配器的行为上的以下差异有关上述内核编辑。

功能

使用 SetSite()

,在对它们之前,的任何其他操作必须调用 SetSite ,在共同创建文本缓冲区、文本视图和代码窗口。 但是,这不是必需的是否使用 IVsEditorAdaptersFactoryService 创建自己的,,因为此服务的 Create() 方法调用 SetSite

承载 IVsCodeWindow 和 IVsTextView 在拥有内容

使用 Win32 模式或 WPF 模式,可以承载 IVsCodeWindowIVsTextView 在拥有内容。 但是,应注意存在一些差异在这两种模式。

使用 Win32 和 IVsCodeWindow 的 WPF 版本

编辑代码中的 WindowPane派生,实现较旧的 Win32 IVsWindowPane 接口以及新的 WPF IVsUIElementPane 接口。 可以使用 Microsoft#VisualStudio#Shell#Interop#IVsWindowPane#CreatePaneWindow 方法创建基于 HWND 的承载环境或 Microsoft#VisualStudio#Shell#Interop#IVsUIElementPane#CreateUIElementPane 方法创建 WPF 承载环境中。 一个基础编辑器始终使用 WPF,但是,您可以创建了匹配的承载管理上的窗口窗格,如果嵌入此窗口窗格直接添加到拥有内容。

使用 Win32 和 IVsTextView 的 WPF 版本

可以设置 IVsTextView Win32 模式或 WPF 模式。

在编辑工厂创建文本视图时,默认情况下它承载在 HWND,并且, GetWindowHandle 返回 HWND。 不应使用此模式嵌入在 WPF 控件中编辑。

若要设置文本视图向 WPF 模式,请在 VIF_NO_HWND_SUPPORT 必须调用 Initialize 并将作为参数之一个在 InitView 参数的初始化标志。 通过调用 CreateUIElementPane可以获取 FrameworkElement

WPF 模式与以下两种方式的 Win32 模式的区别。 首先,文本视图可以在 WPF 上下文承载。 通过转换 IVsTextViewIVsUIElementPane 和调用 GetUIObject可以访问 WPF 窗格。 接下来, GetWindowHandle 仍返回 HWND,但是,此 HWND 只用来检查其位置和将焦点设置到此。 您不能使用此 HWND 响应消息, WM_PAINT,因为它不会影响编辑器如何绘制窗口。 此 HWND 存在通过适配器仅便于与新编辑代码的转换。 强烈建议您在从 GetWindowHandle 返回的 HWND 不应使用 VIF_NO_HWND_SUPPORT ,如果组件需要一个 HWND 工作,因为限制,而在此模式下。

将数组作为在本机代码的参数

具有参数包括数组和其计数在旧编辑 API 的许多方法。 示例包括:

AppendViewOnlyMarkerTypes

RemoveViewOnlyMarkerTypes

如果对本机代码的这些方法,您可以在一个元素只需一次通过。 如果在多个元素,通过调用将被拒绝,由于主 interop 实现的问题。

此问题是复杂使用方法例如 SetIgnoreMarkerTypes。 此方法调用后,就会清除以前列出了要忽略的标记类型,因此,调用此方法与三个不同标记类型的三次是不可能的。 唯一的解决方法是调用此方法仅在托管代码。

线程处理

应始终调用从 UI 线程的缓冲区适配器。 缓冲区适配器是托管对象,这意味着,调用它从托管代码具有跳过的 COM,并调用不会自动封送到 UI 线程。 如果从后台线程的缓冲区适配器,必须使用 Invoke 或类似的方法。

LockBuffer 方法

所有 LockBuffer() 方法已弃用。 示例包括:

LockBuffer

LockBuffer

LockBuffer

使事件

项操作不受支持。 调用为这些事件建议的方法会导致方法返回失败代码。

IVsPreliminaryTextChangeCommitEvents

IVsFinalTextChangeCommitEvents

IVsUndoRedoClusterWithCommitEvents

TextEditorEvents

TextEditorEvents 在 Commit() 不再引发。 而在每个文本更改时激发。

text 标记

,当移除时,您必须对 IVsTextMarker 对象的 Invalidate 。 在早期版本中,您只需要释放标记。

行号

IVsTextViewIVsTextViewEx的各种方法,行号对应于基础缓冲区行号,大纲和换行分解不是的行号,在 Visual Studio 2008。

受影响的方法包括以下 (列表并未):

大纲显示

将看到只概括使用 AddHiddenRegionsAddHiddenRegionsEx,添加区域的 IVsHiddenTextSession 的客户端。 ,因为它们不通过编辑适配器,添加将不会看到临时区域。 同样,这些客户端将看不到概述使用新的编辑代码而不是编辑适配器的语言添加的区域 (包括 C# 和 C++)。

行高

在新的版本,文本行可能基于字号具有不同的高度,因此,可以将行相对于其他行的行转换。 方法返回的行高例如 GetLineHeight 是行的高度使用默认字号没有行转换应用。 此高度可能存在也可能不反映一行的实际高度在视图中。

事件处理和取消

在新的版本,,即使取消群集是打开的,视图继续操作 (如继续呈现和引发事件。 此行为与传统视图不同,不执行这些操作,取消群集的结束之后。

IntelliSense

SmartTags

没有适配器用于智能标记使用创建一个, IVsSmartTagDataIVsSmartTagTipWindowIVsSmartTagTipWindow2 接口支持。

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 忽略。