2012-11-04 60 views

回答

0

在您的OnBeforeQueryStatus方法中,您需要獲取當前選定的對象並確定文件類型,然後可以設置MenuCommand的Visible屬性。

要啓用OnBeforeQueryStatus您需要將以下屬性添加到您的包:

[ProvideAutoLoad(Microsoft.VisualStudio.Shell.Interop.UIContextGuids.SolutionExists)] 
public sealed class YourPackage : Package 

然後在你的命令構造函數,你需要將回調綁定到BeforeQueryStatus

... 
    var commandService = this.ServiceProvider.GetService(typeof(IMenuCommandService)) as OleMenuCommandService; 
    if (commandService == null) return; 
    var menuCommandId = new CommandID(CommandSet, CommandId); 
    var menuItem = new OleMenuCommand(this.MenuItemCallback, menuCommandId); 
    menuItem.BeforeQueryStatus += 
     new EventHandler(OnBeforeQueryStatus); 
    commandService.AddCommand(menuItem); 
... 

OnBeforeQueryStatus:

private void OnBeforeQueryStatus(object sender, EventArgs e) 
{ 
    var myCommand = sender as OleMenuCommand; 
    if (null == myCommand) return; 
    var selectedObject = Util.GetProjectItem(); 
    myCommand.Visible = selectedObject.Name.EndsWith(".cs") && this.Enabled; 
} 

GetProjectItem:

public static ProjectItem GetProjectItem() 
{ 
    IntPtr hierarchyPointer, selectionContainerPointer; 
    Object selectedObject = null; 
    IVsMultiItemSelect multiItemSelect; 
    uint projectItemId; 

    var monitorSelection = 
     (IVsMonitorSelection)Package.GetGlobalService(
      typeof(SVsShellMonitorSelection)); 

    monitorSelection.GetCurrentSelection(out hierarchyPointer, 
     out projectItemId, 
     out multiItemSelect, 
     out selectionContainerPointer); 

    var selectedHierarchy = Marshal.GetTypedObjectForIUnknown(
     hierarchyPointer, 
     typeof(IVsHierarchy)) as IVsHierarchy; 

    if (selectedHierarchy != null) 
    { 
     ErrorHandler.ThrowOnFailure(selectedHierarchy.GetProperty(
      projectItemId, 
      (int)__VSHPROPID.VSHPROPID_ExtObject, 
      out selectedObject)); 

    } 
    return selectedObject as ProjectItem; 
} 

,並與所有的,你應該只看到你的項目文件與.cs

相關問題