Aracılığıyla paylaş


Gönderilmiş Olaylara Genel Bakış

Bu konu, Windows Presentation Foundation'da (WPF) yönlendirilmiş olaylar kavramını açıklar. Konu başlığında yönlendirilmiş olaylar terminolojisi tanımlanmaktadır, yönlendirilen olayların bir öğe ağacı üzerinden nasıl yönlendirilmiş olduğu açıklanır, yönlendirilen olayları nasıl işlediğiniz özetlenir ve kendi özel yönlendirilmiş olaylarınızın nasıl oluşturulacağı açıklanır.

Ön koşullar

Bu konu başlığında, ortak dil çalışma zamanı (CLR) ve nesne odaklı programlama hakkında temel bilgilere sahip olduğunuz ve WPF öğeleri arasındaki ilişkilerin ağaç olarak nasıl kavramsallaştırılabildiğine ilişkin kavramlara sahip olduğunuz varsayılır. Bu konudaki örnekleri takip etmek için Genişletilebilir Uygulama Biçimlendirme Dili'ni (XAML) da anlamanız ve çok temel WPF uygulamaları veya sayfaları yazmayı bilmeniz gerekir. Daha fazla bilgi için bkz . İzlenecek yol: İlk WPF masaüstü uygulamam ve WPF'de XAML.

Yönlendirilmiş Olay Nedir?

yönlendirilmiş olayları işlevsel veya uygulama açısından düşünebilirsiniz. Bazı kişiler tanımlardan birini veya diğerini daha yararlı bulduğu için her iki tanım da burada sunulur.

İşlevsel tanım: Yönlendirilmiş olay, yalnızca olayı tetikleyen nesne yerine bir öğe ağacındaki birden çok dinleyicide işleyici çağırabilen bir olay türüdür.

Uygulama tanımı: Yönlendirilen olay, sınıfın bir örneği RoutedEvent tarafından desteklenen ve Windows Presentation Foundation (WPF) olay sistemi tarafından işlenen bir CLR olayıdır.

Tipik bir WPF uygulaması birçok öğe içerir. Kodda oluşturulan veya XAML'de bildirilen bu öğeler birbiriyle bir öğe ağacı ilişkisinde bulunur. Olay yolu, olay tanımına bağlı olarak iki yönden birinde hareket edebilir, ancak genellikle yol kaynak öğeden hareket eder ve sonra öğe ağacı köküne (genellikle bir sayfa veya pencere) ulaşana kadar öğe ağacı boyunca yukarı doğru "kabarcıklar". Daha önce DHTML nesne modeliyle çalıştıysanız bu kabarcıklama kavramı size tanıdık gelebilir.

Aşağıdaki basit öğe ağacını göz önünde bulundurun:

<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:

Yes, No, and Cancel buttons

Bu basitleştirilmiş öğe ağacında, bir Click olayın kaynağı öğelerden Button biridir ve Button tıklanan öğe, olayı işleme fırsatına sahip olan ilk öğedir. Ancak, olay üzerindeki eylemlere Button bağlı bir işleyici yoksa, olay öğe ağacındaki üst öğeye Button doğru yukarı doğru kabarcık oluşturur ve bu da olur StackPanel. Büyük olasılıkla, olay öğesine ve ardından öğe ağacının sayfa köküne kadar kabarcıklar Border(gösterilmez).

Başka bir deyişle, bu Click olayın olay yolu şöyledir:

Düğme-->StackPanel-->Kenarlık-->...

Yönlendirilmiş Olaylar için Üst Düzey Senaryolar

Aşağıda, yönlendirilen olay kavramını motive eden senaryoların ve tipik bir CLR olayının bu senaryolar için neden yeterli olmadığıyla ilgili kısa bir özet verilmiştir:

Denetim bileşimi ve kapsülleme: WPF'deki çeşitli denetimlerin zengin bir con çadır modu l değeri vardır. Örneğin, düğmesinin görsel ağacını etkili bir şekilde genişleten bir Buttongörüntüsünü içine yerleştirebilirsiniz. Ancak, kullanıcı teknik olarak görüntünün parçası olan piksellere tıklasa bile, eklenen görüntü, bir düğmenin içeriğine yanıt vermesine Click neden olan isabet testi davranışını bozmamalıdır.

