Как получить 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>();
}