2009-06-26 10 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

이런 젠장, 작동! 환경 이벤트 매크로에'Timer'와'Timeout'을위한'Imports System.Threading' 라인을 추가해야했습니다,하지만 작동합니다! 내 CS 파일을 열고 약 1 초 후에 모든 정의가 무너집니다. 감사! –

+0

새로운 솔루션을 열었을 때 마지막으로 열어 본 파일을 기억할 때 매크로 IDE가 오류 때문에 닫아야한다는 것을 알게되었습니다. –

+0

그래, 나도 오류가있어. 나는 문제를 풀려고했지만 해결책을 찾지 못했고 이미 너무 많은 시간을 소비했다. 내가 다른 것을 생각하면 나는 그것을 게시 할 것이다. 그 동안 기능을 활성화/비활성화하고 키보드 단축키에 바인딩하기 위해 부울 (Solution_Opened 이벤트에서 false로 설정)을 사용할 수 있습니다. –

관련 문제