我正在開發一個Visual Studio擴展,其中一個實現的命令只有在活動文檔是文本文檔時纔可用(例如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,但我仍然有設計師誤報的問題。