0

Ich entwickle mein erstes Visual Studio (2015 Community) Befehlsmenü und ich versuche, Zugriff auf IEditorOperations zu erhalten, um Text zu löschen, Rücktaste usw. zu senden, aber ich bin mir nicht sicher, wie. Ich kann tun:Wie bekomme ich IEditorOperations von IVsTextView?

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

Ich bin nicht sicher, was in den ??? passieren, da ich keinen Zugang zu einem ITextView statt, was ich habe, ist ein IVsTExtView über:

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

Beim Erstellen Das Befehlsmenü, VS erzeugt eine Vorlage für mich mit einem privaten ctor, der den Befehlsdienst erstellt, ihn an die Befehlssatz-ID usw. bindet. Eine überschriebene Initialize-Methode und eine Reihe von Eigenschaften.

Irgendwelche Ideen?

EDIT: Nach Hilfe von Sergey, gelang es mir, ein bisschen weiter zu kommen. Aber jetzt bekomme ich eine Null, wenn ich versuche, die IEditorOperationsFactoryService zu bekommen, alle anderen Werte sind gültig.

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); 
    } 

Antwort

1

Sie IEditorOperationsFactoryService Instanz von Variable bekommen Modell genannt, wie folgt aus:

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

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

Die generische Version funktioniert aus irgendeinem Grund, aber die nicht generische Version gibt null zurück. Vielen Dank! – vexe

1

können Sie erhalten IWpfTextView (das implementiert ITextView) von IVsTextView mit:

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' doesn Es gibt sie nicht in 'VisualStudio' oder' ComponentModelHost'. Muss ich eine bestimmte Baugruppe referenzieren? – vexe

+0

IVsEditorAdaptersFactoryService ist in Microsoft.VisualStudio.Editor.dll definiert. IComponentModel ist in Microsoft.VisualStudio.ComponentModelHost.dll definiert. –

+0

Jetzt bekomme ich eine Null, wenn ich 'IEditorOperationsFactoryService' von' GetService' zurückbekomme. Bitte beachten Sie die Änderungen. – vexe