Förhandsgranskningshändelser
Förhandsgranskningshändelser, även kallade tunnelhändelser, är dirigerade händelser där vägens riktning färdas från programroten mot elementet som skapade händelsen och rapporteras som källan i händelsedata. Alla händelsescenarier stöder eller kräver inte förhandsversionshändelser. I det här avsnittet beskrivs situationer där förhandsgranskningshändelser finns, hur program eller komponenter ska hantera dem och fall där det kan vara lämpligt att skapa förhandsgranskningshändelser i anpassade komponenter eller klasser.
Förhandsgranska händelser och indata
När du hanterar förhandsversionshändelser i allmänhet bör du vara försiktig med att markera de händelser som hanteras i händelsedata. Att hantera en förhandsgranskningshändelse på något annat element än elementet som skapade den (elementet som rapporteras som källa i händelsedata) innebär att det inte ger ett element möjlighet att hantera händelsen som den härstammar från. Ibland är detta det önskade resultatet, särskilt om elementen i fråga finns i relationer inom en kontrolls sammansättning.
För indatahändelser specifikt delar förhandsversionshändelser även händelsedatainstanser med motsvarande bubblande händelse. Om du använder en händelseklasshanterare för förhandsversion för att markera den hanterade indatahändelsen anropas inte den bubblande indatahändelseklasshanteraren. Om du använder en förhandsgranskningshändelseinstanshanterare för att markera händelsen som hanterad, kommer hanterare för den bubblande händelsen vanligtvis inte att anropas. Klasshanterare eller instanshanterare kan registreras eller kopplas med ett alternativ som ska anropas även om händelsen är markerad som hanterad, men den tekniken används inte ofta.
Mer information om hantering av klasser och hur det relaterar till förhandsgranskningshändelser finns i Marking Routed Events as Handled och Class Handling.
Så här kringgår du händelseblockering i kontroller
Ett scenario där förhandsversionshändelser ofta används är för sammansatt kontrollhantering av indatahändelser. Ibland förhindrar kontrollens författare att en viss händelse kommer från deras kontroll, kanske för att ersätta en komponentdefinierad händelse som innehåller mer information eller innebär ett mer specifikt beteende. Till exempel undertrycker en WPF (Windows Presentation Foundation) ButtonMouseLeftButtonDown och MouseRightButtonDown bubblande händelser som orsakats av Button eller dess sammansatta element i stället för att fånga musen och utlöser en Click-händelse som alltid utlöses av själva Button. Händelsen och dess data fortsätter fortfarande längs vägen, men eftersom Button markerar händelsedata som Handledanropas endast hanterare för händelsen som specifikt angav att de skulle agera i handledEventsToo
fallet. Om andra element nära roten av ditt program fortfarande ville ha en chans att behandla en kontrollblockerad händelse är ett alternativ att koppla hanterare i kod med handledEventsToo
ställd in som true
. Men ofta är en enklare teknik att ändra den routningsriktning som du hanterar till att vara förhandsgranskningens motsvarighet till en indatahändelse. Om en kontroll till exempel undertrycker MouseLeftButtonDownkan du prova att ansluta en hanterare för PreviewMouseLeftButtonDown i stället. Den här tekniken fungerar bara för baselementindatahändelser som MouseLeftButtonDown. Dessa indatahändelser använder tunnel-/bubbelpar, genererar båda händelserna och delar händelsedata.
Var och en av dessa tekniker har antingen biverkningar eller begränsningar. Bieffekten av att hantera förhandsgranskningshändelsen är att hanteringen av händelsen då kan inaktivera hanterare som förväntar sig att hantera den bubblande händelsen, och därför är begränsningen att det vanligtvis inte är en bra idé att markera händelsen som hanteras medan den fortfarande är på förhandsgranskningsdelen av vägen. Begränsningen för handledEventsToo
teknik är att du inte kan ange en handledEventsToo
hanterare i XAML som ett attribut, du måste registrera händelsehanteraren i kod när du har hämtat en objektreferens till elementet där hanteraren ska kopplas.
Se även
.NET Desktop feedback