2015-04-26 28 views
6

Mit Microsoft.Vbe.Interop in C# kann ich auf CommandBarEvents und ReferencesEvents über VBE.Events zugreifen.Wo sind die VBProjectsEvents?

jedoch die immer so hilfreich MSDN Dokumentation scheint darauf hinzudeuten, dass es ein VBProjectsEvents, dass ich meine Add-In, wenn ein Projekt zum/vom VBE hinzugefügt oder entfernt wird, benachrichtigen, verwenden könnte ... das ist genau das, was ich Ich versuche hier zu erreichen.

kann ich diese _VBProjectsEvents Schnittstelle in dem für sie Objekt-Browser, aber keine Implementierung sehen (in Bezug auf die _CommandBarControlsEvents Schnittstelle gegenüber, die durch die CommandBarEventsClass implementiert), die mit ReSharper zu Features Umsetzung gehen.

Gibt es eine Implementierung der _VBProjectsEvents Schnittstelle irgendwo? Wenn nicht, wie wird man dann über ein VBProject informiert, das aus der IDE entfernt wird?

Antwort

2

Sie müssen eine Senke für diese Ereignisse erstellen.

Umsetzung der _dispVBProjectsEvents Dispatch-Schnittstelle - hier ist eine Implementierung, die durch den Aufruf regelmäßig verwaltet .net Ereignisse auf diese Ereignisse reagiert, effektiv „Wrapping“ die VBProjects Ereignisse:

public class VBProjectsEventsSink : _dispVBProjectsEvents 
{ 
    public event EventHandler<DispatcherEventArgs<VBProject>> ProjectAdded; 
    public void ItemAdded(VBProject VBProject) 
    { 
     if (VBProject.Protection == vbext_ProjectProtection.vbext_pp_none) 
     { 
      OnDispatch(ProjectAdded, VBProject); 
     } 
    } 

    public event EventHandler<DispatcherEventArgs<VBProject>> ProjectRemoved; 
    public void ItemRemoved(VBProject VBProject) 
    { 
     if (VBProject.Protection == vbext_ProjectProtection.vbext_pp_none) 
     { 
      OnDispatch(ProjectRemoved, VBProject); 
     } 
    } 

    public event EventHandler<DispatcherRenamedEventArgs<VBProject>> ProjectRenamed; 
    public void ItemRenamed(VBProject VBProject, string OldName) 
    { 
     var handler = ProjectRenamed; 
     if (handler != null && VBProject.Protection == vbext_ProjectProtection.vbext_pp_none) 
     { 
      handler.Invoke(this, new DispatcherRenamedEventArgs<VBProject>(VBProject, OldName)); 
     } 
    } 

    public event EventHandler<DispatcherEventArgs<VBProject>> ProjectActivated; 
    public void ItemActivated(VBProject VBProject) 
    { 
     if (VBProject.Protection == vbext_ProjectProtection.vbext_pp_none) 
     { 
      OnDispatch(ProjectActivated, VBProject); 
     } 
    } 

    private void OnDispatch(EventHandler<DispatcherEventArgs<VBProject>> dispatched, VBProject project) 
    { 
     var handler = dispatched; 
     if (handler != null) 
     { 
      handler.Invoke(this, new DispatcherEventArgs<VBProject>(project)); 
     } 
    } 
} 

Die DispatcherEventArgs Klasse ist nur eine bequeme Möglichkeit, Setzen sie den VBProject Artikel mit dem Ereignis beteiligt, und es kann für andere Senken wiederverwendet werden:

public class DispatcherEventArgs<T> : EventArgs 
    where T : class 
{ 
    private readonly T _item; 

    public DispatcherEventArgs(T item) 
    { 
     _item = item; 
    } 

    public T Item { get { return _item; } } 
} 

der Client-Code die Senke registrieren muss - und für dass Sie benötigen ein IConnectionPoint Feld und seine int Cookie zu halten:

private readonly IConnectionPoint _projectsEventsConnectionPoint; 
private readonly int _projectsEventsCookie; 

Die VBProjects Sammlung implementiert die IConnectionPointContainer-Schnittstelle, die Sie verwenden müssen, den Verbindungspunkt finden:

var sink = new VBProjectsEventsSink(); 
var connectionPointContainer = (IConnectionPointContainer)_vbe.VBProjects; 
var interfaceId = typeof (_dispVBProjectsEvents).GUID; 
connectionPointContainer.FindConnectionPoint(ref interfaceId, out _projectsEventsConnectionPoint); 

Sobald Sie Verwenden Sie die IConnectionPoint, verwenden Sie die Advise Methode, um Ihre Spüle "verbinden" und rufen Sie Cookie:

_projectsEventsConnectionPoint.Advise(sink, out _projectsEventsCookie); 

Und dann können Sie die Spüle Ereignisse behandeln wie jedes „normale“ .net Ereignisse:

sink.ProjectAdded += sink_ProjectAdded; 
sink.ProjectRemoved += sink_ProjectRemoved; 
sink.ProjectActivated += sink_ProjectActivated; 
sink.ProjectRenamed += sink_ProjectRenamed; 

Wenn Sie Ihr Waschbecken trennen möchten, übergeben Sie das Cookie zum Unadvise Verfahren das IConnectionPoint Beispiel: "so einfach ist die"

_projectsEventsConnectionPoint.Unadvise(_projectsEventsCookie); 

+0

Sind Ihnen Ereignisse bekannt, die das Öffnen und Schließen von CodePane-Objekten verfolgen? Ich habe hier eine neue Frage gepostet: [Ereignis beim Schließen oder Öffnen eines CodePane] (https://Stackoverflow.com/q/44391917/154439). – mwolfe02