Overzicht van gekoppelde gebeurtenissen
Extensible Application Markup Language (XAML) definieert een taalonderdeel en het type gebeurtenis dat een gekoppelde gebeurteniswordt genoemd. Met het concept van een gekoppelde gebeurtenis kunt u een handler voor een bepaalde gebeurtenis toevoegen aan een willekeurig element in plaats van aan een element dat de gebeurtenis daadwerkelijk definieert of overgaat. In dit geval wordt de gebeurtenis noch mogelijk gegenereerd door het object, noch gedefinieerd of op andere wijze 'eigendom' gemaakt door de instantie die de bestemming afhandelt.
Voorwaarden
In dit onderwerp wordt ervan uitgegaan dat u Overzicht van gerouteerde gebeurtenissen hebt gelezen en XAML in WPF-.
Syntaxis van gekoppelde gebeurtenis
Gekoppelde gebeurtenissen hebben een XAML-syntaxis en een coderingspatroon dat door de back-upcode moet worden gebruikt om het gebruik van gekoppelde gebeurtenissen te ondersteunen.
In de syntaxis van XAML wordt de gekoppelde gebeurtenis niet alleen opgegeven door de naam van de gebeurtenis, maar door het eigen type plus de naam van de gebeurtenis, gescheiden door een punt (.). Omdat de gebeurtenisnaam is gekwalificeerd met de naam van het eigenaarstype, staat de syntaxis voor gekoppelde gebeurtenissen toe dat elke gekoppelde gebeurtenis aan elk element dat kan worden geïnstantieerd, wordt gekoppeld.
Het volgende is bijvoorbeeld de XAML-syntaxis voor het koppelen van een handler voor een aangepaste NeedsCleaning
gekoppelde gebeurtenis:
<aqua:Aquarium Name="theAquarium" Height="600" Width="800" aqua:AquariumFilter.NeedsCleaning="WashMe"/>
Let op het aqua:
-voorvoegsel; het voorvoegsel is in dit geval nodig omdat de gekoppelde gebeurtenis een aangepaste gebeurtenis is die afkomstig is van een aangepast toegewezen XML-namespace.
Hoe WPF gekoppelde gebeurtenissen implementeert
In WPF worden gekoppelde gebeurtenissen ondersteund door een RoutedEvent veld en worden ze doorgestuurd door de boomstructuur nadat ze zijn opgevoed. Normaal gesproken is de bron van de gekoppelde gebeurtenis (het object dat de gebeurtenis genereert) een systeem- of servicebron en het object waarmee de code wordt uitgevoerd die de gebeurtenis genereert, is daarom geen direct onderdeel van de elementstructuur.
Scenario's voor gekoppelde gebeurtenissen
In WPF zijn gekoppelde gebeurtenissen aanwezig in bepaalde functiegebieden waar abstractie op serviceniveau is, zoals voor de gebeurtenissen die zijn ingeschakeld door de statische Mouse-klasse of de Validation-klasse. Klassen die interactie hebben met of de service gebruiken, kunnen de gebeurtenis in de syntaxis van de gekoppelde gebeurtenis gebruiken, of ze kunnen ervoor kiezen om de gekoppelde gebeurtenis weer te geven als een gerouteerde gebeurtenis die deel uitmaakt van de manier waarop de klasse de mogelijkheden van de service integreert.
Hoewel WPF een aantal gekoppelde gebeurtenissen definieert, zijn de scenario's waarbij u de gekoppelde gebeurtenis rechtstreeks gebruikt of verwerkt, zeer beperkt. Over het algemeen dient de gekoppelde gebeurtenis een architectuurdoel, maar wordt deze vervolgens doorgestuurd naar een niet-gekoppelde gebeurtenis (ondersteund met een CLR-gebeurtenis 'wrapper').
De onderliggende gekoppelde gebeurtenis Mouse.MouseDown kan bijvoorbeeld eenvoudiger worden verwerkt op een bepaalde UIElement met behulp van MouseDown op die UIElement in plaats van de gekoppelde gebeurtenissyntaxis in XAML of code te verwerken. De gekoppelde gebeurtenis heeft een doel in de architectuur, omdat dit toekomstige uitbreiding van invoerapparaten mogelijk maakt. Het hypothetische apparaat hoeft alleen Mouse.MouseDown te verhogen om de invoer van de muis te simuleren en hoeft niet te worden afgeleid van Mouse om dit te doen. Dit scenario omvat echter codeafhandeling van de gebeurtenissen en XAML-verwerking van de gekoppelde gebeurtenis is niet relevant voor dit scenario.
Een gekoppelde gebeurtenis verwerken in WPF
Het proces voor het verwerken van een gekoppelde gebeurtenis en de handlercode die u gaat schrijven, is in principe hetzelfde als voor een gerouteerde gebeurtenis.
Over het algemeen verschilt een WPF-gekoppelde gebeurtenis niet erg van een WPF-gerouteerde gebeurtenis. De verschillen zijn hoe de gebeurtenis als bron wordt gebruikt en hoe deze door een klasse als lid wordt geëxposeerd (wat ook van invloed is op de XAML-handler syntaxis).
Zoals eerder vermeld, zijn de bestaande aan WPF gekoppelde gebeurtenissen echter niet bijzonder bedoeld voor verwerking in WPF. Vaker is het doel van de gebeurtenis om een samengesteld element in staat te stellen een status te rapporteren aan een bovenliggend element in compositing, in welk geval de gebeurtenis meestal wordt gegenereerd in code en ook afhankelijk is van klasseafhandeling in de relevante bovenliggende klasse. Er wordt bijvoorbeeld verwacht dat items binnen een Selector de gekoppelde Selected gebeurtenis genereren, die vervolgens wordt verwerkt door de Selector-klasse en vervolgens mogelijk door de Selector-klasse worden geconverteerd naar een andere gerouteerde gebeurtenis, SelectionChanged. Zie Gerouteerde gebeurtenissen markeren als verwerkt en klasseafhandelingvoor meer informatie over gerouteerde gebeurtenissen en klasseafhandeling.
Uw eigen gekoppelde gebeurtenissen definiëren als gerouteerde gebeurtenissen
Als u afgeleid bent van algemene WPF-basisklassen, kunt u uw eigen gekoppelde gebeurtenissen implementeren door bepaalde patroonmethoden in uw klasse op te slaan en met behulp van hulpprogrammamethoden die al aanwezig zijn op de basisklassen.
Het patroon is als volgt:
Een methode EventNameHandler toevoegen met twee parameters. De eerste parameter is het exemplaar waaraan de event-handler wordt toegevoegd. De tweede parameter is de eventhandler die moet worden toegevoegd. De methode moet
public
enstatic
zijn, zonder terugkeerwaarde.Een methode RemoveEventNameHandler met twee parameters. De eerste parameter is het exemplaar waaruit de gebeurtenis-handler wordt verwijderd. De tweede parameter is de gebeurtenis-handler die moet worden verwijderd. De methode moet
public
enstatic
zijn, zonder retourwaarde.
De AddEventNameHandler accessor method faciliteert XAML-verwerking wanneer gekoppelde gebeurtenis-handlerkenmerken worden gedeclareerd op een element. De methoden EventNameHandler toevoegen en EventNameHandler maken ook codetoegang tot de gebeurtenishandleropslag mogelijk voor de gekoppelde gebeurtenis.
Dit algemene patroon is nog niet nauwkeurig genoeg voor praktische implementatie in een framework, omdat elke XAML-lezer implementatie verschillende schema's kan hebben voor het identificeren van onderliggende gebeurtenissen in de ondersteunende taal en architectuur. Dit is een van de redenen waarom WPF gekoppelde gebeurtenissen implementeert als gerouteerde gebeurtenissen; de id die moet worden gebruikt voor een gebeurtenis (RoutedEvent) is al gedefinieerd door het WPF-gebeurtenissysteem. Het routeren van een gebeurtenis is ook een natuurlijke implementatie-extensie op het XAML-taalniveauconcept van een gekoppelde gebeurtenis.
De AddEventNameHandler-implementatie voor een WPF-attached event bestaat uit het aanroepen van de AddHandler met de gerouteerde event en handler als argumenten.
Deze implementatiestrategie en het gerouteerde gebeurtenissysteem beperken de verwerking van gekoppelde gebeurtenissen tot UIElement afgeleide klassen of ContentElement afgeleide klassen, omdat alleen die klassen AddHandler implementaties hebben.
De volgende code definieert bijvoorbeeld de NeedsCleaning
gekoppelde gebeurtenis op de eigenaarsklasse Aquarium
, met behulp van de WPF-strategie voor het declareren van de gekoppelde gebeurtenis als een gerouteerde gebeurtenis.
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
Houd er rekening mee dat de methode die wordt gebruikt voor het instellen van het gekoppelde gebeurtenis-id-veld, RegisterRoutedEvent, eigenlijk dezelfde methode is die wordt gebruikt voor het registreren van een niet-gekoppelde gerouteerde gebeurtenis. Gekoppelde gebeurtenissen en gerouteerde gebeurtenissen worden allemaal geregistreerd bij een gecentraliseerd intern archief. Deze implementatie van het gebeurtenisarchief maakt de conceptuele overweging 'gebeurtenissen als een interface' mogelijk die wordt besproken in Overzicht van gerouteerde gebeurtenissen.
Een WPF-gekoppelde gebeurtenis oproepen
Normaal gesproken hoeft u bestaande door WPF gedefinieerde gekoppelde gebeurtenissen niet op te halen uit uw code. Deze gebeurtenissen volgen het algemene conceptuele servicemodel en serviceklassen zoals InputManager zijn verantwoordelijk voor het genereren van de gebeurtenissen.
Als u echter een aangepaste gekoppelde gebeurtenis definieert op basis van het WPF-model voor het baseren van gekoppelde gebeurtenissen op RoutedEvent, kunt u RaiseEvent gebruiken om een gekoppelde gebeurtenis te genereren vanuit elke UIElement of ContentElement. Voor het genereren van een gerouteerde gebeurtenis (bijgevoegd of niet) moet u een bepaald element in de elementstructuur declareren als gebeurtenisbron; die bron wordt gerapporteerd als de RaiseEvent aanroeper. Bepalen welk element wordt gerapporteerd als de bron in de structuur is de verantwoordelijkheid van uw service
Zie ook
.NET Desktop feedback