Ekli Olaylara Genel Bakış

Genişletilebilir Uygulama biçimlendirme dili (XAML), ekli olay olarak adlandırılan bir dil bileşenini ve olay türünü tanımlar. Ekli olay kavramı, olayı gerçekten tanımlayan veya devralan bir öğe yerine rastgele bir öğeye belirli bir olay için işleyici eklemenize olanak tanır. Bu durumda, ne olayı yükselten nesne ne de hedef işleme örneği olayı tanımlar veya başka bir şekilde "sahip olur".

Ön koşullar

Bu konuda, WPF'de Yönlendirilmiş Olaylara Genel Bakış ve XAML okuduğunuz varsayılır.

Ekli Olay Söz Dizimi

Ekli olayların XAML söz dizimi ve ekli olay kullanımını desteklemek için yedekleme kodu tarafından kullanılması gereken bir kodlama deseni vardır.

XAML söz diziminde, eklenen olay yalnızca olay adıyla değil, sahip olan türüyle ve olay adıyla nokta (.) ile ayrılmış olarak belirtilir. Olay adı, sahip olduğu türün adıyla nitelendiğinden, ekli olay söz dizimi, eklenen tüm olayın örneklenebilen herhangi bir öğeye eklenmesini sağlar.

Örneğin, özel NeedsCleaning bir ekli olay için işleyici eklemeye yönelik XAML söz dizimi aşağıda verilmiştir:

<aqua:Aquarium Name="theAquarium" Height="600" Width="800" aqua:AquariumFilter.NeedsCleaning="WashMe"/>

Öneki not alın aqua: ; ekli olay özel eşlenmiş xmln'lerden gelen özel bir olay olduğundan bu durumda ön ek gereklidir.

WPF Ekli Olayları Nasıl Uygular?

WPF'de, eklenen olaylar bir RoutedEvent alan tarafından desteklenir ve bunlar yükseltildikten sonra ağaç üzerinden yönlendirilir. Genellikle, ekli olayın kaynağı (olayı oluşturan nesne) bir sistem veya hizmet kaynağıdır ve olayı oluşturan kodu çalıştıran nesne bu nedenle öğe ağacının doğrudan bir parçası değildir.

Ekli Olaylar için Senaryolar

WPF'de, statik sınıfın veya Validation sınıfın etkinleştirdiği Mouse olaylar gibi hizmet düzeyi soyutlamanın bulunduğu belirli özellik alanlarında ekli olaylar bulunur. Hizmetle etkileşim kuran veya hizmeti kullanan sınıflar, ekli olay söz diziminde olayı kullanabilir veya ekli olayı sınıfın hizmetin özelliklerini tümleştirmesinin bir parçası olan yönlendirilmiş olay olarak ortaya çıkar.

WPF bir dizi ekli olayı tanımlasa da, ekli olayı doğrudan kullanacağınız veya işleyebileceğiniz senaryolar çok sınırlıdır. Genel olarak, eklenen olay bir mimari amacına hizmet eder, ancak daha sonra bağlı olmayan (CLR olayı "sarmalayıcı" ile birlikte) yönlendirilmiş bir olaya iletilir.

Ö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. Eklenen olay, giriş cihazlarının gelecekte genişletilmesine olanak tanıdığından mimaride bir amaca hizmet eder. Varsayımsal cihazın yalnızca fare girişini simüle etmek için yükseltmesi Mouse.MouseDown gerekir ve bunu yapmak için öğesinden Mouse türetilmesi gerekmez. Ancak, bu senaryo olayların kod işlemesini içerir ve ekli olayın XAML işlemesi bu senaryoyla ilgili değildir.

WPF'de Ekli Olayı İşleme

Ekli olayı işleme işlemi ve yazacağınız işleyici kodu temelde yönlendirilen olayla aynıdır.

Genel olarak, eklenen WPF olayı WPF yönlendirilmiş olayından çok farklı değildir. Farklar, olayın nasıl kaynaklandığı ve bir sınıf tarafından üye olarak nasıl kullanıma sunulduğudur (XAML işleyici söz dizimini de etkiler).

Ancak, daha önce belirtildiği gibi, mevcut WPF ekli olayları özellikle WPF'de işlemeye yönelik değildir. Daha sık, olayın amacı bileşik bir öğenin birleştirmede bir üst öğeye bir durumu raporlamasını sağlamaktır; bu durumda olay genellikle kodda oluşturulur ve ayrıca ilgili üst sınıfta sınıf işlemeye dayanır. Örneğin, içindeki Selector öğelerin ekli Selected olayı oluşturması beklenir. Bu olay, sınıfı tarafından Selector işlenen ve sınıf tarafından Selector yönlendirilmiş farklı bir olaya SelectionChangeddönüştürülebilir. Yönlendirilen olaylar ve sınıf işleme hakkında daha fazla bilgi için bkz . Yönlendirilen Olayları İşlenmiş Olarak İşaretleme ve Sınıf İşleme.

Kendi Ekli Olaylarınızı Yönlendirilmiş Olaylar Olarak Tanımlama

Ortak WPF temel sınıflarından türetiyorsanız, sınıfınıza belirli desen yöntemlerini ekleyerek ve temel sınıflarda zaten mevcut olan yardımcı program yöntemlerini kullanarak kendi ekli olaylarınızı uygulayabilirsiniz.

