2011-02-05 13 views
8

Başımı WPF'ye özgü bazı nesnelerin etrafına sarmaya çalışıyorum ve henüz UIElement.AddHandler yöntemi ile EventManager.RegisterClassHandler yöntemi arasındaki somut ilişkiyi bulmaya çalışıyorum.Bir sınıf dinleyicisi ve WPF'deki örnek bir liste arasındaki fark nedir?

Biraz googled ve bu ilginç MSDN makalesine bulduk: İşte

http://msdn.microsoft.com/en-us/library/ms747183.aspx

belirtir: sınıf dinleyici ve örneğin:

"Yönlendirilmiş olayları olaya dinleyicilerin iki farklı türde düşünün Sınıf dinleyicileri, türlerin belirli bir EventManager API'si olan RegisterClassHandler'ı statik yapıcıları olarak adlandırdığı veya bir öğe sınıfı sınıfından bir sınıf işleyicisi sanal yöntemini geçersiz kıldığı için vardır. Örnek dinleyicileri, bir veya daha fazla işleyicinin bulunduğu belirli sınıf örnekleri/öğeleridir. Bu yönlendirilen olay için AddHandler'e bir çağrıyla eklenmiştir. "

Şimdi bir sınıfla onun örneği arasındaki farkı biliyorum, ancak bir şekilde belgenin bu özel kısmından anlam çıkaramıyorum.

Bunu benimseyen biri var mı?

cevap

11

Bilmiyorum, tam olarak bilmek istersiniz. İşler oldukça basit: İşleyiciyi örneğin (nesne) seviyesinde veya sınıf seviyesinde kaydedebilirsiniz.

Fark, sınıf düzeyinde olay kaydettirdiğinizde, herhangi bir örnek seviye işleyicilerinden önce, önce çağrılacak (tabii ders mantığı ağacında daha düşük/daha yüksekse, tünel oluşturma veya köpürme hala gerçekleşir). Böylece bu olayı sınıf seviyesinde idare edebilir ve bu olayın örnek olarak ele alınıp alınmayacağını filtreleyebilirsiniz (e.Handled = true ayarlanarak diğer işleyicilerin geçmesi için etkinliği durduracaksınız). Bazı durumlarda yararlı olabilir, ancak şimdilik aklımda paylaşacak bir şey yok.

olay elemanın belirli örneği için yükseltildi yalnızca çağrılacak olay işleyicisi kaydeder Bu örnek: Düğme alacak her zaman herhangi DockPanel adı verilecek

DockPanel panel = new DockPanel(); 
panel.AddHandler(Button.ClickEvent, new RoutedEventHandler(Button_Click)); 

Ve bu yaratacak olay işleyicisi, Bu DockPanel örneği işleyicisi önce .Tıklama olay, denilen alacak:

EventManager.RegisterClassHandler(typeof(DockPanel), 
    Button.ClickEvent, new RoutedEventHandler(ButtonClass_Click)); 

yöntemleri olsaydı:

private void ButtonClass_Click(object sender, RoutedEventArgs e) 
{ 
    Debug.Write("Class level handler"); 
} 

private void Button_Click(object sender, RoutedEventArgs e) 
{ 
    Debug.Write("Instance level handler"); 
} 
Bu yaratacak çıkışı:

Sınıf düzeyi işleyici
Örnek seviyesi işleyicisi

Ama sınıf düzeyinde işleyicisi içinde size (e.Handled = true;) handeled için olay args ayarlamak olsaydı, bu filtreler, Bu olayı örneğin düzey işleyici için (ve mantıksal ağaçta kabarcıklanma).

+0

Tam olarak bilmek istediğim şey buydu ve "Bu, herhangi bir DockPanel'in Button.Click olayı her seferinde çağrılacağı olay işleyicisi yaratacaktır ..." diye düşündüm. oldu :) – UrbanEsc

+0

Ben her zaman yardımcı olmaktan mutluluk duyuyorum :) – Pako

İlgili konular