1

我正在开发我的第一个 Visual Studio(2015 社区)命令菜单,我正在尝试访问IEditorOperations以删除文本、发送退格等,但我不知道如何去做。我可以:

var Service = Provider.GetService(typeof(IEditorOperationsFactoryService)) as IEditorOperationsFactoryService;
Service.GetEditorOperations(???);

我不确定要传递什么,???因为我无权访问,ITextView而是我拥有的是IVsTExtView通过:

IVsTextView View;
IVsTextManager Manager = (IVsTextManager)ServiceProvider.GetService(typeof(SVsTextManager));
int MustHaveFocus = 1;
Manager.GetActiveView(MustHaveFocus, null, out View);

创建命令菜单时,VS 为我生成了一个模板,其中包含一个创建命令服务的私有 ctor,将其绑定到命令集 id 等。一个被覆盖的Initialize方法和一堆属性。

有任何想法吗?

编辑:在谢尔盖的帮助下,我设法走得更远。但是现在当我尝试获取时我得到一个空IEditorOperationsFactoryService值,所有其他值都是有效的。

static IEditorOperations GetEditorService(IServiceProvider Provider, IVsTextView VsView)
    {
        IEditorOperations Result;

        try
        {
            var Model = (IComponentModel)Provider.GetService(typeof(SComponentModel));
            var Editor = (IEditorOperationsFactoryService)Provider.GetService(typeof(IEditorOperationsFactoryService)); // returns null

            var Adaptor = Model.GetService<IVsEditorAdaptersFactoryService>();
            IWpfTextView TextView = Adaptor.GetWpfTextView(VsView);
            Result = Editor.GetEditorOperations(TextView);
        }
        catch (Exception e)
        {
            System.Windows.Forms.MessageBox.Show(e.ToString());
            Result = null;
        }

        return (Result);
    }
4

2 回答 2

2

您可以使用以下方法从 IVsTextView 获取IWpfTextView(实现 ITextView):

IVsTextView textView = ...;
IWpfTextView v = GetEditorAdaptersFactoryService().GetWpfTextView(textView);

private Microsoft.VisualStudio.Editor.IVsEditorAdaptersFactoryService GetEditorAdaptersFactoryService()
{
    Microsoft.VisualStudio.ComponentModelHost.IComponentModel componentModel =
        (Microsoft.VisualStudio.ComponentModelHost.IComponentModel)serviceProvider.GetService(
            typeof(Microsoft.VisualStudio.ComponentModelHost.SComponentModel));
    return componentModel.GetService<Microsoft.VisualStudio.Editor.IVsEditorAdaptersFactoryService>();
}
于 2016-12-19T03:11:03.107 回答
2

您可以从名为 Model 的变量中获取 IEditorOperationsFactoryService 实例,如下所示:

var Model = (IComponentModel)this.ServiceProvider.GetService(typeof(SComponentModel));

var Editor = (IEditorOperationsFactoryService)Model.GetService<IEditorOperationsFactoryService>();
于 2016-12-23T05:36:01.747 回答