Przegląd Załączone zdarzenia

Extensible Application Markup Language (XAML) definiuje składnik języka i typ zdarzenia zwanego załączonym zdarzeniem. Koncepcja dołączonego zdarzenia umożliwia dodanie procedury obsługi dla danego zdarzenia do dowolnego elementu, a nie do elementu, który faktycznie definiuje lub dziedziczy zdarzenie. W takim przypadku ani obiekt, który potencjalnie nie może podnieść zdarzenia, ani docelowego wystąpienia obsługi definiuje lub w inny sposób "właścicielem" zdarzenia.

Wymagania wstępne

W tym temacie założono, że masz przegląd zdarzeń kierowanych do odczytu i Przegląd XAML (WPF).

Składnia dołączonego zdarzenia

Dołączone zdarzenia mają składnię języka XAML oraz wzorzec kodowania, który musi być używany przez kod zapasowy w celu obsługi dołączonego użycia zdarzenia.

W składni XAML, dołączone zdarzenie jest określone nie tylko przez jego nazwę zdarzenia, ale przez jego typ, a także nazwę zdarzenia, oddzieloną kropką (.). Ze względu na to, że nazwa zdarzenia jest kwalifikowana nazwą jego typu będącego właścicielem, podłączona składnia zdarzenia umożliwia dołączenie dowolnego dołączonego zdarzenia do dowolnego elementu, który można utworzyć wystąpienie.

Na przykład poniżej przedstawiono składnię XAML służącą do dołączania obsługi dla niestandardowego NeedsCleaning zdarzenia dołączonego:

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

Zwróć uwagę na aqua: prefiks; prefiks jest wymagany w tym przypadku, ponieważ dołączone zdarzenie jest zdarzeniem niestandardowym, które pochodzi z niestandardowego zamapowanego xmlns.

Jak WPF implementuje dołączone zdarzenia

W WPF dołączone zdarzenia są obsługiwane przez RoutedEvent pole i są kierowane przez drzewo po ich podniesieniu. Zazwyczaj źródłem dołączonego zdarzenia (obiektu, który wywołuje zdarzenie) jest system lub źródło usługi, a obiekt, który uruchamia kod, który wywołuje zdarzenie, nie jest częścią drzewa elementu.

Scenariusze dotyczące zdarzeń załączonych

W WPF dołączone zdarzenia są obecne w niektórych obszarach funkcji, w których istnieje Abstrakcja na poziomie usług, na przykład dla zdarzeń włączonych przez klasę statyczną Mouse lub Validation klasę. Klasy, które współdziałają z usługą lub używają usługi, mogą albo użyć zdarzenia w składni dołączonego zdarzenia, albo mogą zdecydować się na załączenie dołączonego zdarzenia jako zdarzenia kierowanego, które jest częścią sposobu integracji możliwości usługi przez klasę.

Chociaż WPF definiuje wiele załączonych zdarzeń, scenariusze, w których będzie można użyć lub obsłużyć dołączone zdarzenie, są bardzo ograniczone. Ogólnie rzecz biorąc, dołączone zdarzenie służy do zastosowania architektury, ale jest następnie przekazywane do niedołączonego (przy użyciu zdarzenia CLR "otoka").

Na przykład, bazowe dołączone zdarzenie Mouse.MouseDown może być łatwiej obsługiwane na dowolnym z nich UIElement przy użyciu MouseDown , które nie jest UIElement związane z załączoną SKŁADNIĄ zdarzenia w języku XAML lub kodzie. Dołączone zdarzenie służy do osiągnięcia celu w architekturze, ponieważ pozwala na przyszłe rozszerzanie urządzeń wejściowych. Hipotetyczne urządzenie będzie musiało zostać podniesione tylko Mouse.MouseDown w celu symulowania danych wejściowych myszy i nie musi pochodzić od tego Mouse do. Jednak ten scenariusz obejmuje obsługę kodu zdarzeń, a obsługa XAML dołączonego zdarzenia nie ma znaczenia dla tego scenariusza.

Obsługa dołączonego zdarzenia w WPF

Proces obsługi dołączonego zdarzenia oraz kod programu obsługi, który zostanie zapisany, jest zasadniczo taki sam jak w przypadku zdarzenia kierowanego.

Ogólnie rzecz biorąc, dołączone zdarzenie WPF nie różni się od zdarzenia trasowanego WPF. Różnice polegają na tym, jak Źródło zdarzenia i jak są udostępniane przez klasę jako element członkowski (co również ma wpływ na składnię procedury obsługi XAML).

