Visual Studio扩展开发:IWpfTextView内嵌编辑器窗格无法编辑问题求助
自定义VS编辑器可显示不可编辑问题解决方案
问题根因
你手动通过ITextEditorFactoryService创建的IWpfTextView未绑定VS的OLE命令路由适配层,VS文档窗口会优先截获所有键盘、鼠标输入走全局命令路由,缺少适配器的视图无法接收编辑类命令,因此仅能选中文本无法触发修改操作。
修复步骤
步骤1:修改编辑器工厂的视图创建逻辑
不要手动创建IWpfTextView和IWpfTextViewHost,改用IVsEditorAdaptersFactoryService创建带适配层的视图实例,自动打通命令路由,修改CreateEditorInstance中视图创建的核心代码:
// 原有创建textBuffer的逻辑保留 textBuffer = eafs.CreateVsTextBufferAdapter(_vsServiceProvider, ContentTypeRegistry.GetContentType("CUST")) as IVsTextLines; string fileText = System.IO.File.ReadAllText(pszMkDocument); textBuffer.InitializeContent(fileText, fileText.Length); // 新增:创建带适配器的IVsTextView实例 var vsTextView = eafs.CreateVsTextViewAdapter(_vsServiceProvider); vsTextView.Initialize(textBuffer, IntPtr.Zero, (uint)TextViewInitFlags.VIF_DEFAULT, null); // 从适配器获取对应的IWpfTextView和IWpfTextViewHost IWpfTextView dataView = eafs.GetWpfTextView(vsTextView); IWpfTextViewHost wpfHost = eafs.GetWpfTextViewHost(vsTextView); // 原有视图配置逻辑保留 dataView.Options.SetOptionValue(DefaultTextViewHostOptions.LineNumberMarginName, true); dataView.Options.SetOptionValue(DefaultTextViewHostOptions.ShowCaretPositionOptionName, true); dataView.Options.SetOptionValue(DefaultTextViewHostOptions.ChangeTrackingName, true); dataView.Options.SetOptionValue(DefaultTextViewOptions.ViewProhibitUserInputName, false); // 后续创建自定义窗口逻辑不变 MyCustomEditor editor = new MyCustomEditor(wpfHost); ppunkDocData = Marshal.GetIUnknownForObject(textBuffer); ppunkDocView = Marshal.GetIUnknownForObject(editor); // 修正pguidCmdUI为自定义编辑器工厂的GUID pguidCmdUI = new Guid(MyCustomEditorFactory.EditorFactoryGuidString); retVal = VSConstants.S_OK;
步骤2:修复代码语法错误
你贴出的CreateEditorInstance方法中存在重复else的语法错误,需要删除多余的else分支,避免编译异常。
步骤3:验证自定义控件逻辑
确认MyCustomEditorControl没有拦截输入事件,不要给承载的wpfHost.HostControl设置IsEnabled=False、IsReadOnly=True等限制输入的属性。
验证效果
修改完成后重新编译扩展,打开.cust文件即可正常编辑文本,原有的classifier、quick info等扩展能力也可以正常运行,不需要手动实现IOleCommandTarget处理输入。
内容的提问来源于stack exchange,提问作者user1100269
相关产品推荐
相关产品推荐

