我正在嘗試爲「項目和解決方案上下文菜單>解決方案」菜單創建附加菜單項。不過,我希望這個上下文菜單隻在打開某個解決方案時出現,否則我不希望它顯示。我想我可以在Visual Studio IDE中使用MACROS。有些事件在開放的解決方案&項目上運行等我可以通過編程修改IDE的上下文菜單嗎?
我的問題是,我可以創建上下文菜單我想編程方式,將其指向我希望它運行的MACRO,然後以編程方式將它附加到IDE中的CONTEXT菜單,我想要顯示它?
我正在嘗試爲「項目和解決方案上下文菜單>解決方案」菜單創建附加菜單項。不過,我希望這個上下文菜單隻在打開某個解決方案時出現,否則我不希望它顯示。我想我可以在Visual Studio IDE中使用MACROS。有些事件在開放的解決方案&項目上運行等我可以通過編程修改IDE的上下文菜單嗎?
我的問題是,我可以創建上下文菜單我想編程方式,將其指向我希望它運行的MACRO,然後以編程方式將它附加到IDE中的CONTEXT菜單,我想要顯示它?
我找到了我的問題的答案。我用下面的代碼來創建我需要的菜單項:
Private WithEvents _objSolutionExplorer_ContextMenu_ItemHandler As EnvDTE.CommandBarEvents
Private _objHash_ContextMenuItemHandlers As New Hashtable
Private Function CreateContextMenuButtonItem(ByVal p_objMenuItem As Object, ByVal p_strMenuItemCaption As String) As CommandBarButton
'************************************************************************
' Procedure/Function: CreateContextMenuButtonItem()
' Author: Ben Santiago
' Created On: 08/18/2011
' Description:
' Creates specified MenuButton item.
'************************************************************************
'***************************************
' Initialize Variables
'***************************************
Dim objMenuButton As CommandBarButton
Dim objClickEventHandler As EnvDTE.CommandBarEvents
'***************************************
' If MenuItem Exists, Delete It
'***************************************
For intCounter As Integer = 1 To p_objMenuItem.Controls.Count
If p_objMenuItem.Controls.Item(intCounter).Caption = p_strMenuItemCaption Then
p_objMenuItem.Controls.Item(intCounter).Delete()
Exit For
End If
Next
If EnvironmentEvents._objHash_ContextMenuItemHandlers.Contains(p_strMenuItemCaption) Then
EnvironmentEvents._objHash_ContextMenuItemHandlers.Remove(p_strMenuItemCaption)
End If
'***************************************
' Create New Menu Item w/ Click Event Handling
'***************************************
objNewMenuItem = p_objMenuItem.Controls.Add(MsoControlType.msoControlButton, System.Reflection.Missing.Value, System.Reflection.Missing.Value, 1, True)
objNewMenuItem.Caption = p_strMenuItemCaption
objClickEventHandler = DTE.Events.CommandBarEvents(objNewMenuItem)
AddHandler objClickEventHandler.Click, AddressOf TestScoring_objSolutionExplorer_ContextMenu_ItemHandler_Click
If EnvironmentEvents._objHash_ContextMenuItemHandlers.Contains(p_strMenuItemCaption) Then
EnvironmentEvents._objHash_ContextMenuItemHandlers.Remove(p_strMenuItemCaption)
End If
EnvironmentEvents._objHash_ContextMenuItemHandlers.Add(p_strMenuItemCaption, objClickEventHandler)
'***************************************
' Return Reference To MenuButton Item
'***************************************
Return objNewMenuItem
End Function
Private Function CreateContextMenuPopupItem(ByVal p_strCommandBarName As String, ByVal p_strMenuCaption As String) As CommandBarPopup
'************************************************************************
' Procedure/Function: CreateContextMenuPopupItem()
' Author: Ben Santiago
' Created On: 08/18/2011
' Description:
' Creates specified MenuPopup item.
'************************************************************************
'***************************************
' Initialize Variables
'***************************************
Dim objCommandBar As CommandBar = DTE.CommandBars(p_strCommandBarName)
Dim objMenuPopup As CommandBarPopup
'***************************************
' Search For Existing ContextMenuPopup
'***************************************
For intCounter As Integer = 1 To objCommandBar.Controls.Count
If objCommandBar.Controls.Item(intCounter).Caption = p_strMenuCaption Then
objMenuPopup = objCommandBar.Controls.Item(intCounter)
Exit For
End If
Next
If objMenuPopup Is Nothing Then
'***************************************
' Create Menu If Needed
'***************************************
objMenuPopup = objCommandBar.Controls.Add(MsoControlType.msoControlPopup, System.Reflection.Missing.Value, System.Reflection.Missing.Value, 1, True)
objMenuPopup.Caption = p_strMenuCaption
Else
'***************************************
' Delete All Child Menu Items
'***************************************
For intCounter As Integer = objMenuPopup.Controls.Count To 1 Step -1
If EnvironmentEvents._objHash_ContextMenuItemHandlers.Contains(objMenuPopup.Controls.Item(intCounter).Caption) Then
EnvironmentEvents._objHash_ContextMenuItemHandlers.Remove(objMenuPopup.Controls.Item(intCounter).Caption)
End If
objMenuPopup.Controls.Item(intCounter).Delete()
Next
End If
'***************************************
' Return Reference To MenuPopup Item
'***************************************
Return objMenuPopup
End Function
您可以使用DTE.ExecuteCommand()
來執行其他宏。
我發現this link是非常有用。
裏面的OnConnection方法,我有這樣的:
CommandBars cmdBars = (CommandBars)applicationObject.CommandBars;
CommandBar codeWindowCmdBar = cmdBars["Code Window"];
CommandBarPopup doxygenPopup = (CommandBarPopup)codeWindowCmdBar.Controls.Add(MsoControlType.msoControlPopup,
System.Reflection.Missing.Value,
System.Reflection.Missing.Value,
1,
true);
doxygenPopup.Caption = "Doxygen Commenting";
CommandBarControl mnuListItem = (CommandBarControl)doxygenPopup.Controls.Add(MsoControlType.msoControlButton,
System.Reflection.Missing.Value,
System.Reflection.Missing.Value,
1,
true);
mnuListItem.Caption = "Wrap as List Item";
mnuListItemHandler = (CommandBarEvents) applicationObject.Events.get_CommandBarEvents(mnuListItem);
mnuListItemHandler.Click += mnuListItemHandler_Click;
CommandBarControl mnuUnorderedList = (CommandBarControl)doxygenPopup.Controls.Add(MsoControlType.msoControlButton,
System.Reflection.Missing.Value,
System.Reflection.Missing.Value,
2,
true);
mnuUnorderedList.Caption = "Wrap as Unordered List";
mnuUnorderedListHandler = (CommandBarEvents)applicationObject.Events.get_CommandBarEvents(mnuListItem);
mnuUnorderedListHandler.Click += mnuUnorderedListHandler_Click;
CommandBarControl mnuOrderedList = (CommandBarControl)doxygenPopup.Controls.Add(MsoControlType.msoControlButton,
System.Reflection.Missing.Value,
System.Reflection.Missing.Value,
2,
true);
mnuOrderedList.Caption = "Wrap as Ordered List";
mnuOrderedListHandler = (CommandBarEvents)applicationObject.Events.get_CommandBarEvents(mnuListItem);
mnuOrderedListHandler.Click += mnuOrderedListHandler_Click;
click事件處理程序我做任何需要的內部。
請注意,這是一個包含子項目的主菜單項。對於只有一個項目,請查看this video。這傢伙一步一步地走了......做得很好。