Tekil işleyici ek noktaları: Windows Forms'da, birden çok öğeden tetiklenebilir olayları işlemek için aynı işleyiciyi birden çok kez eklemeniz gerekir. 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ı kullanmanıza olanak tanır. Örneğin, daha önce gösterilen XAML için işleyici bu 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önlendirilen olaylar, sınıfı tarafından tanımlanan statik bir işleyiciye izin verir. Bu sınıf işleyicisi, ekli örnek işleyicilerinin işleyebilmesi için bir olayı işleme fırsatına sahiptir.

Yansıma olmadan bir olaya başvurma: Belirli kod ve işaretleme teknikleri belirli bir olayı tanımlamanın bir yolunu gerektirir. Yönlendirilen olay, statik veya çalışma zamanı yansıması gerektirmeyen sağlam bir olay belirleme tekniği sağlayan tanımlayıcı olarak bir RoutedEvent alan oluşturur.

Yönlendirilen Olaylar Nasıl Uygulanır?

Yönlendirilmiş olay, sınıfın bir örneği RoutedEvent tarafından yedeklenen ve WPF olay sistemine kaydedilen bir CLR olayıdır. Kayıttan RoutedEvent alınan örnek genellikle sınıfın alan üyesi olarak publicstaticreadonly tutulur ve bu nedenle yönlendirilen olaya "sahip olur". Aynı adlı CLR olayına bağlantı (bazen "sarmalayıcı" olayı olarak adlandırılır) CLR olayının add ve remove uygulamaları geçersiz kılınarak gerçekleştirilir. Normalde veremove, add bu olayın işleyicilerini eklemek ve kaldırmak için uygun dile özgü olay söz dizimini kullanan örtük bir varsayılan olarak bırakılır. Yönlendirilen olay yedekleme ve bağlantı mekanizması kavramsal olarak bağımlılık özelliğinin sınıfı tarafından DependencyProperty yedeklenen ve WPF özellik sistemine kaydedilmiş bir CLR özelliği olmasına benzer.

Aşağıdaki örnekte, tanımlayıcı alanının add kaydı ve açığa çıkarma ile CLR olayının RoutedEvent ve remove uygulamaları dahil olmak üzere özel Tap bir yönlendirilmiş olayın bildirimi gösterilmektedirTap.

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önlendirilmiş Olay İşleyicileri ve XAML

XAML kullanarak bir olaya işleyici eklemek için olay adını olay dinleyicisi olan öğesinde öznitelik olarak bildirirsiniz. özniteliğinin değeri, arka planda kod dosyasının kısmi sınıfında bulunması 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önlendirilmiş olay işleyicileri eklemek için aynıdır çünkü altında yönlendirilmiş olay uygulaması olan CLR olay sarmalayıcısına 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önlendirilen olaylar üç yönlendirme stratejisinden birini kullanır:

  • Kabarcık oluşturma: Olay kaynağındaki olay işleyicileri çağrılır. Ardından yönlendirilen olay, öğe ağacı köküne ulaşana kadar ardışık üst öğelere yönlendirir. Yönlendirilen olayların çoğu kabarcık yönlendirme stratejisini kullanır. Kabarcıklı yönlendirilmiş olaylar genellikle farklı denetimlerden veya diğer kullanıcı arabirimi öğelerinden gelen giriş veya durum değişikliklerini bildirmek için kullanılır.

  • Doğrudan: Yalnızca kaynak öğenin kendisine yanıt olarak işleyicileri çağırma fırsatı verilir. Bu, Windows Forms'un olaylar için kullandığı "yönlendirme" ile benzerdir. Ancak, standart bir CLR olayından farklı olarak, doğrudan yönlendirilmiş olaylar sınıf işlemeyi destekler (sınıf işlemesi gelecek bölümde açıklanmıştır) ve tarafından EventSetterEventTriggerkullanılabilir.

  • Tünel oluşturma: Başlangıçta, öğe ağacı kökündeki olay işleyicileri çağrılır. Ardından yönlendirilen olay, yol boyunca ardışık alt öğeler aracılığıyla, yönlendirilen olay kaynağı olan düğüm öğesine (yönlendirilen olayı tetikleyen öğe) bir rotaya geçer. Tünel yönlendirilen olaylar genellikle bir denetim için birleştirmenin bir parçası olarak kullanılır veya işlenir; örneğin bileşik parçalardan gelen olaylar, tam denetime özgü olaylar tarafından kasıtlı olarak gizlenebilir veya değiştirilebilir. WPF'de sağlanan giriş olayları genellikle tünel oluşturma/kabarcıklama ç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.

