2009-06-26 79 views
1

我在Visual Studio 2008中工作,我希望在打開文件時運行Edit> Outlining> Collapse to Definitions來運行。如果在此之後所有地區都擴大了,那將會很好。我嘗試了Kyralessa在關於The Problem with Code Folding的評論中提供的代碼,並且該代碼非常適合作爲必須手動運行的宏。我試圖通過將以下代碼EnvironmentEvents模塊在宏IDE擴展這個宏作爲一個事件:EnvironmentEvent宏沒有完成

Public Sub documentEvents_DocumentOpened(ByVal Document As EnvDTE.Document) Handles DocumentEvents.DocumentOpened 
    Document.DTE.ExecuteCommand("Edit.CollapsetoDefinitions") 
    DTE.SuppressUI = True 
    Dim objSelection As TextSelection = DTE.ActiveDocument.Selection 
    objSelection.StartOfDocument() 
    Do While objSelection.FindText("#region", vsFindOptions.vsFindOptionsMatchInHiddenText) 
    Loop 
    objSelection.StartOfDocument() 
    DTE.SuppressUI = False 
End Sub 

然而,這似乎並沒有當我從我的解決方案打開一個文件做任何事VS.爲了測試這個宏是否正在運行,我在該子程序中輸入了MsgBox()語句,並注意到Document.DTE.ExecuteCommand("Edit.CollapsetoDefinitions")之前的代碼運行正常,但在該行之後似乎沒有任何結果。當我在子例程中調試並設置了一個斷點時,我會按F10繼續下一行,一旦ExecuteCommand行運行,控件就會離開子例程。儘管如此,這條線似乎什麼也不做,即它不會摺疊輪廓。

我也試過在子程序中只用DTE.ExecuteCommand("Edit.CollapsetoDefinitions")但沒有運氣。

這個問題試圖獲得與this one相同的最終結果,但我在問我在事件處理宏中可能做錯了什麼。

回答

4

問題在於事件觸發時文檔不是真正活動的。一個解決方案是使用「火一次」計時器來執行代碼的DocumentOpened事件之後的短暫延遲發生:

Dim DocumentOpenedTimer As Timer 

Private Sub DocumentEvents_DocumentOpened(ByVal Document As EnvDTE.Document) Handles DocumentEvents.DocumentOpened 
    DocumentOpenedTimer = New Timer(AddressOf ExpandRegionsCallBack, Nothing, 200, Timeout.Infinite) 
End Sub 

Private Sub ExpandRegionsCallBack(ByVal state As Object) 
    ExpandRegions() 
    DocumentOpenedTimer.Dispose() 
End Sub 

Public Sub ExpandRegions() 
    Dim Document As EnvDTE.Document = DTE.ActiveDocument 
    If (Document.FullName.EndsWith(".vb") OrElse Document.FullName.EndsWith(".cs")) Then 
     If Not DTE.ActiveWindow.Caption.ToUpperInvariant.Contains("design".ToUpperInvariant) Then 
      Document.DTE.SuppressUI = True 
      Document.DTE.ExecuteCommand("Edit.CollapsetoDefinitions") 
      Dim objSelection As TextSelection = Document.Selection 
      objSelection.StartOfDocument() 
      Do While objSelection.FindText("#region", vsFindOptions.vsFindOptionsMatchInHiddenText) 
      Loop 
      objSelection.StartOfDocument() 
      Document.DTE.SuppressUI = False 
     End If 
    End If 
End Sub 

我還沒有廣泛的測試,所以可能有一些錯誤...此外,我添加了一個檢查來驗證活動文檔是C#或VB源代碼(不是用VB進行測試),並且它不處於設計模式。
無論如何,希望它適用於你...

+0

聖潔的廢話,它的作品!我不得不在我的EnvironmentEvents宏中爲`Timer`和`Timeout`添加一個`Imports System.Threading`行,但它起作用!我現在打開我的CS文件,大約一秒之後,我的所有定義都崩潰了。謝謝! – 2009-07-10 13:52:11