1

私は最初の Visual Studio (2015 Community) コマンド メニューを開発しており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を使用してテンプレートを生成し、それをコマンドセットIDなどにバインドします。オーバーライドされたInitializeメソッドと一連のプロパティ。

何か案は?

編集: Sergey の助けを借りて、もう少し先に進むことができました。しかし、取得しようとすると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);
    }
4

2 に答える 2

2

次のように、Model という名前の変数から IEditorOperationsFactoryService インスタンスを取得できます。

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

var Editor = (IEditorOperationsFactoryService)Model.GetService<IEditorOperationsFactoryService>();
于 2016-12-23T05:36:01.747 に答える
2

以下を使用して、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>();
}
于 2016-12-19T03:11:03.107 に答える