2009-06-26 25 views
1

私はVisual Studio 2008で作業していますが、ファイルを開くたびに編集>アウトライン>定義に折りたたみを行いたいと思います。その後、すべての地域が拡大されればそれはいいだろう。私は、KyralessaがThe Problem with Code Foldingのコメントで提供したコードを試しました。これは、手動で実行する必要があるマクロとして非常にうまく機能します。私はマクロIDEでEnvironmentEventsモジュールに次のコードを配置することによって、イベントとして動作するように、このマクロを拡大しようとした: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

問題は、イベントが発生したときにドキュメントが実際にアクティブではないことです。また、...私は徹底的にそれをテストしていない

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 

ので、いくつかのバグがあるかもしれません:一つの解決策は、DocumentOpenedイベント後の短い遅延が発生したコードを実行するためにタイマー「一度火」を使用することですアクティブなドキュメントがC#またはVBのソースコード(VBではテストされていない)であり、デザインモードではないことを確認するためのチェックを追加しました。
とにかく、それがあなたのために働くことを願って...

+0

うわー、それは動作します! EnvironmentEventsマクロに 'Timer'と' Timeout'の 'Imports System.Threading'行を追加する必要がありましたが、それは動作します! CSファイルを開き、約1秒後にすべての定義が崩壊します。ありがとう! –

+0

私は、新しいソリューションを開いたときに、前回開いたファイルを覚えていて、エラーのためにマクロIDEを終了しなければならないことに気付きました。 –

+0

うん、私もエラーがある。私はこの問題を解決しようとしましたが、解決策を見つけることができず、すでに多くの時間を費やしていました。もし私が何か他のことを考えるなら、私はそれを投稿します。その間、機能を有効/無効にしてキーボードショートカットにバインドするには、ブール値(Solution_Openedイベントでfalseに設定)を使用するだけです。 –

関連する問題