我正在开发一个Visual Studio扩展,我在其中向项目中引用的右键单击(上下文)菜单添加元素。这是通过使用Group
的父级定义IDM_VS_CTXT_REFERENCE
来完成的。
我想根据点击的引用显示隐藏菜单元素,因此我将菜单项定义为OleMenuCommand
:
if (commandService != null)
{
var menuCommandID = new CommandID(CommandSet, CommandId);
var menuItem = new OleMenuCommand(this.MenuItemCallback, menuCommandID);
menuItem.BeforeQueryStatus += (sender, args) =>
{
var button = (OleMenuCommand)sender;
button.Visible = this.CommandVisible();
};
commandService.AddCommand(menuItem);
}
我无法实施CommandVisible
方法。让我们举例说明,如果引用的名称以A
开头,我想显示菜单。我该怎么做?
我觉得我被困在interop hell地狱中,盲目地绊倒了任意的ids,guids和不存在/难以理解的文档。
我设法将我的引用项目作为IVsProject
和一些id作为参考,但是调用GetMkDocument
不返回任何内容(它适用于项目中的文件但不适用于引用)。
我该怎么做?我在哪里可以找到有关如何执行此操作的文档?
答案 0 :(得分:3)
终于明白了。一旦你拥有所选项目的IVsHierarchy和itemid,这一行就会在out参数中获得你想要的名字。
hierarchy.GetProperty(itemid, (int)__VSHPROPID.VSHPROPID_Name, out name);
完整代码
object name;
uint itemid = VSConstants.VSITEMID_NIL;
IVsMultiItemSelect multiItemSelect = null;
IntPtr hierarchyPtr = IntPtr.Zero;
IntPtr selectionContainerPtr = IntPtr.Zero;
try
{
var monitorSelection = Package.GetGlobalService( typeof( SVsShellMonitorSelection ) ) as IVsMonitorSelection;
monitorSelection.GetCurrentSelection( out hierarchyPtr, out itemid, out multiItemSelect, out selectionContainerPtr );
hierarchy = Marshal.GetObjectForIUnknown( hierarchyPtr ) as IVsHierarchy;
hierarchy.GetProperty(itemid, (int)__VSHPROPID.VSHPROPID_Name, out name);
}finally
{
if (selectionContainerPtr != IntPtr.Zero)
Marshal.Release( selectionContainerPtr );
if (hierarchyPtr != IntPtr.Zero)
Marshal.Release( hierarchyPtr );
}