Как получить IEditorOperations из IVsTextView?

Я разрабатываю свое первое командное меню 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, создавая службу команд, привязывая ее к идентификатору набора команд и т. Д. 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);
    }

2 ответа

Решение

Вы можете получить экземпляр IEditorOperationsFactoryService из переменной с именем Model, например:

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

var Editor = (IEditorOperationsFactoryService)Model.GetService<IEditorOperationsFactoryService>();

Вы можете получить IWpfTextView (который реализует ITextView) из IVsTextView, используя:

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>();
}
Другие вопросы по тегам