Yönlendirilmiş Olaylar Neden Kullanılır?

Uygulama geliştiricisi olarak, işlemekte olduğunuz olayın yönlendirilmiş bir olay olarak uygulandığını her zaman bilmeniz veya önemsemeniz gerekmez. Yönlendirilen olayların özel bir davranışı vardır, ancak bu davranış, tetiklendiği öğede bir olayı işlerseniz büyük ölçüde görünmez.

Yönlendirilen olayların güçlü hale geldiği yer, önerilen senaryolardan herhangi birini kullanmanızdır: 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ı gerekmez. Herhangi biri UIElement veya ContentElement yönlendirilen herhangi bir olay için olay dinleyicisi olabilir. Bu nedenle, çalışma API'si kümesi boyunca kullanılabilen yönlendirilmiş olayların tam kümesini, uygulamadaki farklı öğelerin olay bilgilerini değiştirebileceği kavramsal bir "arabirim" olarak kullanabilirsiniz. Yönlendirilen olaylar için bu "arabirim" kavramı özellikle giriş olayları için geçerlidir.

Yönlendirilen olaylar, olay için olay verileri yoldaki her öğeye kalıcı hale geldiği için öğe ağacı üzerinden iletişim kurmak için de kullanılabilir. Bir öğe olay verilerindeki bir şeyi değiştirebilir ve bu değişiklik rotadaki bir sonraki öğe için kullanılabilir.

Yönlendirme yönü dışında, herhangi bir WPF olayının standart bir CLR olayı yerine yönlendirilmiş olay olarak uygulanabileceğinden başka iki neden vardır. Kendi olaylarınızı uyguluyorsanız şu ilkeleri de göz önünde bulundurabilirsiniz:

  • ve gibi EventSetterEventTrigger bazı WPF stil ve şablon oluşturma özellikleri, başvuruda bulunılan olayın yönlendirilmiş bir olay olmasını gerektirir. Bu, daha önce bahsedilen olay tanımlayıcısı senaryosudur.

  • Yönlendirilen olaylar, sınıfın, kayıtlı örnek işleyicilerinin bunlara erişebilmesi için yönlendirilen olayları işleme fırsatına sahip statik yöntemleri belirtebildiği bir sınıf işleme mekanizmasını destekler. Sınıfınız bir örnekteki bir olayı işleyerek yanlışlıkla gizlenemeyen olay temelli sınıf davranışlarını zorlayabildiği için bu denetim tasarımında çok yararlıdır.

Yukarıdaki konuların her biri bu konunun ayrı bir bölümünde ele alınmıştır.

Yönlendirilmiş Olay için Olay İşleyicisi Ekleme ve Uygulama

XAML'de 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şleyicisinin adı olarak ayarlamanız yeterlidir.

<Button Click="b1SetColor">button</Button>

