Gönderilmiş Olaylara Genel Bakış
Bu konuda, Windows Presentation Foundation (WPF) içinde yönlendiren olaylar kavramı açıklanmıştır. Bu konu, yönlendirilen olay terminolojisi tanımlar, yönlendirilen olayların bir öğe ağacı üzerinden nasıl yönlendirildiklerini açıklar, yönlendirilen olayları nasıl işleyebilirsiniz özetler ve kendi özel yönlendirilen olaylarınızı oluşturma hakkında bilgi sağlar.
Önkoşullar
Bu konu, ortak dil çalışma zamanı (CLR) ve nesne odaklı programlama hakkında temel bilgilere sahip olduğunu ve WPF öğeleri arasındaki ilişkilerin ağaç olarak nasıl kavramsallaştırılabılı olduğunu varsaymaktadır. Bu konu başlığında yer alan örnekleri takip etmek için, Extensible Application Markup Language (XAML) ve çok temel WPF uygulamaları veya sayfaları yazmayı da anlamanız gerekir. Daha fazla bilgi için bkz. Adım adım: WPF'de ilk WPF masaüstü uygulamam ve XAML'im.
Yönlendiren Olay Nedir?
Yönlendiren olayları işlevsel veya uygulama açısından düşün düşünesiniz. Bazı kişiler bir veya diğer tanımı daha kullanışlı bularak iki tanım da burada sunulmuştur.
İşlevsel tanım: Yönlendiren bir olay, yalnızca olayı yükselten nesne yerine bir öğe ağacında birden çok dinleyici üzerinde işleyici çağıran bir olay t tür.
Uygulama tanımı: Yönlendiren olay, sınıfın bir örneği tarafından desteklenen ve Windows Presentation Foundation (WPF) olay sistemi tarafından işlenen bir CLR RoutedEvent olayıdır.
Tipik bir WPF uygulaması birçok öğe içerir. Kodda oluşturulmuş veya XAML'de bildirilse de, bu öğeler bir öğe ağacı ilişkisinde mevcuttur. Olay yolu, olay tanımına bağlı olarak iki yönden biri ile hareket eder, ancak genellikle yol kaynak öğeden ilerler ve ardından öğe ağacı köküne (genellikle bir sayfa veya pencere) ulaşana kadar öğe ağacında yukarı doğru "kabarcıklar". Daha önce DHTML nesne modeliyle çalıştıysanız bulas kavramı size tanıdık geliyor olabilir.
Aşağıdaki basit öğe ağacını düşünün:
<Border Height="50" Width="300" BorderBrush="Gray" BorderThickness="1">
<StackPanel Background="LightGray" Orientation="Horizontal" Button.Click="CommonClickHandler">
<Button Name="YesButton" Width="Auto" >Yes</Button>
<Button Name="NoButton" Width="Auto" >No</Button>
<Button Name="CancelButton" Width="Auto" >Cancel</Button>
</StackPanel>
</Border>
Bu öğe ağacı aşağıdakine benzer bir şey üretir:

