我正在开发我的第一个 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,将其绑定到命令集 id 等。一个被覆盖的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);
}