0

첫 번째 Visual Studio (2015 커뮤니티) 명령 메뉴를 개발 중이며 IEditorOperations에 액세스하여 텍스트를 삭제하고 백 스페이스 등을 보내려고합니다. 그러나 방법을 잘 모르겠습니다. 내가 할 수있는 :IVsTextView에서 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 커맨드 세트 id 등등에 바인딩 명령 서비스를 만드는 개인 ctor와 나를 위해 템플릿을 생성합니다. Initialize 메서드를 재정의하고, 속성을 잔뜩.

아이디어가 있으십니까?

편집 : 세르게이의 도움을받은 후, 나는 조금 더 발전 할 수있었습니다. 하지만 이제 IEditorOperationsFactoryService을 얻으려고하면 null이되고 다른 모든 값은 유효합니다.

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

당신은 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>(); 
} 
+0

'Editor'는 아무튼 'VisualStudio' 네임 스페이스 안에 존재하지 않으며'ComponentModelHost'도 존재하지 않습니다. 특정 어셈블리를 참조해야합니까? – vexe

+0

IVsEditorAdaptersFactoryService는 Microsoft.VisualStudio.Editor.dll에 정의되어 있습니다. IComponentModel은 Microsoft.VisualStudio.ComponentModelHost.dll에 정의되어 있습니다. –

+0

이제'GetService'에서'IEditorOperationsFactoryService'를 다시 얻을 때 null이 생깁니다. 수정 사항을 참조하십시오. – vexe