0

Ich entwickle eine Visual Studio-Erweiterung, wo ich Elemente zum Kontextmenü (Rechtsklick) der Referenzen in einem Projekt hinzufügen. Dies geschieht, indem ein Group mit dem Elternteil IDM_VS_CTXT_REFERENCE definiert wird.Finden Sie heraus, welche Referenz in einer Visual Studio-Erweiterung geklickt wird

Ich mag die Menüelemente zeigen-ausblenden je nachdem, welche Referenz geklickt wurde, so definiere ich meinen Menüpunkt als 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); 
} 

Ich habe Mühe, das CommandVisible Verfahren. Sagen wir zum Beispiel, dass ich das Menü anzeigen möchte, wenn der Name der Referenz mit A beginnt. Wie würde ich das tun?

Ich fühle mich wie ich in der Hölle gefangen bin, stolpernd blind über willkürliche IDs, Guids und nicht existierende/unverständliche Dokumentation.

Ich habe es geschafft, das Projekt auszugraben meine Referenz ist als IVsProject und einige ID für die Referenz, aber Aufruf GetMkDocument gibt nichts zurück (es funktioniert mit Dateien im Projekt, aber nicht mit Referenzen).

Wie mache ich das? Wo finde ich Dokumentation dazu?

+0

GetMkDocument für aktuelle Dokumente nur dann gültig ist, sind die Referenzen nur eine visuelle Hilfe und sind nicht wirklich Dateien. Ich mache ein paar Tests, um zu sehen, ob ich dir helfen kann. –

+0

Arbeit kam, aber ich nahm es so weit wie Sie haben, der Schlüssel wird die IVsHierarchy-Methoden verwenden die itemid verwenden. Ich denke du bist auf dem richtigen Weg. –

Antwort

3

Endlich verstanden. Sobald Sie die IVsHierarchy und die Artikel-ID des ausgewählten Artikels haben, erhält diese Zeile den gewünschten Namen im out-Parameter.

hierarchy.GetProperty(itemid, (int)__VSHPROPID.VSHPROPID_Name, out name); 

vollständiger Code

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); 
} 
+0

Eine wichtige Anmerkung: Sie sollten Marshal aufrufen. Lassen Sie die Variable hierachyPtr los, sonst wird die COM-Referenz undicht und Sie haben ein Speicherleck. –

+0

Ja, Sie haben Recht, der Code ist ein Code-Schnipsel, also habe ich vergessen, das mit einzuschließen. Aktualisierung. –

+0

Vergessen Sie nicht, endlich Blöcke zu verwenden, falls etwas in der Mitte wirft. :-( –