2015-04-26 31 views
6

C# Microsoft.Vbe.Interop kullanarak VBE.Events aracılığıyla CommandBarEvents ve ReferencesEvents erişebilirsiniz.VBProjectsEvents nerede?

Ancak, bu kadar yararlı olan MSDN belgeleri, bir proje eklendiğinde veya VBE'ye/grubundan kaldırıldığında eklentimi bilgilendirmek için kullanabileceğim bir VBProjectsEvents olduğunu gösterir gibi görünüyor. Burada ulaşmaya çalışıyorum.

Ben ReSharper en uygulama özelliği gitmek kullanarak nesne tarayıcısında o _VBProjectsEvents arayüzü, ancak (CommandBarEventsClass tarafından uygulanan _CommandBarControlsEvents arayüzüne, aksine) onun için hiçbir uygulama görebilirsiniz.

_VBProjectsEvents arabiriminin bir uygulaması var mı? Aksi halde, IDE'den kaldırılan bir VBProject hakkında bilgilendirilmek nasıl gerçekleşir?

cevap

2

Bu etkinlikler için havuzu oluşturmanız gerekir.

_dispVBProjectsEvents sevk arabirimini uygular - burada düzenli yönetilen .net olayları etkili "sarma" VBProjects olaylar çağırarak bu olaylara yanıt veren bir uygulama var:

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

DispatcherEventArgs sınıf için güvenli bir yoldur olayla ilgili VBProject öğeyi maruz ve diğer lavabolar için yeniden kullanılabilir: istemci kod havuzunu kaydetme ihtiyacı

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

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

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

- ve için Bir kere sen

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

:

private readonly IConnectionPoint _projectsEventsConnectionPoint; 
private readonly int _projectsEventsCookie; 

VBProjects koleksiyon bağlantı noktasını bulmak için kullanmanız gereken IConnectionPointContainer arabirimini uygular: Bir IConnectionPoint alan ve int çerez tutmak gerektiğini IConnectionPoint numaralı telefonu kullanın, evyenizi "bağlamak" için Advise yöntemini kullanın ve tanımlama:

_projectsEventsConnectionPoint.Advise(sink, out _projectsEventsCookie); 

Ve herhangi bir "normal" .net olaylar gibi o zaman lavabo olayları işleyebilir: Eğer lavabo bağlantısını kesmek istediğinizde

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

, sen çerezUnadvise yönteme geçmesi IConnectionPoint örneğinin: "bu kadar basit"

_projectsEventsConnectionPoint.Unadvise(_projectsEventsCookie); 

+0

CodePane nesnelerini açmak ve kapatmak için herhangi bir olaydan haberiniz var mı? Burada yeni bir soru yayınladım: [CodePane'i kapatırken veya açarken oluşan olay] (https://stackoverflow.com/q/44391917/154439). – mwolfe02