Przegląd Załączone zdarzenia

Extensible Application Markup Language (XAML) definiuje składnik języka i typ zdarzenia nazywane dołączonym zdarzeniem. Koncepcja dołączonego zdarzenia umożliwia dodanie programu obsługi dla określonego zdarzenia do dowolnego elementu, a nie do elementu, który faktycznie definiuje lub dziedziczy zdarzenie. W takim przypadku ani obiekt, który potencjalnie ma zdarzenie, ani docelowe wystąpienie obsługi nie definiuje ani w inny sposób "jest właścicielem" zdarzenia.

Wymagania wstępne

W tym temacie założono, że w WPF przeczytano tematy Routed Events Overview (Przegląd zdarzeń tras) i XAML (XAML).

Składnia dołączonego zdarzenia

Zdarzenia dołączone mają składnię XAML i wzorzec kodowania, który musi być używany przez kod zapasowy w celu obsługi dołączonego użycia zdarzeń.

W składni JĘZYKA XAML dołączone zdarzenie jest określane nie tylko za pomocą nazwy zdarzenia, ale także typu własnego oraz nazwy zdarzenia rozdzielone kropką (.). Ponieważ nazwa zdarzenia jest kwalifikowana przy użyciu nazwy typu własnego, składnia dołączonego zdarzenia umożliwia dołączanie dowolnego dołączonego zdarzenia do dowolnego elementu, który można utworzyć wystąpienia.

Na przykład poniżej przedstawiono składnię JĘZYKA XAML do dołączania programu obsługi dla niestandardowego zdarzenia NeedsCleaning dołączonego:

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

Zanotuj prefiks. W tym przypadku prefiks jest niezbędny, ponieważ dołączone zdarzenie jest zdarzeniem niestandardowym, które pochodzi z niestandardowych aqua: mapowanych nazw xmln.

Jak WPF implementuje zdarzenia dołączone

W WPF zdarzenia dołączone są oparte na polu i są kierowane przez RoutedEvent drzewo po ich podniesionych. Zwykle źródłem dołączonego zdarzenia (obiektem, który wywołuje zdarzenie) jest źródło systemu lub usługi, a obiekt, który uruchamia kod, który zgłasza zdarzenie, nie jest więc bezpośrednią częścią drzewa elementów.

Scenariusze dotyczące zdarzeń dołączonych

W WPF zdarzenia dołączone są obecne w niektórych obszarach funkcji, w których istnieje abstrakcja poziomu usługi, na przykład dla zdarzeń włączonych przez klasę Mouse statyczną lub Validation klasę . Klasy, które wchodzą w interakcję z usługą lub korzystają z niej, mogą użyć zdarzenia w dołączonej składni zdarzenia lub wybrać opcję powierzchni dołączonego zdarzenia jako zdarzenia trasowane, które jest częścią sposobu integrowania możliwości usługi przez klasę.

Mimo że WPF definiuje wiele dołączonych zdarzeń, scenariusze, w których będziesz bezpośrednio używać dołączonego zdarzenia lub obsługiwać je bezpośrednio, są bardzo ograniczone. Ogólnie rzecz biorąc, dołączone zdarzenie służy celowi architektury, ale jest następnie przekazywane do zdarzenia trasowane nie dołączonego (z kopią "otoką" zdarzenia CLR).

Na przykład bazowe dołączone zdarzenie można łatwiej obsłużyć na dowolnym z nich, używając polecenia na tym, zamiast zajmować się dołączaną składnią zdarzeń w Mouse.MouseDown UIElement MouseDown UIElement języku XAML lub kodzie. Dołączone zdarzenie służy celowi w architekturze, ponieważ umożliwia przyszłe rozszerzanie urządzeń wejściowych. Hipotetyczne urządzenie musi jedynie podnieść poziom w celu symulowania danych wejściowych myszy i nie musi pochodzić z tego Mouse.MouseDown Mouse celu. Jednak ten scenariusz obejmuje obsługę kodu zdarzeń i obsługę XAML dołączonego zdarzenia nie jest istotne w tym scenariuszu.

Obsługa zdarzenia dołączonego w WPF

Proces obsługi dołączonego zdarzenia i kod procedury obsługi, który napiszesz, jest zasadniczo taki sam jak w przypadku zdarzenia trasowane.

Ogólnie rzecz biorąc, zdarzenie dołączone do WPF nie różni się bardzo od zdarzenia trasowane WPF. Różnice dotyczą sposobu źródła zdarzenia i sposobu, w jaki jest ono udostępniane przez klasę jako składową (co ma również wpływ na składnię obsługi XAML).

