Ekli Olaylara Genel Bakış

Extensible Application Markup Language (XAML), bir dil bileşeni ve ekli olayolarak adlandırılan olay türünü tanımlar. Ekli bir olay kavramı, olayı gerçekten tanımlayan veya devralan bir öğe yerine, belirli bir olaya yönelik bir işleyiciyi rastgele bir öğeye eklemenizi sağlar. Bu durumda, nesne potansiyel olarak ne tür bir şekilde tetiklemez ve hedef işleme örneği, olayı tanımlar veya başka bir şekilde "sahip değildir".

Önkoşullar

Bu konu, WPF 'deyönlendirilmiş olaylara genel bakış ve xaml okuma olduğunu varsayar.

Ekli olay sözdizimi

Ekli olaylarda, ekli olay kullanımını desteklemek için, yedekleme kodu tarafından kullanılması gereken bir XAML sözdizimi ve bir kodlama düzeni vardır.

XAML sözdiziminde, ekli olay yalnızca kendi olay adı tarafından değil, sahip türü ve bir noktayla (.) ayrılmış olan olay adı ile belirtilir. Olay adı, sahip olduğu türün adıyla nitelenbildiğinden, ekli olay sözdizimi, hiçbir ekli olayın, örneklenebilir herhangi bir öğeye eklenmesini sağlar.

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

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

Ön eke göz önünde, aqua: ekli olay özel eşlenmiş bir xmlns 'den gelen özel bir olay olduğundan, bu örnekte önek gereklidir.

WPF ekli olayları nasıl uygular

WPF 'de, ekli olaylar bir alan tarafından desteklenir RoutedEvent ve oluşturulduktan sonra ağaç üzerinden yönlendirilir. Genellikle, ekli olayın kaynağı (olayı oluşturan nesnesi) 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 olaylara yönelik senaryolar

WPF 'de, ekli olaylar, statik sınıf veya sınıf tarafından etkinleştirilen olaylar gibi, hizmet düzeyi soyutlama olan belirli özellik alanlarında bulunur MouseValidation . Ya da hizmetini kullanan sınıflar, ekli olay söz diziminde olayını kullanabilir ya da ekli olayı sınıfın hizmetin yeteneklerini nasıl tümleştirdiğini gösteren yönlendirilmiş bir olay olarak yüzey seçebilirler.

WPF bir dizi ekli olayı tanımlasa da, ekli olayı doğrudan kullanacağınız veya işleyebileceğiniz senaryolar çok sınırlı olur. Genellikle, ekli olay bir mimari amaca hizmet eder, ancak daha sonra eklenmemiş (CLR olayı "sarmalayıcı") yönlendirilmiş bir olayla iletilir.

Örneğin, temel alınan eklenen olay Mouse.MouseDownUIElementMouseDownUIElement XAML veya koddaki ekli olay söz dizimi ile ilgilenmektense, üzerinde kullanılarak herhangi bir şekilde daha kolay işlenebilir. Eklenen olay, giriş cihazlarının gelecekteki genişlemesine izin verdiğinden, mimaride bir amaca hizmet eder. Kuramsal cihazın yalnızca fare girişinin benzetimini yapmak için yapması gerekir Mouse.MouseDown ve ' dan ' a türetmeleri gerekmez Mouse . Ancak, bu senaryo olayların kod işlemesini içerir ve ekli etkinliğin XAML işleme Bu senaryoyla ilgili değildir.

WPF 'de ekli olay işleme

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

Genel olarak, WPF ekli olayı WPF yönlendirilmiş olayından çok farklı değildir. Farklar olayın kaynağını belirleme ve bir sınıf tarafından bir üye olarak nasıl açığa çıkarılacağıdır (Ayrıca XAML işleyicisi söz dizimini da etkiler).

Ancak, daha önce belirtildiği gibi, mevcut WPF ekli olayları özellikle WPF 'de işlemeye yöneliktir. Daha sık, olayın amacı, bir örneği birleştirme sırasında bir üst öğeye raporlamak için bir Oluşturucu bir öğe sağlamaktır, bu durumda olay genellikle kodda tetiklenir ve ayrıca ilgili üst sınıfta sınıf işlemeye dayanır. Örneğin, bir içindeki öğelerin, SelectorSelected daha sonra sınıf tarafından işlenen Selector ve daha sonra Selector sınıf tarafından farklı bir yönlendirilmiş olaya dönüştürüldüğü, eklenen olayı oluşturması beklenir SelectionChanged . Yönlendirilmiş olaylar ve sınıf işlemesi hakkında daha fazla bilgi için bkz. yönlendirilmiş olayları işlenmiş olarak işaretleme ve sınıf işleme.

