Sdílet prostřednictvím


Přehled připojených událostí

Jazyk XAML (Extensible Application Markup Language) definuje komponentu jazyka a typ události označované jako připojená událost. Koncept připojené události umožňuje přidat obslužnou rutinu konkrétní události do libovolného prvku, nikoli k elementu, který skutečně definuje nebo dědí událost. V tomto případě ani objekt potenciálně vyvolá událost, ani instance cílového zpracování nedefinuje ani jinak "vlastní" událost.

Předpoklady

V tomto tématu se předpokládá, že jste si přečetli přehled směrovaných událostí a XAML ve WPF.

Syntaxe připojených událostí

Připojené události mají syntaxi XAML a vzor kódování, který musí backingový kód používat, aby bylo možné podporovat použití připojených událostí.

V syntaxi XAML je připojená událost určena nejen názvem události, ale vlastním typem a názvem události odděleným tečkou (.). Vzhledem k tomu, že název události je kvalifikovaný s názvem vlastního typu, syntaxe připojené události umožňuje připojit všechny připojené události k libovolnému prvku, který lze vytvořit instanci.

Například následující syntaxe XAML pro připojení obslužné rutiny pro vlastní NeedsCleaning připojenou událost:

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

aqua: Všimněte si předpony. V tomto případě je předpona nezbytná, protože připojená událost je vlastní událost, která pochází z vlastních mapovaných xmlnů.

Implementace připojených událostí WPF

Ve WPF jsou připojené události zálohovány polem RoutedEvent a jsou směrovány stromem po jejich vyvolání. Zdroj připojené události (objekt, který vyvolá událost) je obvykle systém nebo zdroj služby a objekt, který spouští kód, který vyvolá událost, proto není přímou součástí stromu elementu.

Scénáře pro připojené události

Ve WPF jsou připojené události přítomny v určitých oblastech funkcí, kde existuje abstrakce na úrovni služby, například pro události povolené statickou Mouse třídou nebo Validation třídou. Třídy, které komunikují se službou nebo ji používají, mohou buď použít událost v syntaxi připojené události, nebo se mohou rozhodnout připojit událost jako směrovanou událost, která je součástí toho, jak třída integruje možnosti služby.

I když WPF definuje řadu připojených událostí, scénáře, ve kterých budete buď používat nebo zpracovávat připojenou událost přímo, jsou velmi omezené. Obecně platí, že připojená událost slouží k účelu architektury, ale pak se přepošla na událost směrovanou událostí CLR (zazálohovanou událostí CLR).

Například podkladová připojená událost Mouse.MouseDown může být snadněji zpracována u libovolného daného objektu UIElement pomocí toho MouseDown , aby UIElement se místo zpracování připojené syntaxe událostí buď v XAML, nebo kódu. Připojená událost slouží k účelu v architektuře, protože umožňuje budoucí rozšíření vstupních zařízení. Hypotetické zařízení by potřebovalo Mouse.MouseDown zvýšit pouze za účelem simulace vstupu myši a nemuselo by od Mouse toho odvozovat. Tento scénář ale zahrnuje zpracování kódu událostí a zpracování xaml připojené události není pro tento scénář relevantní.

Zpracování připojené události ve WPF

Proces zpracování připojené události a kódu obslužné rutiny, který napíšete, je v podstatě stejný jako u směrované události.

Obecně platí, že připojená událost WPF se od směrované události WPF příliš neliší. Rozdíly jsou způsob, jakým je událost zdrojována a jak je vystavena třídou jako člen (což má vliv také na syntaxi obslužné rutiny XAML).

Jak je však uvedeno dříve, stávající připojené události WPF nejsou zvláště určeny pro zpracování ve WPF. Častěji je účelem události umožnit složený prvek hlásit stav nadřazeného elementu v kompozitingu, v takovém případě je událost obvykle vyvolána v kódu a také spoléhá na zpracování tříd v příslušné nadřazené třídě. Například položky v rámci objektu Selector mají vyvolat připojenou Selected událost, což je pak třída zpracována Selector třídou a pak potenciálně převedena Selector třídou na jinou směrovanou událost, SelectionChanged. Další informace o směrovaných událostech a zpracování tříd naleznete v tématu Označení směrovaných událostí jako zpracovávaných a zpracování tříd.

Definování vlastních připojených událostí jako směrovaných událostí

Pokud vycházíte z běžných základních tříd WPF, můžete implementovat vlastní připojené události zahrnutím určitých metod vzorů ve vaší třídě a pomocí metod nástroje, které již existují v základních třídách.

Vzor je následující:

  • Metoda AddEventNameObslužná rutina se dvěma parametry. Prvním parametrem je instance, do které je přidána obslužná rutina události. Druhým parametrem je obslužná rutina události, která se má přidat. Metoda musí být public a static, bez návratové hodnoty.

  • Metoda RemoveEventNameObslužná rutina se dvěma parametry. Prvním parametrem je instance, ze které je obslužná rutina události odebrána. Druhým parametrem je obslužná rutina události, která se má odebrat. Metoda musí být public a static, bez návratové hodnoty.

Add EventNameHandler accessor metoda usnadňuje zpracování XAML při připojené atributy obslužné rutiny události jsou deklarovány v elementu. Metody AddEventNameobslužné rutiny a RemoveEventName také umožňují přístup kódu k úložišti obslužné rutiny události pro připojenou událost.

Tento obecný vzor zatím není dostatečně přesný pro praktickou implementaci v architektuře, protože jakákoli implementace čtenáře XAML může mít různá schémata pro identifikaci základních událostí v podpůrném jazyce a architektuře. To je jeden z důvodů, proč WPF implementuje připojené události jako směrované události; identifikátor, který se má použít pro událost (RoutedEvent) je již definován systémem událostí WPF. Směrování události je také přirozené rozšíření implementace v konceptu na úrovni jazyka XAML připojené události.

Implementace obslužné rutiny AddEventNamepro připojenou událost WPF se skládá z volání AddHandler s směrovanou událostí a obslužnou rutinou jako argumenty.

Tato strategie implementace a směrovaný systém událostí obecně omezují zpracování připojených událostí na UIElement odvozené třídy nebo ContentElement odvozené třídy, protože pouze tyto třídy mají AddHandler implementace.

Například následující kód definuje připojenou NeedsCleaning událost ve třídě Aquariumowner pomocí strategie události připojené WPF deklarování připojené události jako směrované události.

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

Všimněte si, že metoda použitá k vytvoření pole identifikátoru připojené události , RegisterRoutedEventje ve skutečnosti stejná metoda, která se používá k registraci ne připojené směrované události. Připojené události a směrované události jsou zaregistrované v centralizovaném interním úložišti. Tato implementace úložiště událostí umožňuje koncepční aspekty "události jako rozhraní", které jsou popsány v přehledu směrovaných událostí.

Vyvolání připojené události WPF

Obvykle není nutné z kódu vyvolat existující připojené události definované WPF. Tyto události se řídí obecným koncepčním modelem "služby" a třídy služeb, jako InputManager jsou zodpovědné za vyvolání událostí.

Pokud však definujete vlastní připojenou událost založenou na modelu WPF založeném na RoutedEventzaložení připojených událostí , můžete použít RaiseEvent k vyvolání připojené události z libovolné UIElement nebo ContentElement. Vyvolání směrované události (připojené nebo ne) vyžaduje, abyste deklarovali konkrétní prvek ve stromu elementu jako zdroj události; tento zdroj je hlášen jako RaiseEvent volající. Určení, který prvek je hlášen jako zdroj ve stromu, je odpovědností vaší služby

Viz také