23 Ağustos 2007 Perşembe

WPF Üzerinde Olay Yönetimi ve Routed Event

WPF, XAML ile beraber karmaşık bileşenleri kolayca tasarlamamıza izin veriyor. Örnek olarak aşağıdaki kodu inceleyelim.

<button horizontalalignment="Left" name="button1" click="button1_Click">
<stackpanel orientation="Vertical">
<label name="blbl1" content="label1"></label>
<ellipse name="elips1" fill="Blue" height="25" width="50"></ellipse>
<button height="23" name="button3" click="button3_Click">Button</button>
</stackpanel>
</button>


Örneğimizde bir button içinde stackpanel, onun içerisinde label,button ve ellips nesnelerini görüyoruz. WPF imkanlarından yararlanarak normal şartlarda uzun uğraşlar sonucunda oluşturabileceğimiz bir kompozit ( Birleşik) bir bileşen elde ettik.

Şimdi şu konu üzerinde düşünelim. Bu birleşik bileşen üzerinde mouse ile tıkladığımızda; hangi bileşene ait Event devreye girecek? Örneğin Button1 içerisindeki Button3 üzerine mouse ile tıkladığımızda Button3 ait Click olayı mı devreye girecek, yoksa bunları içinde barındıran Button1 bileşenine ait Click olayımı devreye girecek?

Yukardaki sorumuzun cevabı, Button1 üzerinde her nereye tıklarsanız tıklayın Click olayı tetiklenecektir. WPF üzerinde Routed Event yapısı bu problemi ortadan kaldırmaktadır. Eğer Button3 üzerine tıklayacak olursanız önce Button3'e ait Click olayı ardından Button1 ait Click olayı tetiklenecektir. Peki bu yapı nasıl çalışmaktadır? Çok detaya girmeden anlatacak olursak Routed Event kavramı içinde iki önemli başlık karşımıza çıkmaktadır. Tunneling ve Bubbling.

Tunelling : Button3 üzerinde tıklama işlemi gerçekleştiği zaman, tıklama işleminin sonucu olarak olay mesajı root pozisyonunda olan Button1 bileşenine ulaşır. Bileşen kendine ulaşan mesajı bir silsile yolu ile önce StackPanele, StackPanelde Button3 ulaştırır. Bu işleme Tunnelling denir. Tunnelling aşamasında Preview öneki ile anılan eventlar (PreviewMouseDown) tetiklenir.

Bubbling : Son noktaya ulaşıldığında sistem Button3 ait Click olayını tetikledikten sonra, geriye doğru bir ağaç yapısı içerisinde olayları tetikleyerek ilerler. Önce Button3 ardından StackPanel ve son olarak Button1 bileşeninin Click olayı devreye girer. Bu işlemede Bubbling denir. Normal olarak kullanmakta olduğumuz Click, MouseDown vb. olaylar Bubbling türü olaylardır.

Aşağıdaki şemada Routed Event yapısına ait işleyiş açıkça gözükmektedir.
















Ben kaçtım sonra görüşürüz :)

1 yorum:

Adsız dedi ki...

Hello. This post is likeable, and your blog is very interesting, congratulations :-). I will add in my blogroll =). If possible gives a last there on my blog, it is about the TV Digital, I hope you enjoy. The address is http://tv-digital-brasil.blogspot.com. A hug.