Bu basitleştirilmiş öğe ağacında, olayın kaynağı öğelerden biri ve tıkılan öğe, olayı işleme fırsatı olan ClickButton ilk Button öğedir. Ancak, olayı üzerinde eylemlere bağlı bir işleyici yoksa, olay öğe ağacında üst öğeye yukarı doğru ButtonButton kabarır ve bu da StackPanel öğesidir. Potansiyel olarak, olay öğesi ağacının sayfa köküne (gösterilmez) ve sonra da Border öğesine kabarcıklar.
Başka bir deyişle, bu olayın olay Click yolu şu şekildedir:
Button-- > StackPanel-- > Border-- > ...
Yönlendiren Olaylar için Üst Düzey Senaryolar
Aşağıda, yönlendiren olay kavramının motivasyonu olan senaryoların kısa bir özeti ve tipik bir CLR olayı bu senaryolar için neden yeterli değildir:
Bileşimi ve kapsüllemesi denetleme: WPF'de çeşitli denetimler zengin bir içerik modeline sahiptir. Örneğin, bir görüntüsünün içine yer ve ardından Button düğmenin görsel ağacını etkili bir şekilde genişletebilirsiniz. Ancak eklenen görüntü, kullanıcı teknik olarak görüntünün parçası olan piksellere tıklasa bile bir düğmenin içeriğine yanıt vermelerine neden olan isabet testi davranışını Click bozmamalı.
Tekil işleyici ek noktaları: Windows Forms'da, birden çok öğeden yükseltilebilecek olayları işlemesi için aynı işleyiciyi birden çok kez iliştirmek zorunda oluruz. Yönlendirilen olaylar, önceki örnekte gösterildiği gibi bu işleyiciyi yalnızca bir kez eklemenize ve gerekirse olayın nereden geldiğini belirlemek için işleyici mantığını kullanmana olanak sağlar. Örneğin, bu daha önce gösterilen XAML için işleyici olabilir:
private void CommonClickHandler(object sender, RoutedEventArgs e)
{
FrameworkElement feSource = e.Source as FrameworkElement;
switch (feSource.Name)
{
case "YesButton":
// do something here ...
break;
case "NoButton":
// do something ...
break;
case "CancelButton":
// do something ...
break;
}
e.Handled=true;
}
Private Sub CommonClickHandler(ByVal sender As Object, ByVal e As RoutedEventArgs)
Dim feSource As FrameworkElement = TryCast(e.Source, FrameworkElement)
Select Case feSource.Name
Case "YesButton"
' do something here ...
Case "NoButton"
' do something ...
Case "CancelButton"
' do something ...
End Select
e.Handled=True
End Sub
Sınıf işleme: Yönlendiren olaylar, sınıfı tarafından tanımlanan statik bir işleyiciye izin sağlar. Bu sınıf işleyicisi, ekli örnek işleyicileri olmadan önce bir olayı işleme fırsatına sahip olur.
Yansıma olmadan bir etkinliğe başvurur: Belirli kod ve işaretleme teknikleri, belirli bir olayı tanımlamak için bir yol gerektirir. Yönlendiren olay, statik veya çalışma zamanı yansımasını gerektirmeyen sağlam bir olay tanımlama tekniği RoutedEvent sağlayan tanımlayıcı olarak bir alan oluşturur.
Yönlendiren Olaylar Nasıl Uygulanır?
Yönlendiren olay, sınıfın bir örneği tarafından desteklene ve WPF olay RoutedEvent sistemine kaydedilen bir CLR olayıdır. Kayıttan alınan örnek genellikle kaydolan ve dolayısıyla yönlendirilen olayın RoutedEventpublicstaticreadonly "sahibi" olan sınıfın alan üyesi olarak korunur. Aynı adlı CLR olayıyla bağlantı (bazen "sarmalayıcı" olayı olarak da an), CLR olayı için ve uygulamaları geçersiz kılınarak addremove başarılı olur. Normalde ve, bu olayın işleyicilerini eklemek ve kaldırmak için uygun dile özgü olay söz dizimini kullanan örtülü bir varsayılan addremove olarak bıraktır. Yönlendirilen olay destek ve bağlantı mekanizması kavramsal olarak, bağımlılık özelliğinin sınıf tarafından desteklendi ve WPF özellik sistemiyle kaydedilen bir CLR DependencyProperty özelliğine benzer.
Aşağıdaki örnek, tanımlayıcı alanı kaydı ve ortaya çıktısı ile CLR olayı için ve uygulamaları da dahil olmak üzere özel yönlendiren bir olay TapRoutedEventaddremoveTap bildirimini gösterir.
public static readonly RoutedEvent TapEvent = EventManager.RegisterRoutedEvent(
"Tap", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(MyButtonSimple));
// Provide CLR accessors for the event
public event RoutedEventHandler Tap
{
add { AddHandler(TapEvent, value); }
remove { RemoveHandler(TapEvent, value); }
}
Public Shared ReadOnly TapEvent As RoutedEvent = EventManager.RegisterRoutedEvent("Tap", RoutingStrategy.Bubble, GetType(RoutedEventHandler), GetType(MyButtonSimple))
' Provide CLR accessors for the event
Public Custom Event Tap As RoutedEventHandler
AddHandler(ByVal value As RoutedEventHandler)
Me.AddHandler(TapEvent, value)
End AddHandler
RemoveHandler(ByVal value As RoutedEventHandler)
Me.RemoveHandler(TapEvent, value)
End RemoveHandler
RaiseEvent(ByVal sender As Object, ByVal e As RoutedEventArgs)
Me.RaiseEvent(e)
End RaiseEvent
End Event
Yönlendiren Olay İşleyicileri ve XAML
XAML kullanarak bir olay için işleyici eklemek için olay adını olay dinleyicisi olan öğede bir öznitelik olarak bildirebilirsiniz. özniteliğinin değeri, arka arkasındaki kod dosyasının kısmi sınıfında mevcut olması gereken, uygulanan işleyici yönteminizin adıdır.
<Button Click="b1SetColor">button</Button>
Standart CLR olay işleyicileri eklemeye yönelik XAML söz dizimi, yönlendirilen olay işleyicileri eklemek için aynıdır çünkü altında yönlendirilen bir olay uygulaması olan CLR olay sarmalayıcıya gerçekten işleyiciler eklersiniz. XAML'de olay işleyicileri ekleme hakkında daha fazla bilgi için bkz. WPF'de XAML.
Yönlendirme Stratejileri
Yönlendiren olaylar üç yönlendirme stratejilerinden birini kullanır:
Köpürme: Olay kaynağında olay işleyicileri çağrılır. Ardından yönlendirilen olay, öğe ağacı köküne ulaşana kadar üst öğelere doğru yol gösterir. Yönlendiren olayların çoğu, yönlendirme stratejisini kullanır. Bulent yönlendirilen olaylar genellikle farklı denetimlerden veya diğer kullanıcı arabirimi öğelerinden gelen giriş veya durum değişikliklerini rapor etmek için kullanılır.
Doğru -dan: Yalnızca kaynak öğeye yanıt olarak işleyicileri çağırma fırsatı verilir. Bu, Formlar'ın olaylar için kullandığı Windows "yönlendirme" ile benzerdir. Ancak, standart bir CLR olayın aksine, doğrudan yönlendiren olaylar sınıf işlemeyi destekler (sınıf işleme sonraki bir bölümde açıklanmıştır) ve tarafından EventSetterEventTrigger kullanılabilir.
Tünel: Başlangıçta, öğe ağacı kökünde olay işleyicileri çağrılır. Yönlendiren olay daha sonra yol üzerinde, yönlendiren olay kaynağı olan düğüm öğesine (yönlendiren olayı yükselten öğe) doğru bir yolu, yol boyunca devam edecek alt öğeler aracılığıyla iletir. Yönlendirilen olaylar tünel oluşturma genellikle denetim için birleştirmenin bir parçası olarak kullanılır veya işlenmiş olur; böylece bileşik parçalardan gelen olaylar bilinçli olarak gizlenebilir veya tam denetime özgü olaylarla değiştirilebilir. WPF'de sağlanan giriş olayları genellikle bir tünel/bulas çifti olarak uygulanır. Çiftler için kullanılan bir adlandırma kuralı nedeniyle tünel olayları bazen Önizleme olayları olarak da adlandırılır.
Neden Yönlendirildi Olaylarını Kullanasınız?
Bir uygulama geliştiricisi olarak, işleyilen olayın yönlendirilen bir olay olarak uygulandığını her zaman bilmek veya önemsersiniz. Yönlendiren olayların özel bir davranışı vardır, ancak bu davranış, bir olayın yükseltildi olduğu öğede bir olayı işlemesi durumunda büyük ölçüde görünmez.
Önerilen senaryolardan birini kullanırsanız, yönlendiren olaylar güçlü hale geldi: ortak bir kökte ortak işleyicileri tanımlama, kendi denetiminizi oluşturma veya kendi özel denetim sınıfınızı tanımlama.
Yönlendirilen olay dinleyicilerinin ve yönlendirilen olay kaynaklarının hiyerarşilerinde ortak bir olayı paylaşması gerek değildir. Yönlendiren UIElement herhangi bir olay için herhangi bir veya bir olay ContentElement dinleyicisi olabilir. Bu nedenle, uygulamanın farklı öğelerinin olay bilgilerini değiştireceği kavramsal bir "arabirim" olarak çalışan API kümesinde bulunan tüm yönlendirilen olay kümelerini kullanabilirsiniz. Yönlendiren olaylar için bu "arabirim" kavramı özellikle giriş olayları için geçerlidir.
Yönlendirilen olaylar, olay verileri yoldeki her öğeye perpetue olduğundan, öğe ağacı üzerinden iletişim kurmak için de kullanılabilir. Bir öğe olay verisinde bir şeyi değiştirebilir ve bu değişiklik yolda bir sonraki öğe için kullanılabilir.
Yönlendirme yönü dışında, herhangi bir WPF olayı standart CLR olayı yerine yönlendiren bir olay olarak uygulanabiliyor olabilir diğer iki nedeni vardır. Kendi olaylarınızı uygulayıyorsanız, şu ilkeleri de göz önündenız olabilir:
ve gibi bazı WPF stili ve templating EventSetterEventTrigger özellikleri, başvurulan olayın yönlendirilen bir olay olması gerekir. Bu, daha önce bahsedilen olay tanımlayıcısı senaryosudur.
Yönlendirilen olaylar, herhangi bir kayıtlı örnek işleyicisi erişmeden önce yönlendirilen olayları işleme fırsatına sahip statik yöntemler belirterek sınıf işleme mekanizmasını destekler. Bu, denetim tasarımında çok yararlıdır çünkü sınıfınız bir örnekteki bir olayı işerek yanlışlıkla gizlenen olay odaklı sınıf davranışlarını zorlar.
Yukarıdaki konuların her biri bu konunun ayrı bir bölümünde ele alınmıştır.
Yönlendiren Olay için Olay İşleyicisi Ekleme ve Uygulama
XAML'de bir olay işleyicisi eklemek için olay adını bir öğeye öznitelik olarak eklemeniz ve öznitelik değerini aşağıdaki örnekte olduğu gibi uygun bir temsilci uygulayan olay işleyicinin adı olarak ayarlamanız gerekir.
<Button Click="b1SetColor">button</Button>
b1SetColor , olayı işleme kodunu içeren uygulanan işleyicinin Click adıdır. b1SetColor , olay için olay RoutedEventHandler işleyicisi temsilcisi olan temsilciyle aynı imzaya sahip olması Click gerekir. Yönlendirilen tüm olay işleyicisi temsilcilerinin ilk parametresi, olay işleyicinin ekli olduğu öğeyi, ikinci parametre ise olay için verileri belirtir.
void b1SetColor(object sender, RoutedEventArgs args)
{
//logic to handle the Click event
}
Private Sub b1SetColor(ByVal sender As Object, ByVal args As RoutedEventArgs)
'logic to handle the Click event
End Sub
RoutedEventHandler , temel yönlendiren olay işleyicisi temsilcisidir. Belirli denetimler veya senaryolar için özelleştirilmiş yönlendirilen olaylar için, yönlendirilen olay işleyicileri için kullanmak üzere temsilciler de özelleştirilmiş olay verilerini iletilebilecek şekilde daha özel hale de olabilir. Örneğin, yaygın bir giriş senaryosunda, yönlendiren bir DragEnter olayı işleysiniz. İşleyiciniz temsilciyi DragEventHandler uygulamalı. En özel temsilciyi kullanarak işleyicide işlemini gerçekleştirip sürükleme işleminin pano yükünü DragEventArgsData içeren özelliğini okuyabilirsiniz.
XAML kullanarak bir öğeye olay işleyicisi eklemenin tam bir örneği için bkz. Yönlendirilen Olayı İşle.
Kodda oluşturulan bir uygulamada yönlendiren bir olay için işleyici eklemek oldukça kolaydır. Yönlendiren olay işleyicileri her zaman bir yardımcı yöntem aracılığıyla eklenebilir (bu, mevcut AddHandler backing'in çağrısıyla aynı add yöntemdir).) Ancak, mevcut WPF yönlendirilen olaylar genellikle yardımcı yöntemden daha sezgisel söz dizimi olan, yönlendirilen olaylar için işleyicilerin dile özgü bir olay söz dizimi tarafından eklenmesini sağlayan ve mantığının destek addremove uygulamalarına sahip olur. Yardımcı yönteminin kullanımına örnek olarak aşağıdakiler ve ardından bakın:
void MakeButton()
{
Button b2 = new Button();
b2.AddHandler(Button.ClickEvent, new RoutedEventHandler(Onb2Click));
}
void Onb2Click(object sender, RoutedEventArgs e)
{
//logic to handle the Click event
}
Private Sub MakeButton()
Dim b2 As New Button()
b2.AddHandler(Button.ClickEvent, New RoutedEventHandler(AddressOf Onb2Click))
End Sub
Private Sub Onb2Click(ByVal sender As Object, ByVal e As RoutedEventArgs)
'logic to handle the Click event
End Sub
Sonraki örnekte C# işleci söz dizimi (Visual Basic işlemesi nedeniyle işleç söz diziminde biraz farklı olabilir):
void MakeButton2()
{
Button b2 = new Button();
b2.Click += new RoutedEventHandler(Onb2Click2);
}
void Onb2Click2(object sender, RoutedEventArgs e)
{
//logic to handle the Click event
}
Private Sub MakeButton2()
Dim b2 As New Button()
AddHandler b2.Click, AddressOf Onb2Click2
End Sub
Private Sub Onb2Click2(ByVal sender As Object, ByVal e As RoutedEventArgs)
'logic to handle the Click event
End Sub
Koda olay işleyicisi ekleme örneği için bkz. Kod Kullanarak Olay İşleyicisi Ekleme.
İşleyici bildirimlerini Visual Basic, işleyici bildirimlerinin bir parçası olarak işleyici eklemek Handles için anahtar sözcüğünü de kullanabilirsiniz. Daha fazla bilgi için bkz. Visual Basic WPF Olay İşleme.
Ele Alan Kavramı
Yönlendiren tüm olaylar ortak bir olay verisi temel sınıfı olan 'i RoutedEventArgs paylaşır. RoutedEventArgs , Handled Boole değerini alan özelliğini tanımlar. özelliğinin amacı, rota boyunca herhangi bir olay işleyicisini, değerini olarak ayarerek yönlendirilen olayı işleyici Handled olarak HandledHandled işaretlemektir. true İşleyici tarafından yol boyunca bir öğede işlendikten sonra, paylaşılan olay verileri yol boyunca her dinleyiciye yeniden rapor eder.
değeri, Handled rotada daha fazla ilerlenen yönlendiren bir olayın nasıl raporlandığı veya işlenme durumunu etkiler. , yönlendiren bir olayın olay verisinde ise, diğer öğelerde bu yönlendiren olayı dinleyen işleyiciler genellikle bu olay örneği için Handledtrue artık çağrılmaz. Bu durum hem XAML'ye eklenen işleyiciler hem de veya gibi dile özgü olay işleyicisi ek sözdizimi tarafından eklenen işleyiciler için +=Handles doğrudur. En yaygın işleyici senaryoları için, bir olayı olarak ayarlanıyor olarak işaretlemek, bir tünel yolu veya bu ya da bu yalıtma yolu için yönlendirmeyi "durdurur" ve aynı zamanda bir sınıf işleyicisi tarafından yolda bir noktada işlanan herhangi bir olay Handledtrue için.
Ancak dinleyicilerin olay verisinde olduğu yönlendirilmiş olaylara yanıt olarak işleyicileri çalıştıracak bir "handledEventsToo" Handledtrue mekanizması vardır. Başka bir deyişle, olay verileri işlandı olarak işaretleyerek olay yolu gerçekten durdurulmaz. HandledEventsToo mekanizmasını yalnızca kodda veya içinde EventSetter kullanabilirsiniz:
Kodda, genel CLR olayları için çalışan dile özgü bir olay söz dizimi kullanmak yerine, işleyicinizi eklemek için WPF AddHandler(RoutedEvent, Delegate, Boolean) yöntemini arayın. değerini olarak
handledEventsTootruebelirtin.içinde EventSetter özniteliğini HandledEventsToo olarak
trueayarlayın.
Durumunun yönlendirilen olaylarda ürettiği davranışa ek olarak, kavramının, uygulamanızı nasıl tasarlamanız ve olay işleyicisi kodunu yazmanız HandledHandled gerektiğine de etkileri vardır. Yönlendiren olaylar Handled tarafından ortaya çıkar basit bir protokol olarak kavramsallaştırıldı. Bu protokolü tam olarak nasıl kullanabileceğiniz size göredir, ancak değerinin nasıl kullanılmaya yönelik kavramsal Handled tasarımı aşağıdaki gibidir:
Yönlendirilen bir olay işlendi olarak işaretlenirse, bu durumda bu yol boyunca diğer öğeler tarafından yeniden işlenir.
Yönlendirilen bir olay işlendi olarak işaretlanmazsa, yol boyunca daha önce olan diğer dinleyiciler bir işleyiciyi kaydetmemayı seçti veya kayıtlı işleyiciler olay verilerini işlemeyi seçmedi ve olarak Handled
trueayarlamadı. (Veya geçerli dinleyicinin rotanın ilk noktası olduğu da mümkündür.) Geçerli dinleyicide işleyiciler artık üç olası eylem kursuna sahip:Hiçbir eylemde yer alma; olay işsüz kalır ve olay sonraki dinleyiciye yol gösterir.
Olayı yanıtlamak için kod yürütün, ancak yapılan eylemin olayı işlen olarak işaretlemeyi garanti edecek kadar önemli olmadığını belirlemeyi sağlar. Olay sonraki dinleyiciye yol gösterir.
Olayı yanıtlamak için kodu yürütün. İşleyiciye geçirilen olay verisinde olayı işleyicinin işleyicisinde işleyici olarak işaretle, çünkü ednilen eylemin işleyici olarak işaretlemeyi garanti edecek kadar önemli olduğu kabul edildi. Olay yine bir sonraki dinleyiciye yönlendirmeye devam eder ancak olay verisinde yalnızca dinleyiciler başka Handled=
truehandledEventsTooişleyiciler çağırma fırsatına sahip olur.
Bu kavramsal tasarım, daha önce bahsedilen yönlendirme davranışıyla pekiştirildi: yol boyunca önceki bir işleyici zaten olarak ayarlanmış olsa bile çağrılan yönlendirilen olaylar için işleyiciler eklemek daha zordur (kodda veya stillerde hala mümkün olsa Handledtrue da).
hakkında daha fazla bilgi için, yönlendirilen olayların sınıf işlemesi ve yönlendirilen bir olayı olarak işaretlemenin uygun olduğu durumlarla ilgili öneriler için bkz. Yönlendirilen Olayları İşleme olarak işaretleme ve HandledHandled Sınıf Handled
Uygulamalarda, yalnızca onu yükselten nesnede basit yönlendirilen bir olayı işlemek ve olayın yönlendirme özellikleriyle hiç ilgili olmak zorunda olmak oldukça yaygındır. Ancak, öğe ağacında daha fazla olan bir öğenin aynı yönlendirilmiş olay için de bağlı bir işleyicisi olması durumunda, izdilen yan etkileri önlemek için, yönlendirilen olayı olay verisinde işlenmiş olarak işaretlemek iyi bir uygulamadır.
Sınıf İşleyicileri
'den bir şekilde türeten bir sınıf tanımladığınız, sınıfını bildirilen veya devralınan bir olay üyesi olan yönlendiren bir olay için bir sınıf işleyicisi de tanımlayabilir DependencyObject ve iliştirin. Sınıf işleyicileri, yönlendirilmiş bir olay kendi yolu içinde bir öğe örneğine her ulaştığında, o sınıfın bir örneğine eklenmiş olan örnek dinleyici işleyicileri önce çağrılır.
Bazı WPF denetimleri, belirli yönlendiren olaylar için doğası gereği sınıf işlemeye sahiptir. Bu, yönlendiren olayın hiç ortaya çıkmama görünümünü verir, ancak gerçekte sınıf işleyicisi olur ve belirli teknikleri kullanırsanız yönlendiren olay yine de örnek işleyicileri tarafından işlenebilir. Ayrıca, birçok temel sınıf ve denetim, sınıf işleme davranışını geçersiz kılmak için kullanılan sanal yöntemleri ortaya çıkarır. Hem hedefsiz sınıf işleme ile ilgili çalışma hakkında hem de özel bir sınıfta kendi sınıf işlemenizi tanımlama hakkında daha fazla bilgi için bkz. Yönlendirilen Olayları İşli Olarak İşaretleme ve Sınıf İşleme.
WPF'de Ekli Olaylar
XAML dili, ekli olay olarak adlandırılan özel bir olay türünü de tanımlar. Eklenen bir olay, rastgele bir öğeye belirli bir olay için işleyici eklemenize olanak sağlar. Olayı ele alan öğenin ekli olayı tanımlaması veya devralması ve ne olayı oluşturması ne de hedef işleme örneğinin bu olayı sınıf üyesi olarak tanımlaması veya başka bir şekilde "sahip" olması gerekir.
WPF giriş sistemi, ekli olayları kapsamlı olarak kullanır. Ancak, bu ekli olayların neredeyse hepsi temel öğeler aracılığıyla iletildi. Giriş olayları daha sonra temel öğe sınıfının üyeleri olan eşdeğer, bağlı olmayan yönlendirilmiş olaylar olarak görünür. Örneğin, temel alınan ekli Mouse.MouseDownUIElementMouseDown olay, XAML'de veya kodda ekli olay söz dizimi ile ilgilenmek yerine üzerinde kullanılarak herhangi bir veri üzerinde daha UIElement kolay iş edilebilir.
WPF'de ekli olaylar hakkında daha fazla bilgi için bkz. Ekli Olaylara Genel Bakış.
XAML'de Tam Olay Adları
typename'e benzer başka bir söz dizimi kullanımı.eventname ekli olay söz dizimi, ekli olay kullanımının tam olarak söz dizimi değildir, alt öğeler tarafından ortaya konulan yönlendirilmiş olaylar için işleyiciler iliştirmedir. Ortak üst öğenin ilgili yönlendirilen olayı üye olarak almasa bile olay yönlendirmeden yararlanmak için işleyicileri ortak bir üst öğeye iliştirin. Bu örneği yeniden düşünün:
<Border Height="50" Width="300" BorderBrush="Gray" BorderThickness="1">
<StackPanel Background="LightGray" Orientation="Horizontal" Button.Click="CommonClickHandler">
<Button Name="YesButton" Width="Auto" >Yes</Button>
<Button Name="NoButton" Width="Auto" >No</Button>
<Button Name="CancelButton" Width="Auto" >Cancel</Button>
</StackPanel>
</Border>
Burada, işleyicinin ekli olduğu üst öğe dinleyicisi bir StackPanel olur. Ancak, bildirilen ve sınıfı tarafından yükseltilen yönlendirilen bir olay için bir işleyici ekliyor ( aslında, ancak devralma ButtonButtonBase yoluyla Button kullanılabilir). Button Olayı "sahip" olarak kabul eder, ancak yönlendirilen olay sistemi, yönlendirilen herhangi bir olay için işleyicilerin bir ortak dil çalışma zamanı UIElement (CLR) olayı için dinleyiciler ekli olan herhangi bir veya örnek dinleyiciye bağlanmasını ContentElement sağlar. Bu nitelikli olay özniteliği adları için varsayılan xmlns ad alanı genellikle varsayılan WPF xmlns ad alanıdır, ancak özel yönlendirilen olaylar için ön ekli ad alanları da belirtebilirsiniz. xmln'ler hakkında daha fazla bilgi için bkz. WPF XAML için XAMLAd Alanları ve Ad Alanı Eşlemesi.
WPF Giriş Olayları
WPF platformu içinde yönlendiren olayların sık kullanılan bir uygulaması giriş olaylarıdır. WPF'de tünel yönlendiren olay adlarının önüne kurala göre "Önizleme" sözcüğü ekli olur. Giriş olayları genellikle çift olarak gelir ve biri bursile olayı, diğeri ise tünel olayıdır. Örneğin, olay ve olay aynı imzaya sahip olur ve bu imza önceki giriş olayı, ikincisi ise tünel KeyDownPreviewKeyDown giriş olayıdır. Bazen, giriş olaylarını yalnızca bu sürüm veya doğrudan yönlendiren bir sürüm olabilir. Belgelerde yönlendiren olay konuları, benzer yönlendiren olaylara alternatif yönlendirme stratejileriyle çapraz başvuru sağlar ve yönetilen başvuru sayfalarındaki bölümler yönlendiren her olayın yönlendirme stratejisini netleştirmektedir.
Çift olarak gelen WPF giriş olayları, fare düğmesine basıldığında olduğu gibi girişten tek bir kullanıcı eyleminin çiftin her iki yönlendiren olaylarını da sırayla yükseltecek şekilde uygulanır. İlk olarak, tünel olayı uzer ve rotasını gösterir. Daha sonra bu bulent olayı uzer ve rotasını gösterir. İki olay aslında aynı olay veri örneğini paylaşır, çünkü bu event'i yükselten uygulama sınıfındaki yöntem çağrısı tünel olayından olay verilerini dinler ve bunu yeni yükseltilmiş olayda yeniden RaiseEvent kullanır. Tünel olayı için işleyicileri olan dinleyiciler, yönlendirilen olayı (önce sınıf işleyicileri, sonra örnek işleyicileri) işaretlemek için ilk fırsata sahip olur. Tünel yolu boyunca bir öğe, yönlendirilmiş olayı işlendi olarak işaretlediyse, bu aşağılama olayı için zaten işlenen olay verileri gönderilir ve eşdeğer giriş olayları için eklenen tipik işleyiciler çağrılmaz. Dışarı doğru görünümler için, tanıtıcı bualama olayı hiç yükseltilmemiş gibi olur. Bu işleme davranışı, tüm isabet testi tabanlı giriş olaylarının veya odak tabanlı giriş olaylarının bileşik parçaları yerine son denetiminiz tarafından bildiriliyor olabileceği denetim birleştirme için kullanışlıdır. Son denetim öğesi, birleştirmedeki köke daha yakındır ve bu nedenle sınıflamanın önce tünel olayı işleme ve belki de bu yönlendirilen olayı denetim sınıfını destekleyenin bir parçası olarak daha denetime özgü bir olayla "değiştirme" fırsatına sahip olur.
Giriş olayı işlemenin nasıl çalıştığının bir çizimi olarak aşağıdaki giriş olayı örneğini göz önünde bulundurabilirsiniz. Aşağıdaki ağaç çizimde, leaf element #2 hem hem de ardından bir olayın PreviewMouseDownMouseDown kaynağıdır:

Olay işleme sırası aşağıdaki gibidir:
PreviewMouseDownkök öğesinde (tünel).PreviewMouseDown(tunnel) on ara öğe #1.PreviewMouseDown(tunnel) on source element #2.MouseDown(kabarcık) 2 numaralı kaynak öğesinde.MouseDown(kabarcık) üzerinde ara öğe #1.MouseDownkök öğesinde (kabarcık).
Yönlendirilen olay işleyicisi temsilcisi iki nesneye başvuru sağlar: olayı oluşturan nesne ve işleyicinin çağrıldığında nesne. İşleyicinin çağrıldığında nesnesi, parametresi tarafından bildirilen sender nesnedir. Olayın ilk kez ortaya çıkar olduğu nesne, olay Source verisinde özelliği tarafından raporlandı. Yönlendiren bir olay yine aynı nesne tarafından yükseltebilir ve iş olabilir; bu durumda ve aynıdır (olay işleme örnek listesinde senderSource 3. ve 4. Adımlarda bu durum oluşur).
Tünel ve buarak nedeniyle, üst öğeler giriş olaylarını alır ve Source burada , alt öğelerine sahiptir. Kaynak öğenin ne olduğunu bilmek önemli olduğunda, özelliğine erişerek kaynak öğeyi Source tanımlayabilirsiniz.
Genellikle, giriş olayı işaretlendiktan Handled sonra, başka işleyiciler çağrılır. Genellikle, giriş olayı anlamının uygulamaya özgü mantıksal işlemesini ele alan bir işleyici çağrıldığında giriş olaylarını işleyici olarak işaretlemeniz gerekir.
Durumla ilgili bu genel deyimin istisnası, olay verilerini kasıtlı olarak yok saymak için kaydedilmiş giriş olayı işleyicilerinin her iki yolda da HandledHandled çağrılmaktır. Daha fazla bilgi için bkz. Olayları Önizleme veya Yönlendirilen Olayları İşleme Olarak İşaretleme ve Sınıf İşleme.
Tünel ve buayla olaylar arasındaki paylaşılan olay veri modeli ve ilk tünelden sonra budizli olayların sıralı olarak yükseltiliyor, yönlendiren tüm olaylar için genel olarak doğru olan bir kavram değildir. Bu davranış, WPF giriş cihazlarının giriş olay çiftlerini yükseltmeyi ve bağlamayı seçme yöntemiyle özel olarak uygulanır. Kendi giriş olaylarınızı uygulamak gelişmiş bir senaryodur, ancak kendi giriş olaylarınız için de bu modeli izlemeyi seçebilirsiniz.
Belirli sınıflar, genellikle belirli bir kullanıcı odaklı giriş olayında bu denetimde ne anlama geldiğini yeniden tanımp yeni bir olay oluşturma amacını kullanarak belirli giriş olaylarını sınıf olarak işlemeyi seçer. Daha fazla bilgi için bkz. Yönlendirilen Olayları İşleme Olarak İşaretleme ve Sınıf İşleme.
Giriş ve tipik uygulama senaryolarında giriş ve olayların etkileşim kurması hakkında daha fazla bilgi için bkz. Girişe Genel Bakış.
EventSetters ve EventTriggers
Stillerde, bir kullanarak işaretlemeye önceden bildirilen bir XAML olay işleme söz dizimi EventSetter dahilebilirsiniz. Stil uygulandığında, başvurulan işleyici stildeki örneğine eklenir. Yalnızca yönlendiren EventSetter bir olay için bildiresiniz. Bir örnek verilmiştir. Burada b1SetColor başvurulan yöntemin bir arka kod dosyasında olduğunu unutmayın.
<StackPanel
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="SDKSample.EventOvw2"
Name="dpanel2"
Initialized="PrimeHandledToo"
>
<StackPanel.Resources>
<Style TargetType="{x:Type Button}">
<EventSetter Event="Click" Handler="b1SetColor"/>
</Style>
</StackPanel.Resources>
<Button>Click me</Button>
<Button Name="ThisButton" Click="HandleThis">
Raise event, handle it, use handled=true handler to get it anyway.
</Button>
</StackPanel>
Burada elde edilmiş olan avantaj, stilin uygulamanıza herhangi bir düğme için uygulanabilecek çok fazla başka bilgi içermesi ve bu stilin bir parçası olması, işaretleme düzeyinde bile kodun yeniden kullanılmasına EventSetter teşvik ediyor olmasıdır. Ayrıca, bir EventSetter işleyiciler için yöntem adlarını genel uygulama ve sayfa işaretlemeden bir adım daha uzakta özetler.
WPF'nin yönlendiren olay ve animasyon özelliklerini birleştiren başka bir özel söz dizimi de bir EventTrigger 'tir. gibi, EventSetter bir için yalnızca yönlendiren olaylar EventTrigger kullanılabilir. Genellikle, bir stilin parçası olarak bildirildi, ancak bir koleksiyonun bir parçası olarak sayfa düzeyi öğelerinde veya içinde EventTriggerEventTriggerTriggersControlTemplate bildirebilirsiniz. , yönlendirilen bir olay kendi rotası içinde o olay için bir bildiren bir öğeye her ulaştığında EventTriggerStoryboard çalışan bir EventTrigger belirtmenizi sağlar. Yalnızca olayı işlemenin ve bunun mevcut bir storyboard'ları başlatmasına neden olan bir avantajı, storyboard ve çalışma zamanı davranışı üzerinde daha iyi EventTriggerEventTrigger denetim sağlar. Daha fazla bilgi için, bkz. Use Event Triggers to Control a Storyboard After It Starts.
Yönlendiren Olaylar Hakkında Daha Fazla Bilgi
Bu konu, temel kavramları açıklama perspektifinden yönlendirilen olayları ele almaktadır ve çeşitli temel öğeler ve denetimlerde zaten mevcut olan yönlendirilen olaylara nasıl ve ne zaman yanıt verilebilecekleri konusunda rehberlik sağlar. Ancak, özel sınıf üzerinde özel olay veri sınıfları ve temsilciler gibi gerekli tüm destekle birlikte kendi yönlendiren olayınızı oluşturabilirsiniz. Yönlendirilen olay sahibi herhangi bir sınıf olabilir, ancak yararlı olması için yönlendirilen olaylar tarafından yükseltilen ve veya türetilmiş sınıflar tarafından UIElementContentElement iş gerekir. Özel olaylar hakkında daha fazla bilgi için bkz. Özel Yönlendirilen Olay Oluşturma.