0

Я разрабатываю свое первое командное меню Visual Studio (2015 Community), и я пытаюсь получить доступ к IEditorOperations, чтобы удалить текст, отправить назад и т. Д., Но я не уверен, как это сделать. Я могу сделать:Как получить IEditorOperations из IVsTextView?

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 и набор свойств.

Любые идеи?

EDIT: После помощи Сергея мне удалось немного поучиться. Но теперь я получаю null, когда пытаюсь получить 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); 
    } 

ответ

1

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

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

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

Общая версия работает по какой-то причине, но не-общий возвращает null. Благодаря! – vexe

1

Вы можете получить 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>(); 
} 
+0

'Editor' Безразлично 't существует внутри 'VisualStudio' namepsace, а не' ComponentModelHost'. Нужно ли ссылаться на определенную сборку? – vexe

+0

IVsEditorAdaptersFactoryService определен в Microsoft.VisualStudio.Editor.dll. IComponentModel определяется в Microsoft.VisualStudio.ComponentModelHost.dll. –

+0

Теперь я получаю null при получении 'IEditorOperationsFactoryService' обратно из' GetService'. См. Правки. – vexe