EnvironmentEvent宏未完成

时间:2009-06-26 19:52:45

标签: vb.net visual-studio-2008 macros event-handling outlining

我在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相同的最终结果,但我在询问我在事件处理宏中可能出错的地方。

1 个答案:

答案 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测试)并且它不是在设计模式中 无论如何,希望它对你有用......