Jednak, jak wspomniano wcześniej, istniejące zdarzenia dołączone do WPF nie są szczególnie przeznaczone do obsługi w WPF. Częściej celem zdarzenia jest umożliwienie złożonemu elementowi zgłaszania stanu elementowi nadrzędnemu podczas składania. W takim przypadku zdarzenie jest zwykle wywoływane w kodzie i opiera się również na obsłudze klas w odpowiedniej klasie nadrzędnej. Na przykład elementy w klasie powinny zgłaszać dołączone zdarzenie, które następnie jest obsługiwane przez klasę, a następnie potencjalnie konwertowane przez klasę na inne zdarzenie Selector Selected Selector Selector trasowane, SelectionChanged . Aby uzyskać więcej informacji na temat trasowane zdarzeń i obsługi klas, zobacz Oznaczanie zdarzeń trasowane jako obsłużone i Obsługa klas.

Definiowanie własnych dołączonych zdarzeń jako zdarzeń trasowych

Jeśli korzystasz ze wspólnych klas bazowych WPF, możesz zaimplementować własne zdarzenia dołączone, uwzględniając niektóre metody wzorców w klasie i używając metod narzędziowych, które są już obecne w klasach bazowych.

Wzorzec jest następujący:

  • Metoda Add EventName Handler z dwoma parametrami. Pierwszy parametr to wystąpienie, do którego jest dodawany program obsługi zdarzeń. Drugi parametr to procedura obsługi zdarzeń do dodania. Metoda musi mieć wartości public static i bez zwracanej wartości.

  • Metoda Remove EventName Handler z dwoma parametrami. Pierwszy parametr to wystąpienie, z którego jest usuwany program obsługi zdarzeń. Drugi parametr to procedura obsługi zdarzeń do usunięcia. Metoda musi mieć wartości public static i bez zwracanej wartości.

Metoda dostępu Dodawania procedury obsługi EventName ułatwia przetwarzanie XAML, gdy dołączone atrybuty procedury obsługi zdarzeń są deklarowane w elemencie. Metody Dodaj program obsługi EventName i Usuń nazwę_zdarzenia umożliwiają również dostęp kodu do magazynu obsługi zdarzeń dla dołączonego zdarzenia.

Ten ogólny wzorzec nie jest jeszcze wystarczająco dokładny dla praktycznej implementacji w strukturze, ponieważ każda implementacja czytnika XAML może mieć różne schematy identyfikowania zdarzeń bazowych w języku i architekturze źródłowej. Jest to jeden z powodów, dla których WPF implementuje zdarzenia dołączone jako zdarzenia trasowane; Identyfikator do użycia dla zdarzenia ( RoutedEvent ) jest już zdefiniowany przez system zdarzeń WPF. Ponadto kierowanie zdarzenia jest naturalnym rozszerzeniem implementacji koncepcji na poziomie języka XAML dołączonego zdarzenia.

Implementacja procedury obsługi Add EventName dla zdarzenia dołączonego do WPF składa się z wywołania obiektu z przekierowywanego zdarzenia AddHandler i procedury obsługi jako argumentami.

Ta strategia implementacji i system zdarzeń trasowanych ogólnie ograniczają obsługę zdarzeń dołączonych do klas pochodnych lub klas pochodnych, ponieważ tylko te klasy UIElement ContentElement mają AddHandler implementacje.

Na przykład poniższy kod definiuje dołączone zdarzenie w klasie owner przy użyciu strategii zdarzeń dołączonych WPF, która deklaruje dołączone zdarzenie jako zdarzenie NeedsCleaning Aquarium trasowane.

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

Należy pamiętać, że metoda używana do ustanowienia dołączonego pola identyfikatora zdarzenia, , jest w rzeczywistości taką samą metodą, która jest używana do rejestrowania niezałączona RegisterRoutedEvent trasowane zdarzenie. Wszystkie zdarzenia dołączone i trasowane są rejestrowane w scentralizowanym magazynie wewnętrznym. Ta implementacja magazynu zdarzeń umożliwia zagadnienia koncepcyjne "zdarzenia jako interfejs", które omówiono w artykule Routed Events Overview (Przegląd zdarzeń trasowanych).

Podnoszenie zdarzenia dołączonego do WPF

Zazwyczaj nie trzeba zgłaszać istniejących zdarzeń dołączonych zdefiniowanych przez WPF z kodu. Te zdarzenia są zgodne z ogólnym modelem koncepcyjnym "usługi", a klasy usług, takie jak , są odpowiedzialne InputManager za podnoszenie zdarzeń.

Jeśli jednak definiujesz niestandardowe zdarzenie dołączone na podstawie modelu WPF opartego na zdarzeniach dołączonych na , możesz użyć funkcji w celu podniesienia dołączonego zdarzenia z RoutedEvent RaiseEvent dowolnego lub UIElement ContentElement . Podnoszenie zdarzenia trasowane (dołączone lub nie) wymaga zadeklarowania określonego elementu w drzewie elementów jako źródła zdarzeń; to źródło jest zgłaszane jako RaiseEvent wywołujący. Określenie, który element jest zgłaszany jako źródło w drzewie, jest odpowiedzialna za usługę

Zobacz też