(Да, я знаю, что вы пометили другой ответ как принятый, но технически он не отвечал на ваш вопрос о кодировании, хотя он и дал вам ответ. Однако это то, что вы изначально спрашивали.)
На самом деле, я не думаю, что это сработало бы в любой версии Visual Studio, потому что логика в вашей функции Collapse неверна. То же самое с начальным циклом в проекте (который я не уверен, почему вы все равно не передали узел решения в функцию свертывания ...)
В частности, вы проверяете, развернуто ли оно, прежде чем углубляться в дочерние элементы, поэтому, если папка свернута, но ее дочерние элементы развернуты, она не войдет внутрь и не свернет дочерние элементы, поскольку ваша проверка приводит к пропуску. Просто проверьте счет. В конце концов, вы хотите вникнуть во все, что рухнуло.
Вот версия, которую я создал, используя вашу в качестве отправной точки. Я также добавил возможность повторно выбрать выбранный элемент, если он есть. Мне нравится, когда предмет, над которым я работаю, выбран. И если я хочу, чтобы все было свернуто, я либо выбираю корневой узел, либо отменяю выбор всего, в обоих случаях он затем выбирает корень (узел решения).
Я также добавил функцию MultiBeep для звуковой обратной связи, так как я не фанат окон сообщений. 2 сигнала - это успех, 3 означает, что у вас нет открытого решения.
Sub CollapseSolutionTree()
' Get the the Solution Explorer tree
Dim SolutionExplorer As UIHierarchy = DTE.Windows.Item(Constants.vsext_wk_SProjectWindow).Object()
' Check if there is any open solution
If (SolutionExplorer.UIHierarchyItems.Count = 0) Then
MultiBeep(3)
Return
End If
' Get the selected node (if any)
Dim SelectedNode As UIHierarchyItem
Try
SelectedNode = SolutionExplorer.SelectedItems(0)
Catch
End Try
' Get the top node (the name of the solution)
Dim SolutionNode As UIHierarchyItem = SolutionExplorer.UIHierarchyItems.Item(1)
SolutionNode.DTE.SuppressUI = True
' Collapse the solution tree
CollapseSolutionExplorerNode(SolutionNode)
' If there was a selected item before the command, re-select it. Otherwise select the solution node.
If SelectedNode isnot Nothing
SelectedNode.Select(vsUISelectionType.vsUISelectionTypeSelect)
Else
SolutionNode.Select(vsUISelectionType.vsUISelectionTypeSelect)
End If
SolutionNode.DTE.SuppressUI = False
MultiBeep(2)
End Sub
Private Sub CollapseSolutionExplorerNode(ByVal Folder As UIHierarchyItem)
For Each Subfolder As UIHierarchyItem In Folder.UIHierarchyItems
If Subfolder.UIHierarchyItems.Count Then CollapseSolutionExplorerNode(Subfolder)
Next
Folder.UIHierarchyItems.Expanded = False
End Sub
Private Sub MultiBeep(Count As Integer, Optional Spacing As Integer = 100)
Beep
For I = 2 to Count
System.Threading.Thread.CurrentThread.Sleep(Spacing)
Beep
Next
End Sub
НТН,
Mark