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