Jednak jak wspomniano wcześniej, istniejące zdarzenia dołączone do platformy WPF nie są szczególnie przeznaczone do obsługi w WPF. Często celem zdarzenia jest włączenie elementu złożonego do raportowania stanu do elementu nadrzędnego w ramach składania, w którym to przypadku zdarzenie jest zwykle wywoływane w kodzie i opiera się na obsłudze klas w odpowiedniej klasie nadrzędnej. Na przykład elementy w obrębie Selector są oczekiwane na podnoszenie dołączonego Selected zdarzenia, które następnie są obsługiwane przez Selector klasę, a następnie mogą być konwertowane przez Selector klasę w inne zdarzenia kierowane SelectionChanged . Aby uzyskać więcej informacji o rutowanych zdarzeniach i obsłudze klas, zobacz oznaczanie zdarzeń kierowanych jako obsłużone i obsługa klas.

Definiowanie własnych załączonych zdarzeń jako zdarzeń kierowanych

Jeśli pochodzą ze wspólnych klas bazowych WPF, można zaimplementować własne dołączone zdarzenia przez dołączenie określonych metod wzorca w klasie oraz przy użyciu metod narzędziowych, które są już obecne w klasach bazowych.

Wzorzec jest następujący:

  • Procedura Add EventName z dwoma parametrami. Pierwszy parametr jest wystąpieniem, do którego zostanie dodana procedura obsługi zdarzeń. Drugi parametr jest programem obsługi zdarzeń, który ma zostać dodany. Metoda musi być public i static bez zwracanej wartości.

  • Procedura usuwania metody EventName z dwoma parametrami. Pierwszy parametr to wystąpienie, z którego jest usuwana procedura obsługi zdarzeń. Drugi parametr jest programem obsługi zdarzeń do usunięcia. Metoda musi być public i static bez zwracanej wartości.

Metoda dostępu do procedury obsługi Dodaj EventName ułatwia przetwarzanie kodu XAML, gdy atrybuty programu obsługi zdarzeń dołączone są zadeklarowane w elemencie. Metody obsługi Dodaj EventName i Remove EventName 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 precyzyjny dla praktycznej implementacji w strukturze, ponieważ każda implementacja czytnika XAML może mieć różne schematy do identyfikowania podstawowych zdarzeń w języku i architekturze pomocniczej. Jest to jedna z powodów, w których WPF implementuje dołączone zdarzenia jako zdarzenia kierowane; Identyfikator do użycia dla zdarzenia ( RoutedEvent ) jest już zdefiniowany przez system zdarzeń WPF. Ponadto kierowanie zdarzenia jest naturalnym rozszerzeniem implementacji na koncepcji poziomu języka XAML dołączonego zdarzenia.

Implementacja programu obsługi Dodaj EventName dla zdarzenia dołączonego do platformy WPF składa się z wywołania AddHandler z użyciem zdarzenia i procedury obsługi routingu jako argumentów.

Ta strategia implementacji i system zdarzeń kierowanych w ramach ogólnego ograniczenia obsługi dla dołączonych zdarzeń do UIElement klas pochodnych lub ContentElement klas pochodnych, ponieważ tylko te klasy mają AddHandler implementacje.

Na przykład poniższy kod definiuje NeedsCleaning dołączone zdarzenie w klasie Owner Aquarium przy użyciu strategii zdarzeń DOŁĄCZONEj WPF w celu zadeklarowania dołączonego zdarzenia jako zdarzenia kierowanego.

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 zauważyć, że metoda użyta do ustanowienia pola identyfikatora dołączonego zdarzenia, RegisterRoutedEvent jest w rzeczywistości tą samą metodą, która jest używana do rejestrowania niedołączonego zdarzenia kierowanego. Zdarzenia dołączone i zdarzenia kierowane są rejestrowane w scentralizowanym magazynie wewnętrznym. Ta implementacja magazynu zdarzeń umożliwia zagadnienia dotyczące pojęć "zdarzenia jako interfejs" omówione w temacie Omówienie zdarzeń kierowanych.

Wywoływanie zdarzenia dołączonego do platformy WPF

Zazwyczaj nie trzeba zgłaszać istniejących zdarzeń, które zostały dołączone przez WPF z kodu. Te zdarzenia są zgodne z ogólnym modelem koncepcyjnym "usługa", a klasy usług, takie jak InputManager są odpowiedzialne za podnoszenie poziomu zdarzeń.

Jednak w przypadku definiowania niestandardowego zdarzenia dołączonego na podstawie modelu WPF z załączonych zdarzeń w RoutedEvent programie można użyć, RaiseEvent Aby zgłosić dołączone zdarzenie z dowolnego UIElement lub ContentElement . Podnoszenie zdarzenia kierowanego (dołączonego lub nie) wymaga zadeklarowania określonego elementu w drzewie elementów jako źródła zdarzenia; to źródło jest zgłaszane jako RaiseEvent obiekt wywołujący. Określenie, który element jest raportowany jako źródło w drzewie, jest odpowiedzialnością usługi

Zobacz też