Desen aşağıdaki gibidir:

  • İki parametreli EventNameİşleyicisi Eklemeyöntemi. İlk parametre, olay işleyicisinin eklendiği örnektir. İkinci parametre, eklenecek olay işleyicisidir. yöntemi, dönüş değeri olmayan ve staticolmalıdırpublic.

  • İki parametreli EventNameİşleyicisini Kaldırmayöntemi. İlk parametre, olay işleyicisinin kaldırıldığı örnektir. İkinci parametre, kaldırılacak olay işleyicidir. yöntemi, dönüş değeri olmayan ve staticolmalıdırpublic.

AddEventNameHandler accessor yöntemi, ekli olay işleyici öznitelikleri bir öğede bildirildiğinde XAML işlemeyi kolaylaştırır. Add EventNameHandler and RemoveEventNameHandler yöntemleri, ekli olay için olay işleyici deposuna kod erişimini de etkinleştirir.

Herhangi bir XAML okuyucu uygulamasının destekleyici dil ve mimarideki temel olayları tanımlamak için farklı düzenleri olabileceğinden, bu genel desen henüz bir çerçevedeki pratik uygulama için yeterince kesin değildir. WPF'nin ekli olayları yönlendirilmiş olaylar olarak uygulamasının nedenlerinden biri budur; bir olay (RoutedEvent) için kullanılacak tanımlayıcı WPF olay sistemi tarafından zaten tanımlanmıştır. Ayrıca, bir olayı yönlendirmek, ekli bir olayın XAML dil düzeyi kavramı üzerindeki doğal bir uygulama uzantısıdır.

Bir WPF ekli olayı için EventNameİşleyicisi Eklemeuygulaması, yönlendirilen olay ve işleyici ile bağımsız değişken olarak öğesini çağırmaktan AddHandler oluşur.

Bu uygulama stratejisi ve genel olarak yönlendirilen olay sistemi, ekli olayların işlenmesini türetilmiş sınıflarla UIElement veya ContentElement türetilmiş sınıflarla kısıtlar, çünkü yalnızca bu sınıfların uygulamaları vardır AddHandler .

Örneğin, aşağıdaki kod, ekli olayı yönlendirilmiş olay olarak bildirmeye yönelik WPF ekli olay stratejisini kullanarak sahip sınıfında Aquariumekli olayı tanımlarNeedsCleaning.

public static readonly RoutedEvent NeedsCleaningEvent = EventManager.RegisterRoutedEvent("NeedsCleaning", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(AquariumFilter));
public static void AddNeedsCleaningHandler(DependencyObject d, RoutedEventHandler handler)
{
    UIElement uie = d as UIElement;
    if (uie != null)
    {
        uie.AddHandler(AquariumFilter.NeedsCleaningEvent, handler);
    }
}
public static void RemoveNeedsCleaningHandler(DependencyObject d, RoutedEventHandler handler)
{
    UIElement uie = d as UIElement;
    if (uie != null)
    {
        uie.RemoveHandler(AquariumFilter.NeedsCleaningEvent, handler);
    }
}
Public Shared ReadOnly NeedsCleaningEvent As RoutedEvent = EventManager.RegisterRoutedEvent("NeedsCleaning", RoutingStrategy.Bubble, GetType(RoutedEventHandler), GetType(AquariumFilter))
Public Shared Sub AddNeedsCleaningHandler(ByVal d As DependencyObject, ByVal handler As RoutedEventHandler)
    Dim uie As UIElement = TryCast(d, UIElement)
    If uie IsNot Nothing Then
        uie.AddHandler(AquariumFilter.NeedsCleaningEvent, handler)
    End If
End Sub
Public Shared Sub RemoveNeedsCleaningHandler(ByVal d As DependencyObject, ByVal handler As RoutedEventHandler)
    Dim uie As UIElement = TryCast(d, UIElement)
    If uie IsNot Nothing Then
        uie.RemoveHandler(AquariumFilter.NeedsCleaningEvent, handler)
    End If
End Sub

ekli olay tanımlayıcısı alanını oluşturmak için kullanılan yöntemin, RegisterRoutedEventekli olmayan yönlendirilmiş olayı kaydetmek için kullanılan yöntemle aslında aynı olduğunu unutmayın. Eklenen olaylar ve yönlendirilen olayların tümü merkezi bir iç depoya kaydedilir. Bu olay deposu uygulaması, Yönlendirilen Olaylara Genel Bakış bölümünde açıklanan "arabirim olarak olaylar" kavramsal değerlendirmesini etkinleştirir.

WPF Ekli Olayı Oluşturma

Normalde kodunuzdan wpf tanımlı ekli olayları oluşturmanız gerekmez. Bu olaylar genel "hizmet" kavramsal modelini izler ve gibi InputManager hizmet sınıfları olayları oluşturmakla sorumludur.

Ancak, üzerinde ekli olayları temel alan WPF modelini temel alan özel bir ekli olay RoutedEventtanımlıyorsanız, herhangi UIElement bir veya ContentElementöğesinden ekli olay oluşturmak için kullanabilirsinizRaiseEvent. Yönlendirilmiş olay (ekli veya değil) oluşturmak için öğe ağacındaki belirli bir öğeyi olay kaynağı olarak bildirmeniz gerekir; bu kaynak çağıran olarak RaiseEvent bildirilir. Ağaçtaki kaynak olarak bildirilen öğeyi belirlemek hizmetinizin sorumluluğundadır

Ayrıca bkz.