私は、アクティブなドキュメントがテキストドキュメント(Visual Studioの "Toggle Bookmark"など)の場合にのみ、実装されたコマンドの1つを使用できるようにするVisual Studio拡張機能を開発しています。問題は、そのような場合にどのように通知するのか分かりません。アクティブなドキュメントがテキストドキュメントであるかどうかを確認するには?
今は半分の解決策があります。パッケージのInitialize
方法では、私は、DTEのWindowActivated
イベントをサブスクライブし、ウィンドウがアクティブになるたびウィンドウDocumentData
プロパティがタイプTextDocument
であるならば、私がチェックします。
protected override void Initialize()
{
base.Initialize();
var dte = Package.GetGlobalService(typeof(EnvDTE.DTE)) as EnvDTE.DTE;
dte.Events.WindowEvents.WindowActivated += WindowEventsOnWindowActivated;
//More initialization here...
}
//This is checked from command's BeforeQueryStatus
public bool ActiveDocumentIsText { get; private set; } = false;
private void WindowEventsOnWindowActivated(Window gotFocus, Window lostFocus)
{
if (gotFocus.Kind != "Document")
return; //It's not a document (e.g. it's a tool window)
TextDocument textDoc = gotFocus.DocumentData as TextDocument;
ActiveDocumentIsText = textDoc != null;
}
このアプローチの問題点は、1)Window.DocumentData is documented as ".NET Framework internal use only"で、 2)これは、コード・ビューとデザイン・ビューの両方を持つ文書(例えば、.visxmanifest
ファイル)がデザイン・モードで開いているときに誤ったポジティブを示します。
私もIVsTextManager.GetActiveViewを使用しようとしましたが、これは最後アクティブなテキストビューが開いて戻っている - ので、私はその後、.txtファイルと.pngのファイルを開く場合は、それも.txtファイルのデータを返しますそれはもはやアクティブな文書ではない場合。
アクティブなドキュメントがテキストドキュメントであるか、デザイナを持つことができるドキュメントのコードビューであるかを確認するにはどうしたらいいですか?可能であれば、ドキュメント化されていないクラスやメンバを使用しないでください。
更新日:少し良い解決策が見つかりました。ウィンドウに起動されるハンドラ内:
ActiveDocumentIsText = gotFocus.Document.Object("TextDocument") != null;
少なくともthis one is properly documentedが、私はまだデザイナーと偽陽性の問題を抱えています。