1

Visual Studio 2008で作業していて、ファイルを開くたびに[編集]>[アウトライン]>[定義に折りたたむ]を実行したいと思います。その後、すべての地域が拡大されればいいのにと思います。KyralessaがTheProblemwith 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

問題は、イベントが発生したときにドキュメントが実際にはアクティブではないことです。1つの解決策は、「1回起動」タイマーを使用して、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 に答える