使用Visual Studio扩展性SDK时,我有一个ProjectItem
的实例。我正试图从这个项目中获取文本,以便我可以对其进行一些替换。我看到这样做的方式是使用DTE2.ActiveDocument.Selection
上的属性。但是,DTE2.ActiveDocument
不是我需要的文档,所以我不能使用它。当我尝试访问包含Selection
属性的ProjectItem.Document
对象时,文档始终为null,并且我得到一个空引用异常。我也尝试了以下不起作用(即Document
有效,但Selection
属性为空):
Document document = null;
if (!projectItem.IsOpen)
document = projectItem.Open().Document;
我尝试了以下但是它没有给我正确的文档,因为我正在处理的ProjectItem不是活动文档。有没有办法实现类似于以下使用ProjectItem.Document
的代码?
TextSelection selection = DTE2.ActiveDocument.Selection;
selection.SelectAll();
string text = selection.Text;
selection.Delete();
//Do replacements
selection.Insert(text);
总结一下,如何从ProjectItem实例获取TextSelection实例?
答案 0 :(得分:1)
与处理VS SDK一样,答案有点模糊。我解决它的方式(对或错)是使ProjectItem实例成为活动文档,然后使用DTE2.ActiveDocument.Selection
属性来获取文本。这可以通过以下方式完成:
if (!projectItem.IsOpen)
projectItem.Open(@"{7651A701-06E5-11D1-8EBD-00A0C90F26EA}").Document.Activate(); //EnvDTE.Constants.vsViewKindCode
TextSelection selection = _vsApp.ActiveDocument.Selection;
selection.SelectAll();
string text = selection.Text;
selection.Delete();
//Do replacements
text = ReplaceTemplateValues(text, replacements);
selection.Insert(text);
有更好的方法吗?