2

Visual Studio 拡張性 SDK を使用すると、ProjectItem. このアイテムからテキストを取得しようとしているので、いくつかの置換を行うことができます。私が見た方法は、 のプロパティを使用することDTE2.ActiveDocument.Selectionです。しかし、これDTE2.ActiveDocumentは必要なドキュメントではないため、使用できません。ProjectItem.Documentプロパティを含むオブジェクトにアクセスしようとするとSelection、ドキュメントは常に null になり、null 参照例外が発生します。また、機能しない次のことも試しました(つまり、Document有効ですが、Selectionプロパティがnullです):

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 インスタンスを取得するにはどうすればよいですか?

4

1 に答える 1

2

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

より良い方法はありますか?

于 2012-12-05T12:27:53.203 に答える