Kendi ekli olaylarınızı yönlendirilmiş olaylar olarak tanımlama

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

Bu model aşağıdaki gibidir:

  • Bir yöntem, iki parametreli bir EventNameişleyicisi ekler . İlk parametre olay işleyicisinin eklendiği örneğidir. İkinci parametre, eklenecek olay işleyicisidir. Yöntemi publicstatic , dönüş değeri olmadan ve olmalıdır.

  • Bir yöntem ,EventNameIşleyicisini iki parametreyle kaldırır. İlk parametre olay işleyicisinin kaldırıldığı örneğidir. İkinci parametre, kaldırılacak olay işleyicisidir. Yöntemi publicstatic , dönüş değeri olmadan ve olmalıdır.

EventNameişleyicisi ekleme erişimcisi yöntemi, ekli olay işleyicisi ÖZNITELIKLERI bir öğede bildirildiğinde xaml işlemesini kolaylaştırır. EventNameHandler ve RemoveEventNameHandler yöntemleri, ekli olay için olay işleyicisi deposuna kod erişimini de etkinleştirir.

Bu genel düzen bir çerçevede pratik uygulama için yeterince kesin değildir, çünkü herhangi bir XAML okuyucu uygulamasının destekleyici dilde ve mimaride temel olayları tanımlamak için farklı şemaları olabilir. Bu, WPF 'nin ekli olayları yönlendirilmiş olaylar olarak uyguladığı nedenlerinden biridir; bir Event () için kullanılacak tanımlayıcı, RoutedEvent WPF olay sistemi tarafından zaten tanımlanmış. Ayrıca, bir olayı yönlendirme, ekli bir olayın XAML dil düzeyi kavramında doğal bir uygulama uzantısıdır.

WPF ekli olayı için EventNameişleyicisi ekleme , bağımsız değişken olarak yönlendirilmiş olay ve işleyicinin çağrılmasını içerir.

Bu uygulama stratejisi ve yönlendirilmiş olay sistemi, UIElementContentElement yalnızca bu sınıfların uygulamaları olduğundan, eklenen olaylar için türetilmiş sınıflara veya türetilmiş sınıflara yönelik işlemeyi kısıtlar AddHandler .

Örneğin, aşağıdaki kod, ekli olayı NeedsCleaningAquarium yönlendirilmiş olay olarak bildiren WPF Ekli olay stratejisini kullanarak Owner sınıfında ekli olayı tanımlar.

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ı alanını oluşturmak için kullanılan yöntemin RegisterRoutedEvent gerçekten, eklenmemiş bir yönlendirilmiş olayı kaydetmek için kullanılan yöntem olduğunu unutmayın. Ekli olaylar ve yönlendirilmiş olaylar, merkezi bir dahili depoya kaydedilir. Bu olay depolama uygulama, yönlendirilmiş olaylara genel bakışbölümünde ele alınan "arabirim olarak olaylar" kavramsal değerlendirmesi sunar.

WPF ekli olayını yükseltme

Genellikle, kodunuzda mevcut WPF tanımlı ekli olayları uygulamanız gerekmez. Bu olaylar genel "hizmet" kavramsal modelini izler ve gibi hizmet sınıfları InputManager olayları oluşturmaktan sorumludur.

Ancak, ekli olayları temel alan WPF modeline dayalı özel bir ekli olay tanımlıyorsanız RoutedEvent , RaiseEvent herhangi bir veya arasında ekli olay yükseltmek için kullanabilirsiniz UIElementContentElement . Yönlendirilmiş bir olayı (ekli veya değil) yükseltmek için, öğe ağacında olay kaynağı olarak belirli bir öğeyi bildirmeniz gerekir; Bu kaynak çağıran olarak bildirilir RaiseEvent . Ağaçta kaynak olarak hangi öğenin bildirileceğini belirleme hizmetinizin sorumluluğu

Ayrıca bkz.