Макрос EnvironmentEvent не завершен - PullRequest
1 голос
/ 26 июня 2009

Я работаю в Visual Studio 2008 и хотел бы, чтобы меню «Правка»> «Контуры»> «Свернуть до определений» запускалось при каждом открытии файла. Было бы хорошо, если бы после этого все регионы были расширены. Я попробовал код, который Kyralessa предложил в комментарии к Проблема со складыванием кода , и он очень хорошо работает как макрос, который мне нужно запустить вручную. Я попытался расширить этот макрос, чтобы он действовал как событие, поместив следующий код в модуль EnvironmentEvents в IDE макроса:

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") в подпрограмме, но безуспешно.

Этот вопрос пытается получить тот же конечный результат, что и этот , но я спрашиваю о том, что я могу делать неправильно в моем макросе обработки событий.

1 Ответ

4 голосов
/ 10 июля 2009

Проблема в том, что документ не активен, когда происходит событие. Одним из решений является использование таймера «один раз» для выполнения кода с небольшой задержкой после наступления события 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), и что в режиме конструктора.
Во всяком случае, надеюсь, что это работает для вас ...

...