b1SetColor , olayı işleyen kodu içeren uygulanan işleyicinin adıdır Click . b1SetColor , olay için olay işleyici temsilcisi olan temsilciyle aynı imzaya RoutedEventHandlerClick sahip olmalıdır. Tüm yönlendirilen olay işleyici temsilcilerinin ilk parametresi, olay işleyicisinin eklendiği öğeyi, ikinci parametre ise olayın verilerini 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önlendirilmiş olay işleyici temsilcisidir. Belirli denetimler veya senaryolar için özelleştirilmiş yönlendirilmiş olaylar için, yönlendirilen olay işleyicileri için kullanılacak temsilciler de özelleştirilmiş olay verilerini iletebilmeleri için daha özelleştirilmiş hale gelebilir. Örneğin, yaygın bir giriş senaryosunda yönlendirilmiş bir DragEnter olayı işleyebilirsiniz. İşleyiciniz temsilciyi DragEventHandler uygulamalıdır. En belirli temsilciyi kullanarak işleyicide öğesini işleyebilir DragEventArgs ve sürükleme işleminin Data pano yükünü içeren özelliğini okuyabilirsiniz.

XAML kullanarak bir öğeye olay işleyicisi ekleme işleminin tam örneği için bkz . Yönlendirilmiş Olayı İşleme.

