首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在IWpfTextView扩展中获取活动VS2019

如何在IWpfTextView扩展中获取活动VS2019
EN

Stack Overflow用户
提问于 2020-12-26 03:22:29
回答 1查看 150关注 0票数 0

我正在尝试在C#扩展中获得active IWpfTextView编辑器。我使用一个小型的MEF服务将视图注入到VSAsyncPackage中。但它不是很可靠--有时注入的视图是错误的(例如从另一个视图)或缺失。以下是服务:

代码语言:javascript
复制
public interface IActiveViewAccessor
{
    IWpfTextView? ActiveView { get; }
}

[Export(typeof(IWpfTextViewConnectionListener))]
[Export(typeof(IActiveViewAccessor))]
[ContentType("text")]
[TextViewRole(PredefinedTextViewRoles.Document)]
internal sealed class ActiveViewConnectionListener : IWpfTextViewConnectionListener, IActiveViewAccessor
    {
    public IWpfTextView? ActiveView { get; private set; }

    public void SubjectBuffersConnected(IWpfTextView textView, ConnectionReason reason, Collection<ITextBuffer> subjectBuffers)
    {
        this.ActiveView = textView;
    }

    public void SubjectBuffersDisconnected(IWpfTextView textView, ConnectionReason reason, Collection<ITextBuffer> subjectBuffers)
    {
        this.ActiveView = null;
    }
}

此服务被注入VSPackage,如下所示:

代码语言:javascript
复制
this.viewAccessor = this.exportProvider.GetExportedValue<IActiveViewAccessor>();

它被用作:

代码语言:javascript
复制
var view = this.viewAccessor?.ActiveView;

是否有更好和更稳定的方法在异步IWpfTextView中获取VSPackage?

到目前为止,这里有一些相关的问题,但并不完全符合我的预期:

  1. 如何从命令VisualStudioExtension2017 ( 2017 )获取IWpfTextView
  2. 怎样才能得到IWpfTextView for EnvDte.ActiveDocument?(2013年)
  3. 访问Visual扩展中的当前代码窗格(2012)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-28 15:09:07

经过一些调试和探索,我得出结论,我的最初方法非常幼稚。因为在简单的情况下,IWpfTextViewConnectionListener在每个编辑器窗口只触发一次,而且在已经连接的视图之间切换时不会触发。

在对其进行实验并偷偷进入VsVim > VsAdapter.cs之后,我将IActiveViewAccessor更改为:

代码语言:javascript
复制
public interface IActiveViewAccessor
{
    IWpfTextView? ActiveView { get; }
}

[Export(typeof(IActiveViewAccessor))]
internal sealed class ActiveViewAccessor : IActiveViewAccessor
{
    private readonly SVsServiceProvider serviceProvider;
    private readonly IVsEditorAdaptersFactoryService editorAdaptersFactoryService;

    [ImportingConstructor]
    public ActiveViewAccessor(
        SVsServiceProvider vsServiceProvider,
        IVsEditorAdaptersFactoryService editorAdaptersFactoryService)
    {
        this.serviceProvider = vsServiceProvider;
        this.editorAdaptersFactoryService = editorAdaptersFactoryService;
    }

    public IWpfTextView? ActiveView
    {
        get
        {
            IVsTextManager2 textManager =
                serviceProvider.GetService<SVsTextManager, IVsTextManager2>();

            if (textManager == null)
            {
                return null;
            }

            int hr = textManager.GetActiveView2(
                fMustHaveFocus: 1,
                pBuffer: null,
                grfIncludeViewFrameType: (uint)_VIEWFRAMETYPE.vftCodeWindow,
                ppView: out IVsTextView vsTextView);

            if (ErrorHandler.Failed(hr))
            {
                return null;
            }

            return editorAdaptersFactoryService.GetWpfTextView(vsTextView);
        }
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65453407

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档