Yönlendirilmiş Olayları İşlenmiş Olarak İşaretleme ve Sınıf İşlemesi
Dolaştırılan bir olay işleyicileri Olay verileri ele olay işaretleyebilirsiniz. Olay işleme etkili yolu daha kısa olan. Sınıf işleme yönlendirilmiş olayları tarafından desteklenen bir programlama kavramýdýr. Bir sınıf işleyicisi sınıfının bir örneği üzerinde hiçbir örnek işleyicisi önce çağrılan bir işleyici ile sınıf düzeyinde belirli yönlendirilmiş bir olay işleme olanağı vardır.
Bu konu aşağıdaki bölümleri içerir.
- Prerequisites
- Ne zaman ele gibi işareti olayları
- "Önizleme" (Tünel) Olaylar vs.Olayları ve olay işleme köpürme
- Sınıf işleyicileri ve örnek işleyicileri
- Denetim temel sınıflar tarafından yönlendirilen olay işleme sınıfı
- Olayları bile işaretli olduğunda örnek işleyicilerini ekleyen ele
- Giriş olayları denetim için birleştirme kasıtlı engelleme
- İlgili Konular
Prerequisites
Bu konu içinde sunulan kavramlar üzerinde elaborates Yönlendirilmiş Olaylara Genel Bakış.
Ne zaman ele gibi işareti olayları
Değeri ayarlandığında Handled özelliğine true olay dolaştırılan olaya ilişkin veriler, bu olarak adlandırılır "ele olay işaretleme". Ne zaman, yönlendirilmiş olayları ele işaretlemesi için mutlak bir kural yok, uygulama Yazar olarak veya bir denetim olarak varolan yönlendirilmiş olaylara tepki gösteren veya yeni uygulayan Yazar olayları yönlendirilir. Çoğunlukla, "işlenmiş" kavramı olaylar veri kullanılmalıdır sınırlı bir iletişim kuralı olarak çeşitli yönlendirilen kendi uygulamanızın yanıtlar için yönlendirilmiş olayın olay taşınan olarak gösterilen WPF APIs yanı herhangi özel yönlendirilmiş olayları. Göz önüne almanız gereken başka bir yolu "işlenmiş" kodunuzu dolaştırılan olaya önemli ve nispeten daha eksiksiz bir şekilde yanıt verdi, ele Dolaştırılan bir olay genellikle olarak işaretlemelisiniz sorundur. Genellikle, olmamalıdır herhangi tek yönlendirilmiş olayın gerçekleşmesi için ayrı işleyicisi uygulamaları gerektiren birden fazla önemli yanıt. Daha fazla yanıtları gerekiyorsa, gerekli kodu iletme için yönlendirilmiş olay sistemi kullanarak yerine, tek bir işleyici içinde zincirleme bir uygulama mantığı ile uygulanacak. "Önemli" nedir kavramı Ayrıca öznel ve uygulama veya kod göre değişir. Genel bir yönerge olarak, bazı "önemli yanıt" örnekler şunlardır: Genel durumu değiştirerek, görsel sunumunu etkileyen özellikleri ayarlama ve diğer yeni olaylarını tetiklemeye odak ayarlama. Da yanıtları örnekler: özel durumu (hiçbir görsel etkisi, veya programlı temsili ile) değiştirerek, olaylarının günlüğe kaydetme veya bağımsız değişkenleri olaya bakan ve ona yanıt vermeyecek biçimde seçme.
Bu "önemli yanıtı" yönlendirilmiş olay sistem davranışını eklenir kullanma modeli ele durumunu yönlendirilmiş bir olay işleyicileri eklenmiş olduğundan XAML veya ortak imzası AddHandler burada Olay verileri zaten işaretlenmiş işlenmiş yönlendirilmiş bir olaya yanıt olarak çağrılan değil. Bir işleyicisi ile ekleme fazladan çaba üzerinden gitmelisiniz handledEventsToo parametresi sürüm (AddHandler(RoutedEvent, Delegate, Boolean)) olay yol. önceki katılımcıları tarafından işlenmiş olarak işaretlenen yönlendirilmiş olayları işlemek için
Bazı durumlarda, denetimleri kendilerini yönlendirilmiş belirli olayları ele işaretle. Bir karar olarak işlenmiş yönlendirilmiş olay temsil WPF kontrol yazarlar, denetimin dolaştırılan olaya yanıt olarak, eylem önemli veya tam olarak denetim uygulaması ve olayın parçası gereken başka bir işlem yok. Genellikle bu olay için bir sınıf işleyicisi ekleyerek veya bir temel sınıf üzerinde mevcut sınıf işleyicisi virtuals biri geçersiz kılma yapılır. Yine de, gerekirse bu olay çalışabilirsiniz; bakın Çalışma çevresinde olay bastırma denetimleri tarafından bu konuda daha sonra.
"Önizleme" (Tünel) Olaylar vs.Olayları ve olay işleme köpürme
Yönlendirilen önizleme olaylardır izleyin olayları bir Tünel öğe ağacı ile yönlendir. "Önizleme" adlandırma kuralında ifade için genel prensibi vurgulayan (Tünel) yönlendirmeli olayları önizleme olaylar eşdeğer köpürme yönlendirilmiş olayından önce üretilir giriş. Ayrıca, bir tünel ve köpürme çifti olan giriş yönlendirilmiş olayları ayrı işleme mantığı vardır. Tünel/yönlendirilen önizleme olay olay dinleyicisi tarafından işlenen olarak işaretlenirse, hatta dinleyicilerin köpürme yönlendirilmiş olayın almadan önce onu sonra yönlendirilmiş olay işaretlenir köpürme ele. Tünel ve köpürme yönlendirilmiş teknik açıdan ayrı olayları olaylardır, ancak bu davranışı etkinleştirmek için Olay verileri aynı örneğini kasıtlı olarak paylaşmak.
Tünel ve köpürme yönlendirilmiş olayları arasındaki bağlantıyı herhangi nasıl verilen tarafından iç uygulaması yapılır WPF sınıfı kendi bildirilen yönlendirilmiş olayları harekete geçiren ve bu doğru eşleştirilmiş giriş yönlendirilmiş olayları. Ancak bu sınıf düzeyi uygulaması yoksa, tünel yönlendirilmiş bir olay ve adlandırma düzeni paylaşan bir köpürme yönlendirilmiş olayı arasında bir bağlantı yoktur: Böyle uygulaması olmadan bunlar tamamen ayrı iki yönlendirilmiş olay olur ve olay veri serisini veya paylaşım yükseltilmiş olması değil.
Tünel/kabarcık giriş yönlendirilmiş olay çiftleri özel bir sınıfta uygulamak hakkında daha fazla bilgi için bkz: Nasıl Yapılır: Özel Yönlendirilmiş Olay Oluşturma.
Sınıf işleyicileri ve örnek işleyicileri
Yönlendirilmiş olayları için olay dinleyicileri iki farklı türde göz önünde bulundurun: sınıf dinleyicileri ve örnek dinleyicileri. Sınıf dinleyicileri mevcut türleri belirli bir çağrıldı çünkü EventManager API ,RegisterClassHandler, kendi statik oluşturucu veya sahip bir sınıf işleyicisi sanal yönteminden bir öğenin temel sınıfa geçersiz kılınmış Örnek dinleyicileri belirli sınıf örnekleri/öğelerini bir yerlerde olan ya da daha fazla işleyicileri, yönlendirilmiş olay için yapılan bir çağrı tarafından eklenmiş olan AddHandler. Var WPF yönlendirilen olayları yapma çağrıları AddHandler bir parçası olarak common language runtime (CLR) olay sarıcı {} ekleyip {} uygulamaları nasıl olan olay, basit XAML , olay işleyicileri bir öznitelik sözdizimi aracılığıyla ekleme mekanizması etkin. Bu nedenle basit bile XAML kullanımı sonuçta eşit olur için bir AddHandler çağrısı.
Görsel ağaç içindeki öğeleri için kayıtlı işleyici uygulamaları denetlenir. İşleyicileri potansiyel yönlendirilen bu olay için yönlendirme stratejisi tür devralınır sırada yol boyunca devreye girer. Örneğin, köpürme yönlendirilmiş olayları yönlendirilmiş olayı öğesine bağlı bu işleyiciler ilk harekete geçirecek. Yönlendirilmiş olayın ardından "Balonlar" uygulama kökü vb. kadar sonraki üst öğe için öğe ulaşıldı.
Rotasındaki işleme sınıfın veya herhangi bir öğe daha yakın yönlendirilmiş olay kaynaðýna işleyicileri kök öğeler üzerinde değil çağırılan sonra Olay bağımsız olarak işlenen, mark işleyicileri çağırmak, bir köpürme, kök öğenin perspektifi ve olay yol o kök öğesi ulaşmadan önce etkili bir şekilde kısaltılır. Çünkü işleyicileri işleyicisi sınıfı veya örneği işleyicisi yönlendirilmiş olay ele olarak işaretlenmiş olsa bile, bunlar yine de çağrılması gereken olduğunu, özel koşullu kullanılarak eklenebilir ancak, yol tamamen, durdu değil. De bu Ekleme örneği işleyicileri, harekete geçirilen bile zaman olaylar olan işaretli işlenme, daha sonra bu konudaki.
Olay rota'den daha derin bir düzeyde de verilen herhangi bir sınıfın örneğini üzerinde işlev gören büyük olasılıkla birden çok sınıf işleyicileri vardır. Bu ise sınıf işleme modeli yönlendirilmiş olayları her sınıf hiyerarşisi içindeki tüm olası sınıfları sağladığından kayıt yönlendirilen her olay için kendi sınıf işleyicisi. Her sınıf işleyicisi dahili bir depoya eklenir ve bir uygulama için olay yol oluşturulur, sınıf işleyicileri tüm olay yol eklenir. Sınıf işleyicileri, çoğu türetilmiş sınıf işleyicisi önce çağrılır ve sınıf işleyicileri birbirini izleyen her temel sınıftan sonraki çağırılan yol eklenir. Bunlar da ele zaten olarak işaretlenen yönlendirilmiş olaylarını yanıtlamak, genellikle sınıf işleyicileri kayıtlı değil. Bu nedenle, işleme mekanizması bu sınıf iki seçeneklerden birini verir:
Türetilmiş sınıflar temel sınıf işleyicisi bugün türetilmiş sınıf işleyicisi sonra çağrılacak çünkü işlenen, yönlendirilmiş olay işaretlemez bir işleyici ekleyerek temel sınıfından miras alınan sınıf işleme destekleyebilirsiniz.
Ele Dolaştırılan olayı işaretleyen bir sınıf işleyicisi ekleyerek temel sınıftan işleme sınıfın türetilmiş sınıfları değiştirir. Potansiyel hedeflenen temel denetimi Tasarım görünümü, durumu mantığı, girdi işleme ve komut işleme gibi alanlarda değiştirmesi nedeniyle bu yaklaşımı, dikkatli olmalısınız.
Denetim temel sınıflar tarafından yönlendirilen olay işleme sınıfı
Bir olay rotasındaki her verilen öğe düğümü üzerinde sınıf dinleyicileri hiçbir öğe can örneği dinleyici önce dolaştırılan olaya yanıt seçeneine sahipsiniz. Bu nedenle, sınıf işleyiciler belirli denetim sınıfı uygulaması daha yaymak ya da özel işlem sınıfının bir özelliktir yönlendirilen bu olayın sağlamak için istemediği yönlendirilmiş olayları bastırmak için bazen kullanılır. Örneğin, bir sınıf, o sınıf bağlamında bazı kullanıcı giriş koşulu anlamı hakkında daha fazla özellikleri içeren kendi özel sınıf olay neden olabilir. Sınıf uygulama sonra işlenen gibi daha genel dolaştırılan olaya mark. Sınıf işleyicileri genellikle eklenir, yönlendirilen için çağırılan değil, burada paylaşılan olay zaten işaretlenmiş verilerin olayları ele ancak atypical durumlar için de vardır bir RegisterClassHandler(Type, RoutedEvent, Delegate, Boolean) bile ne zaman yönlendirilmiş olayları işlenmiş işaretlenen çağırmak için sınıf işleyicilerini kaydeder imza.
Sınıf işleyicisi Virtuals
Özellikle temel öğeleri gibi bazı öğeler UIElement, sunmaya boş "üzerinde * olay" ve "OnPreview * olay" kendi ortak yönlendirilmiş olaylar listesine karşılık gelen sanal yöntemleri. Bu sanal yöntemler yönlendirilen bu olay için bir sınıf işleyicisi uygulamak için kılınabilir. Kendi sınıf işleyicisi gibi her olayı kullanarak kurulmasındaki temel öğe sınıfları bu sanal yöntemleri kaydetmek RegisterClassHandler(Type, RoutedEvent, Delegate, Boolean) Yukarıda anlatıldığı gibi. On * sanal yöntemler yap ilgili işleme sınıfın uygulanması çok daha basit olay yönlendirmeli olayları, her türü için statik Kurucular özel başlatma gerekmeden. İçin işleme sınıfın örneği için ekleme DragEnter herhangi bir olayı UIElement türetilmiş sınıf geçersiz kılarak OnDragEnter sanal bir yöntem. Geçersiz kılma içinde yönlendirilmiş olayını işleyin, diğer olaylarını, örnekler veya bu eylemleri birleşimini öğe özelliklerini değiştirmek sınıfa özgü mantığını başlatmak. Bile ele olay işareti gibi geçersiz kılmaları temel uygulamasında genellikle çağırmalıdır. Temel sınıf üzerinde sanal bir yöntem olduğu için temel uygulama çağırma önerilir. Temel uygulamaları esas olarak gelen her sanal arama, standart korumalı sanal desenini değiştirir ve çoğu türetilmiş sınıf ile başlayan tüm verilen örneğinde bir sınıf hiyerarşisi içindeki tüm sınıflar için sınıf işleyicileri çağrılırsa whereby sınıf yönlendirilmiş olay işleme için yerel benzer bir mekanizma parallels işleyici ve temel sınıf işleyiciye etmeden. Sınıfınızın mantığını işleme temel sınıf değiştirmek için kasıtlı bir gereksinimi varsa, yalnızca temel uygulama çağrısı atlamak. Önce veya sonra geçersiz kılma kodunuzu temel uygulama çağrısı olup, uygulamanızın niteliğine bağlı olacaktır.
Olay sınıfı işleme giriş
Yalnızca ele burada paylaşılan Olay verileri değil zaten işaretli durumda çağrılan şekilde sınıf işleyicisi sanal yöntemleri tüm kaydedilir. Ayrıca, giriş olaylar için benzersiz bir şekilde, tünel ve köpürme sürümler genellikle sırayla harekete geçirilen ve Olay verileri paylaşmak. Burada bir tünel sürümüdür ve diğer köpürme sürüm giriş olay sınıfı işleyicileri için verilen çifti için hemen ele olayı işaretlemek isteyebilirsiniz, bu doğmasına yol açar. İşlenen olay işaretlemek için sanal bir yöntem işleme tünel sınıf uygularsanız, (Tünel veya köpürme olayı için herhangi normal olarak kayıtlı örnek işleyiciler çağrılmasını önleme yanı) çağrılmasını, köpürme sınıf işleyicisi engelleyecektir.
Bir düğüm üzerinde işleme sınıfın tamamlandığında, örnek dinleyicileri olarak kabul edilir.
Olayları bile işaretli olduğunda örnek işleyicilerini ekleyen ele
AddHandler Yöntemi sağlayan olay rotasındaki işleme öğesi eriştiğinde bile başka bir işleyici olay ele olarak işaretlemek için Olay verileri önceden ayarlanmış olay sistem tarafından çağrılacak işleyicileri eklemenizi belirli bir aşırı. Bu genellikle belirtilmez. Genellikle, tüm alanları bile birden çok son sonuçları İstenen öğe ağacı içinde burada ele olsun bir olayın etkisinde uygulama kodu ayarlamak için işleyiciler yazılabilir. Ayrıca, genellikle yok gerçekten o Olayýný Yanýtlayýn gereken tek bir öğe ve uygun uygulama mantığı zaten oldu. Ancak handledEventsToo aşırı burada işlenmiş gibi diğer bazı öğe ağacı veya Denetim birleştirme öğesinde zaten olaya işaretlenmiş, ancak daha üst veya alt öğe ağacında (route) bağlı diğer öğeler hala çağrılan kendi işleyicileri sahip istiyor olağanüstü durumlar için.
Olayları işaretlemek ne zaman işlenmemiş olarak ele
Genellikle, işlenmiş olarak işaretlenen yönlendirilmiş olayları işlenmemiş işaretlenmelidir değil (Handled ayarlanmış geri false) tarafından bile harekete geçirecek işleyicileri handledEventsToo. Ancak, üst düzey olay konumunda bir ağaç ve başka bir konumdaki alt düzey olay görüldüğünde kılan üst düzey ve alt düzey olay sunumlarını giriş bazı olaylar vardır. Örneğin, burada bir alt öðenin dinler için üst düzey anahtar bir olay gibi bir durumu düşünün TextInput iken ana öğe dinler gibi alt düzey bir olaya KeyDown. Üst öğe alt düzey olay işleme, bu üst düzey olay bile postayı kolayca olayý iþlemek için ilk fırsat olmalıdır alt öğe bastırılması.
Bu gibi durumlarda üst öğeleri ve alt öğeleri için alt düzey olay işleyicileri eklemek gerekli olabilir. Alt öğe işleyicisi uygulama, alt düzey olay ele, üst öğe işleyicisi uygulama kümesi öğeleri ağaç (aynı zamanda üst düzey olay) daha yukarı olacak şekilde yeniden işlenmeyen yanıt için bir fırsat olabilir olarak işaretleyebilirsiniz. Bu durum, oldukça seyrek olmalıdır.
Giriş olayları denetim için birleştirme kasıtlı engelleme
Yönlendirilmiş olay sınıfı işleme kullanıldığı ana giriş olayları ve oluşturulan denetimler için senaryodur. Birden çok pratik denetimleri veya Denetim temel sınıflar oluşan tanımına göre oluşturulan denetimdir. Genellikle Yazar denetimin tüm olası girdi olayları katıştırma istemektedir her alt bileşenleri, tüm denetim tekil olay kaynağı olarak bildirmek için neden olabilir olduğunu. Bazı durumlarda, denetimi Yazar bileşenlerinden olayları tamamen bastırmak ya da daha fazla bilgi taşıyan ya da daha özel bir davranış da anlaşılacağı bileşen tarafından tanımlanmış bir olay yerine vermek isteyebilirsiniz. Bileşen yazarlardan hemen görülebilir kurallı örnek nasıl bir Windows Presentation Foundation (WPF) Button tüm düğmeleri olduğunu sezgisel olay sonunda giderecek herhangi bir fare olayı işleme: bir Click olay.
Button Taban sınıfı (ButtonBase) türetildiği Control hangi sırayla türeyen FrameworkElement ve UIElementve denetim giriş işlemi sırasında için gereken bir olay altyapısı çoğunu UIElement düzeyi. Özellikle, UIElement işlemleri genel Mouse olayları işlemek isabet sınaması için fare imleci kendi sınırları içinde ve en yaygın düğme eylemleri için ayrı olaylar gibi sağlar MouseLeftButtonDown. UIElementAyrıca sanal boş sağlar OnMouseLeftButtonDown preregistered class işleyicisi olarak MouseLeftButtonDown, ve ButtonBase it. geçersiz kılar Benzer şekilde, ButtonBase için sınıf işleyicilerini kullanır MouseLeftButtonUp. Uygulamaları hangi olay verileri geçirilir, geçersiz kılmalar mark RoutedEventArgs örnek olarak ayarlayarak ele Handled için true, ve aynı olay verileri ne diğer sınıf işleyicileri ve ayrıca örnek işleyicileri veya olay ayarlayıcılar. yolun geri kalanı boyunca devam Ayrıca, OnMouseLeftButtonUp geçersiz kılma sonraki yükseltmek Click olay. Çoğu dinleyicileri için sonuç olacaktır MouseLeftButtonDown ve MouseLeftButtonUp olayları "görünmez" Bunun yerine değiştirilir ve Click, bu olay gerçek bir düğme ve bileşik değil bazı taş düğmesinin veya başka bir öğe tamamen kaynaklandığını bilindiğinden daha fazla anlamı taşıyan bir olay.
Working Around Event Suppression by Controls
Bazen olay uygulama mantığını işleme daha genel bazı amaçları ile tek tek denetimler içinde bu olay bastırma davranışı etkileyebilir. Örneğin, herhangi bir nedenle uygulamanız için bir işleyici vardı, MouseLeftButtonDown uygulama kök öğede bulunan fark olduğunu herhangi bir düğme üzerindeki fare tıklatması değil çağırmak MouseLeftButtonDown veya MouseLeftButtonUp işleyicileri kök düzeyi. Olay gerçekten kadar kabarcık (yeniden olay yolları değil gerçekten Bitti, ancak yönlendirilmiş olay sistemi işleyicisini çağırma davranışlarını işlenmiş bağlayıcıların sonra değiştirir). Dolaştırılan olaya düğmesini erişildiğinde ButtonBase sınıf işleme işaretlenmiş MouseLeftButtonDown koymak wished çünkü ele Click Olay ile daha fazla anlamı. Bu nedenle, tüm standart MouseLeftButtonDown işleyicisi yol yukarı değil çağrılan. Sizin işleyicileri Bu koşullarda çağrılması emin olmak için kullanabileceğiniz iki tekniği vardır.
İlk teknik kasıtlı işleyicisi kullanarak eklemektir handledEventsToo imza AddHandler(RoutedEvent, Delegate, Boolean). Bu yaklaşımın bir sınırlama bir olay işleyicisi iliştirmek için bu teknik yalnızca kod, işaretleme değil, mümkün olmasıdır. Olay işleyici adı bir olay özniteliği değeri olarak belirtme basit sözdizimi Extensible Application Markup Language (XAML) sağlamaz bu davranışı.
İkinci tekniği, yönlendirilmiş olay tünel ve köpürme sürümleri burada eşlenirler yalnızca giriş olaylar için çalışır. Yönlendirilen Bu olaylar için önizleme işleyicileri ekleyebilirsiniz /Tünel eşdeğer olay yerine yönlendirilir. Yönlendirilmiş olay işleme kodunu button sınıfı, uygulamanın öğesi ağacının bazı öncül öğe düzeyinde önizleme işleyicisi bağlı presuming müdahale değil böylece kökünden başlayarak yol üzerinden tünel. Bu yaklaşımı kullanırsanız, işlenen herhangi bir önizleme olayı işaretleme hakkında dikkatli olun. Birlikte verilen örnek için PreviewMouseLeftButtonDown şu anda işlenen kök öğede, olayı olarak işaretlenmiş Handled işleyicisi uygulamasında, aslında listelenmesini bastırır Click olay. Bu genellikle arzu davranış değil.
Ayrıca bkz.
Görevler
Nasıl Yapılır: Özel Yönlendirilmiş Olay Oluşturma