1

我在 Visual Studio 2008 中工作,我希望在打开文件时运行 Edit > Outlining > Collapse to Definitions。如果在那之后,所有地区都扩大了,那就太好了。我尝试了 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")在子例程中使用,但没有运气。

这个问题试图获得与这个问题相同的最终结果但我问的是我在事件处理宏中可能做错了什么。

4

1 回答 1

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

于 2009-07-09T22:19:46.510 回答