You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 18:02:06