VS 2013 SDK:句柄代码窗口';上下文菜单打开事件
本文关键字:上下文 菜单 事件 SDK 2013 句柄 窗口 代码 VS | 更新日期: 2023-09-27 18:02:00
在C#或VB.Net中,使用Visual Studio包,如何处理当前代码窗口编辑器的上下文菜单打开和/或完全打开时引发的事件?。
我的意图是通过评估上下文菜单打开或完全打开时的条件,任意启用/禁用CommandBarPopup
菜单内的CommandBarButton
按钮。
但我找不到任何关于这方面的信息,无论是事件名称还是SDK中的哪个类都不涉及这个问题。
更新
这是一个遵循@Carlos Quintero指示的代码示例,但是,在我按下一次按钮并完成回调之前,BeforeQueryStatus
事件永远不会引发,为什么?如何修复?。
正如我所说,当代码编辑器的上下文菜单打开时,我需要能够控制按钮状态(启用/禁用(。
Protected Overrides Sub Initialize()
Debug.WriteLine(String.Format(CultureInfo.CurrentCulture, "Entering Initialize() of: {0}", Me.GetType().Name))
MyBase.Initialize()
' Add our command handlers for menu (commands must exist in the .vsct file)
Dim mcs As OleMenuCommandService = TryCast(GetService(GetType(IMenuCommandService)), OleMenuCommandService)
If Not mcs Is Nothing Then
' Create the command for the menu item.
Dim menuCommandID As New CommandID(GuidList.GuidSnippetToolCmdSet, CInt(PkgCmdIDList.cmdidMyCommand))
Dim menuItem As New OleMenuCommand(New EventHandler(AddressOf MenuItemCallback), menuCommandID)
AddHandler menuItem.BeforeQueryStatus, AddressOf OnBeforeQueryStatus
mcs.AddCommand(menuItem)
End If
End Sub
Private Sub MenuItemCallback(ByVal sender As Object, ByVal e As EventArgs)
' Show a Message Box to prove we were here
Dim uiShell As IVsUIShell = TryCast(GetService(GetType(SVsUIShell)), IVsUIShell)
Dim clsid As Guid = Guid.Empty
Dim result As Integer
Microsoft.VisualStudio.ErrorHandler.ThrowOnFailure(uiShell.ShowMessageBox(0, clsid, "Snippet Tool", String.Format(CultureInfo.CurrentCulture, "Inside {0}.MenuItemCallback()", Me.GetType().Name), String.Empty, 0, OLEMSGBUTTON.OLEMSGBUTTON_OK, OLEMSGDEFBUTTON.OLEMSGDEFBUTTON_FIRST, OLEMSGICON.OLEMSGICON_INFO, 0, result))
End Sub
Private Sub OnBeforeQueryStatus(ByVal sender As Object, ByVal e As EventArgs)
Dim myCommand As OleMenuCommand = TryCast(sender, OleMenuCommand)
' Alternate the command enable, just for testing.
myCommand.Enabled = Not myCommand.Enabled
End Sub
上下文菜单没有这样的事件。当发生某些事情(例如显示上下文菜单、更改选择、关闭解决方案等(时,VS会查询所有命令的状态。
执行所需操作的方法是使用OleMenuCommand,BeforeQueryStatus事件。在这种情况下(您不知道是什么原因导致的(,您可以根据您的条件设置命令的属性(已启用、可见等(。请参阅:如何:在VSPackages(C#(中创建和处理命令