我在Visual Studio 2008中工作,我想要编辑>概述>折叠到我打开文件时要运行的定义。如果在此之后所有地区都扩大了,那就太好了。我尝试了Kyralessa在The Problem with Code Folding评论中提供的代码,这非常适合作为我必须手动运行的宏。我尝试通过将以下代码放在宏IDE的EnvironmentEvents模块中来扩展此宏以充当事件:
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相同的最终结果,但我在询问我在事件处理宏中可能出错的地方。
答案 0 :(得分:4)
问题是当事件触发时文档不是真正活动的。一种解决方案是在DocumentOpened事件发生后使用“fire once”计时器执行代码一小段时间:
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测试)并且它不是在设计模式中 无论如何,希望它对你有用......