Kodda oluşturulan bir uygulamada yönlendirilmiş bir olay için işleyici eklemek basittir. Yönlendirilen olay işleyicileri her zaman bir yardımcı yöntemi AddHandler aracılığıyla eklenebilir (mevcut yedeklemenin için çağırdığı addyöntemle aynı yöntemdir).) Ancak, mevcut WPF yönlendirilmiş olaylar genellikle yönlendirilen olaylar için işleyicilerin add dile özgü bir olay söz dizimi tarafından eklenmesini sağlayan ve yardımcı yönteminden daha sezgisel bir söz dizimi olan yedekleme uygulamalarına ve remove mantığına sahiptir. Aşağıda yardımcı yönteminin örnek kullanımı verilmiştir:

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 gösterilmektedir (Başvuru kaldırma işlemi nedeniyle Visual Basic'in işleç söz dizimi biraz farklıdır):

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.

Visual Basic kullanıyorsanız, işleyici bildirimlerinin Handles bir parçası olarak işleyici eklemek için anahtar sözcüğünü de kullanabilirsiniz. Daha fazla bilgi için bkz . Visual Basic ve WPF Olay İşleme.

İşlenen Kavramı

Yönlendirilen tüm olaylar ortak bir olay veri tabanı sınıfını RoutedEventArgs(. ) paylaşır. RoutedEventArgsHandled bir Boole değeri alan özelliğini tanımlar. özelliğinin Handled amacı, yolu boyunca herhangi bir olay işleyicisinin değerini Handled olarak ayarlayarak yönlendirilen olayı işlenmiş olarak işaretlemesini sağlamaktırtrue. İşleyici tarafından yol boyunca bir öğede işlendikten sonra, paylaşılan olay verileri yine yol boyunca her dinleyiciye bildirilir.

değeri Handled , yönlendirilen bir olayın rota boyunca ilerledikçe nasıl bildirildiği veya işlendiği etkiler. Yönlendirilmiş bir olayın olay verilerindeyse Handledtrue , diğer öğelerde bu yönlendirilen olayı dinleyen işleyiciler genellikle söz konusu olay örneği için genellikle çağrılmaz. Bu, hem XAML'ye eklenen işleyiciler hem de veya Handlesgibi += dile özgü olay işleyici eki söz dizimleri tarafından eklenen işleyiciler için geçerlidir. En yaygın işleyici senaryoları için, bir olayı ayarlanarak Handledtrue işleniyor olarak işaretlemek, bir tünel yolu veya kabarcıklı yol için ve ayrıca bir sınıf işleyicisi tarafından yoldaki bir noktada işlenen herhangi bir olay için yönlendirmeyi "durdurur".

Ancak, dinleyicilerin olay verilerinin içinde olduğu Handled yönlendirilmiş olaylara yanıt olarak işleyicileri çalıştırabildiği bir "handledEventsToo" mekanizması vardır true . Başka bir deyişle, olay verileri işleniyor olarak işaretlenerek olay yolu gerçekten durdurulmuyor. handledEventsToo mekanizmasını yalnızca kodda veya içinde EventSetterkullanabilirsiniz:

Durumun yönlendirilmiş olaylarda ürettiği davranışa Handled ek olarak, kavramı uygulamanızı Handled nasıl tasarlamanız ve olay işleyicisi kodunu yazmanız gerektiğine yönelik etkilere sahiptir. Yönlendirilen olaylar tarafından kullanıma sunulan basit bir protokol olarak kavramsallaştırabilirsiniz Handled . Bu protokolü tam olarak nasıl kullanacağınız size bağlı ancak değerinin Handled nasıl kullanılacağına ilişkin kavramsal tasarım aşağıdaki gibidir:

  • Yönlendirilen bir olay işlendi olarak işaretlenirse, bu yol boyunca diğer öğeler tarafından yeniden işlenmesi gerekmez.

  • Yönlendirilen bir olay işlendi olarak işaretlenmemişse, yol boyunca daha önce bulunan diğer dinleyiciler bir işleyici kaydetmemeyi veya kaydedilen işleyiciler olay verilerini işlememeyi ve olarak ayarlamayı Handledtrueseçmiş olur. (Veya geçerli dinleyicinin rotadaki ilk nokta olması da mümkündür.) Geçerli dinleyicideki işleyiciler artık üç olası eylem kursuna sahiptir:

    • Hiçbir işlem yapılmaz; olay işlenmemiş olarak kalır ve olay bir sonraki dinleyiciye yönlendirilir.

    • Olaya yanıt olarak kod yürütür, ancak gerçekleştirilen eylemin olayı işlendi olarak işaretlemeye yetecek kadar önemli olmadığını belirleyin. Olay, sonraki dinleyiciye yönlendirilir.

    • Olaya yanıt olarak kod yürütür. Gerçekleştirilen eylem işlendi olarak işaretlemeyi garanti edecek kadar önemli kabul edildiğinden, işleyiciye geçirilen olay verilerinde olayı işlendi olarak işaretleyin. Olay yine bir sonraki dinleyiciye yönlendirilir, ancak Handled=true olay verilerinde olduğu için yalnızca handledEventsToo dinleyiciler başka işleyicileri çağırma fırsatına sahip olur.

Bu kavramsal tasarım, daha önce bahsedilen yönlendirme davranışıyla güçlendirilmiştir: yol üzerinde önceki bir işleyici zaten olarak ayarlanmış Handledtrueolsa bile çağrılan yönlendirilmiş olaylar için işleyici eklemek daha zordur (kod veya stillerde hala mümkün olsa da).

hakkında Handleddaha fazla bilgi için, yönlendirilen olayların sınıf işlemesi ve yönlendirilen bir olayı olarak Handledişaretlemenin ne zaman uygun olduğu hakkında öneriler için bkz . Yönlendirilen Olayları İşlenmiş Olarak İşaretleme ve Sınıf İşleme.

Uygulamalarda, yalnızca onu oluşturan nesnede kabarcıklı yönlendirilmiş bir olayı işlemek ve olayın yönlendirme özellikleriyle hiç ilgilenmemek oldukça yaygındır. Ancak, öğe ağacının daha yukarısında yer alan bir öğenin aynı yönlendirilmiş olay için de bir işleyicisi olması durumunda beklenmeyen yan etkileri önlemek için yönlendirilen olayı olay verilerinde işlendiği şekilde işaretlemek yine de iyi bir uygulamadır.

Sınıf İşleyicileri

bir şekilde öğesinden DependencyObjecttüretilen bir sınıf tanımlıyorsanız, sınıfınızın bildirilen veya devralınan olay üyesi olan yönlendirilmiş bir olay için de sınıf işleyicisi tanımlayabilir ve ekleyebilirsiniz. Sınıf işleyicileri, yönlendirilen bir olay kendi yolundaki bir öğe örneğine her ulaştığında, bu sınıfın bir örneğine bağlı olan örnek dinleyicisi işleyicilerinden önce çağrılır.

Bazı WPF denetimleri, belirli yönlendirilmiş olaylar için doğal sınıf işlemeye sahiptir. Bu, yönlendirilen olayın hiç tetiklenmediği, ancak gerçekte sınıf tarafından işlendiği ve belirli teknikleri kullanıyorsanız yönlendirilen olayın yine de örnek işleyicileriniz tarafından işlenme olasılığı olduğu ortaya çıkabilir. Ayrıca, birçok temel sınıf ve denetim, sınıf işleme davranışını geçersiz kılmak için kullanılabilecek sanal yöntemleri kullanıma sunar. Hem istenmeyen sınıf işlemeyi geçici olarak ele alma hem de özel bir sınıfta kendi sınıf işlemenizi tanımlama hakkında daha fazla bilgi için bkz . Yönlendirilmiş Olayları İşlenmiş 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. Ekli olay, rastgele bir öğeye belirli bir olay için işleyici eklemenize olanak tanır. Olayı işleyen öğenin ekli olayı tanımlaması veya devralması gerekmez ve olayı yükselten nesnenin veya hedef işleme örneğinin bu olayı sınıf üyesi olarak tanımlaması veya başka bir şekilde "sahip olması" gerekmez.

WPF giriş sistemi, ekli olayları kapsamlı olarak kullanır. Ancak, bu ekli olayların neredeyse tümü temel öğeler aracılığıyla iletilir. Daha sonra giriş olayları, temel öğe sınıfının üyesi olan eşdeğer ekli olmayan yönlendirilmiş olaylar olarak görünür. Örneğin, temel alınan ekli olayMouse.MouseDown, XAML veya kodda ekli olay söz dizimi ile ilgilenmek yerine, herhangi bir UIElementUIElement olay üzerinde kullanılarak MouseDown daha kolay işlenebilir.

WPF'deki ekli olaylar hakkında daha fazla bilgi için bkz . Ekli Olaylara Genel Bakış.

XAML'de Nitelenmiş Olay Adları

Tür adına benzeyen başka bir söz dizimi kullanımı.olay adı eklenmiş olay söz dizimidir ancak ekli olay kullanımı, alt öğeler tarafından tetiklenen yönlendirilmiş olaylar için işleyiciler eklediğinizde olur. Ortak üst öğe, ilgili yönlendirilmiş olaya üye olarak sahip olmasa bile olay yönlendirmeden yararlanmak için işleyicileri ortak bir üst öğeye eklersiniz. 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 eklendiği üst öğe dinleyicisi bir StackPanelolur. Ancak, sınıfı tarafından Button bildirilmiş ve oluşturulacak yönlendirilmiş bir olay için bir işleyici ekliyor (ButtonBase aslında, ancak devralma aracılığıyla kullanılabilir Button ). Button Olayın "sahibidir", ancak yönlendirilen olay sistemi, yönlendirilen herhangi bir olayın işleyicilerinin ortak dil çalışma zamanı (CLR) olayı için dinleyici ekleyebilen herhangi UIElement bir veya ContentElement örnek dinleyiciye eklenmesine izin verir. Bu nitelenmiş olay öznitelik 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 XAML Ad Alanları ve Ad Alanı Eşlemesi.

WPF Giriş Olayları

WPF platformunda yönlendirilen olayların sık kullanılan bir uygulaması giriş olaylarıdır. WPF'de, tünel yönlendirilmiş olay adlarına kurala göre "Önizleme" sözcüğü ön eklenmiştir. Giriş olayları genellikle biri kabarcık olayı, diğeri tünel olayı olmak üzere çiftler halinde gelir. Örneğin, KeyDown olay ve PreviewKeyDown olay aynı imzaya sahiptir; birincisi kabarcıklı giriş olayı, ikincisi ise tünel giriş olayıdır. Bazen giriş olaylarının yalnızca kabarcıklı bir sürümü veya belki de yalnızca doğrudan yönlendirilmiş bir sürümü vardır. Belgelerde, yönlendirilen olay konuları, bu tür yönlendirilmiş olaylar varsa alternatif yönlendirme stratejileriyle benzer yönlendirilmiş olaylara çapraz başvuruda bulunur ve yönetilen başvuru sayfalarındaki bölümler, yönlendirilen her olayın yönlendirme stratejisini netleştirmektedir.

Çiftler halinde gelen WPF giriş olayları, fare düğmesi basılması gibi girişteki tek bir kullanıcı eyleminin çiftin her iki yönlendirilmiş olayını da sırayla tetiklemesi için uygulanır. İlk olarak, tünel olayı oluşturulur ve rotasını dolaştırılır. Ardından, kabarcıklanma olayı yükseltilir ve rotasını dolaştırır. bubbling olayını oluşturan uygulama sınıfında yöntem çağrısı tünel olayından olay verilerini dinlediğinden ve bunu yeni yükseltilmiş olayda yeniden kullanacağından, iki olay tam anlamıyla aynı olay veri örneğini RaiseEvent paylaşır. Tünel olayı için işleyicileri olan dinleyiciler, yönlendirilen olayı işlenmiş olarak işaretlemek için ilk fırsata sahiptir (önce sınıf işleyicileri, sonra örnek işleyicileri). Tünel yolu üzerindeki bir öğe yönlendirilmiş olayı işlendi olarak işaretlediyse, zaten işlenen olay verileri kabarcık olayı için gönderilir ve eşdeğer kabarcık giriş olayları için ekli tipik işleyiciler çağrılmayacak. Dışa dönük görünümler için, işlenen kabarcıklama olayı tetiklenmemiş gibi olur. Bu işleme davranışı, bileşik parçaları yerine tüm isabet testi tabanlı giriş olaylarının veya odak tabanlı giriş olaylarının son denetiminiz tarafından raporlanmasını isteyebileceğiniz denetim birleştirme için kullanışlıdır. Son denetim öğesi, oluşturmadaki köke daha yakındır ve bu nedenle, önce tünel olayını işleme ve belki de denetim sınıfını destekleyen kodun bir parçası olarak yönlendirilen olayı denetime özgü bir olayla "değiştirme" fırsatına sahiptir.

Giriş olayı işlemenin nasıl çalıştığını gösteren bir çizim olarak aşağıdaki giriş olayı örneğini göz önünde bulundurun. Aşağıdaki ağaç çiziminde, leaf element #2 hem hem de sonra bir PreviewMouseDownMouseDown olayın kaynağıdır:

Event routing diagram

Olay işleme sırası aşağıdaki gibidir:

  1. PreviewMouseDown (tunnel) kök öğesinde.

  2. PreviewMouseDown (tünel) ara öğede #1.

  3. PreviewMouseDown (tunnel) on source element #2.

  4. MouseDown (kabarcık) kaynak öğesinde #2.

  5. MouseDown (kabarcık) ara öğede #1.

  6. MouseDown (kabarcık) kök öğesinde.

Yönlendirilmiş olay işleyici temsilcisi iki nesneye başvuru sağlar: olayı tetikleyen nesne ve işleyicinin çağrıldığı nesne. İşleyicinin çağrıldığı nesne, parametresi tarafından sender bildirilen nesnedir. Olayın ilk tetiklendiği nesne, olay verilerindeki özelliği tarafından Source bildirilir. Yönlendirilmiş bir olay yine aynı nesne tarafından oluşturulabilir ve işlenebilir; bu durumda sender ve Source aynıdır (olay işleme örnek listesinde 3. ve 4. Adımlarda bu durum söz konusudur).

Tünel oluşturma ve kabarcık oluşturma nedeniyle üst öğeler, alt öğelerinden biri olduğu Source giriş olaylarını alır. Kaynak öğenin ne olduğunu bilmek önemli olduğunda, özelliğine erişerek Source kaynak öğesini tanımlayabilirsiniz.

Genellikle, giriş olayı işaretlendikten Handledsonra başka işleyiciler çağrılmıyor. Genellikle, giriş olayının anlamını uygulamaya özgü mantıksal işlemeyi ele alan bir işleyici çağrıldığında giriş olaylarını işleniyor olarak işaretlemeniz gerekir.

Durumla ilgili Handled bu genel deyimin istisnası, olay verilerinin durumunu kasıtlı olarak yoksaymak Handled için kaydedilen giriş olay işleyicilerinin her iki yol boyunca da çağrılacağıdır. Daha fazla bilgi için bkz . Önizleme Olayları veya Yönlendirilen Olayları İşlenmiş Olarak İşaretleme ve Sınıf İşleme.

Tünel oluşturma ve kabarcıklama olayları arasındaki paylaşılan olay veri modeli ve önce tünel oluşturma, sonra da kabarcık oluşturma olaylarının sıralı olarak oluşturulması, yönlendirilen tüm olaylar için genel olarak geçerli olan bir kavram değildir. Bu davranış, WPF giriş cihazlarının giriş olay çiftlerini nasıl oluşturup bağlamayı seçtiğine göre ö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ının bu denetim içinde ne anlama geldiğini yeniden tanımlama ve yeni bir olay oluşturma amacıyla belirli giriş olaylarını sınıfla işlemeyi seçer. Daha fazla bilgi için bkz . Yönlendirilen Olayları İşlenmiş Olarak İşaretleme ve Sınıf İşleme.

Giriş ve giriş ile olayların tipik uygulama senaryolarında nasıl etkileşimde olduğu hakkında daha fazla bilgi için bkz . Girişe Genel Bakış.

EventSetters ve EventTriggers

Stillerde, bir EventSetterkullanarak işaretlemeye önceden bildirmiş bazı XAML olay işleme söz dizimini ekleyebilirsiniz. Stil uygulandığında, başvuruda bulunan işleyici stillenmiş örneğe eklenir. Yalnızca yönlendirilmiş bir olay için bildirebilirsiniz EventSetter . Aşağıda bir örnek verilmiştir. Burada başvuruda bulunılan yöntemin b1SetColor arka planda 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 edilen avantaj, stilin uygulamanızdaki herhangi bir düğmeye uygulanabilecek çok sayıda başka bilgi içerme olasılığıdır ve bu stilin EventSetter bir parçası olması, işaretleme düzeyinde bile kodun yeniden kullanılmasını teşvik eder. Ayrıca, genel uygulama ve sayfa işaretlemesinden bir EventSetter adım daha uzaktaki işleyiciler için yöntem adlarını soyutlar.

WPF'nin yönlendirilmiş olay ve animasyon özelliklerini birleştiren başka bir özelleştirilmiş söz dizimi de bir EventTrigger'dir. gibi EventSetter, bir EventTriggeriçin yalnızca yönlendirilmiş olaylar kullanılabilir. Genellikle, bir EventTrigger bir stilin parçası olarak bildirilir, ancak EventTrigger bir de koleksiyonun Triggers parçası olarak veya içinde ControlTemplatesayfa düzeyinde öğelerde bildirilebilir. , EventTrigger yönlendirilen bir Storyboard olay, kendi yolunda bu olay için bir bildiren bir öğeye ulaştığında çalışacak bir EventTrigger belirtmenizi sağlar. bir EventTrigger öğesinin yalnızca olayı işlemenin ve var olan bir görsel taslak başlatmasına neden olma avantajı, görsel taslak ve çalışma zamanı davranışı üzerinde daha iyi denetim sağlamasıdır EventTrigger . Daha fazla bilgi için bkz . Olay Tetikleyicilerini Kullanarak Görsel Taslak Başlatıldıktan Sonra Denetleme.

Yönlendirilen Olaylar Hakkında Daha Fazla Bilgi

Bu konu başlığında, temel kavramları açıklama ve çeşitli temel öğelerde ve denetimlerde zaten mevcut olan yönlendirilmiş olaylara nasıl ve ne zaman yanıt verılacağı konusunda rehberlik sunan yönlendirilmiş olaylar temel olarak ele alınmaktadır. Ancak, özel olay veri sınıfları ve temsilciler gibi gerekli tüm destekle birlikte özel sınıfınızda kendi yönlendirilmiş olayınızı oluşturabilirsiniz. Yönlendirilen olay sahibi herhangi bir sınıf olabilir, ancak yönlendirilen olayların yararlı olması için tarafından tetiklenmesi ve sınıflar tarafından veya ContentElement türetilmiş sınıflar tarafından UIElement işlenmesi gerekir. Özel olaylar hakkında daha fazla bilgi için bkz . Özel Yönlendirilmiş Olay Oluşturma.

Ayrıca bkz.