Visual Studio扩展中装饰层内嵌差异视图的焦点异常问题
Visual Studio扩展内嵌差异视图焦点显示异常问题
问题描述
我正在开发一款带有内嵌差异视图功能的Visual Studio IDE扩展,使用CreateDifferenceView方法生成包含两个内部IWpfTextView的FrameworkElement,并通过AddAdornment将其附加到宿主IWpfTextView的装饰层中。
最初装饰层无法正确接收键盘焦点,如CTRL+A、CTRL+C等命令会被宿主IWpfTextView拦截。通过AddCommandFilter将命令转发给内部IVsTextView后,命令功能恢复正常,但焦点显示仍存在两个问题:
- 选中装饰层内文本时,选中状态显示为失焦的灰色样式
- 点击装饰层后,宿主
IWpfTextView不会失去选中焦点
已尝试的解决方法
- 使用
FocusManager.SetIsFocusScope设置焦点范围 - 调用外部
IWpfDifferenceViewer.VisualElement和内部IWpfTextView.VisualElement的UIElement.Focus方法 - 调用内部
IVsTextView的SendExplicitFocus方法
最小复现代码(MefProvider用于导入组件)
var docview = await VS.Documents.GetActiveDocumentViewAsync(); var contentType = docview.TextBuffer.ContentType; var leftBuffer = MefProvider.TextBufferFactoryService.CreateTextBuffer("left content", contentType); var rightBuffer = MefProvider.TextBufferFactoryService.CreateTextBuffer("right content", contentType); var diffBuffer = MefProvider.DifferenceBufferFactory.CreateDifferenceBuffer(leftBuffer, rightBuffer); var diffViewer = MefProvider.DifferenceViewerFactory.CreateDifferenceView(diffBuffer); var adornmentLayer = docview.TextView.GetAdornmentLayer("MyAdornmentLayer"); adornmentLayer.AddAdornment(AdornmentPositioningBehavior.OwnerControlled, null, null, diffViewer.VisualElement, null);
内容的提问来源于stack exchange,提问作者thedemons
相关产品推荐
相关产品推荐

