This article is currently in the process of being translated into Norwegian Bokmål (~98% done).
Events in XAML
De aller fleste moderne UI rammeverk er hendelses-drevne (events). Det gjelder også for WPF. Alle kontroller, inklusive Window-kontrollen ( som arver sine egenskaper fra Control-klassen) tillater deg å registrere kode som skal kjøres når en hendelse inntreffer. Når en spesifikk hendelse inntreffer, vil tilhørende kode utføres. På denne måten kan du sikre at programmet ditt reagerer som ønsket, når en gitt situasjon oppstår.
Det finnes mange type hendelser, men de vanligste er til for å gi en respons på bruk av programvaren ved hjelp av mus og/eller tastatur. De fleste kontroller har derfor definert hendelses funksjonene KeyDown, KeyUp, MouseDown, MouseEnter, MouseLeave, MouseUp samt flere andre.
Vi vil kikke nærmere på hvordan aktivering av hendelser virker i WPF. Dette er et avansert emne, men inntil videre holder det at du vet hvordan du kan koble en kontroll hendelse i XAML til en kode-snutt i Code-behind filen. Ta en titt på følgende eksempel:
<Window x:Class="WpfTutorialSamples.XAML.EventsSample"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="EventsSample" Height="300" Width="300">
<Grid Name="pnlMainGrid" MouseUp="pnlMainGrid_MouseUp" Background="LightBlue">
</Grid>
</Window>
Vi har registert kode mot MouseUp hendelsen på Grid-kontrollen. Dette kalles å abonnere på en hendelse og gjøres ved at vi angir et funksjonsnavn. Denne funksjonen må være definert i code-behind filen, med et funksjonskall som stemmer overens med funksjonskallet som forventes i MouseUp attributten. I dette tilfellet, skal det se slik ut:
private void pnlMainGrid_MouseUp(object sender, MouseButtonEventArgs e)
{
MessageBox.Show("You clicked me at " + e.GetPosition(this).ToString());
}
MouseUp hendelses funksjonen gjør bruk av et funksjons-delegat kalt MouseButtonEventHandler, som du abonnerer på. Delegatet har to parametere, en sender ( kontrollen som utløste hendelsen) og et MouseButtonEventArgs objekt som inneholder relevant informasjon om hendelsen. I eksempelet, bruker vi dette til å hente posisjonen til musemarkøren og returnerer informasjonen til bruker.
Flere typer hendelser kan gjøre bruk av samme delegat-type - for eksempel vil både MouseUp og MouseDown ta i bruk delegatet MouseButtonEventHandler , mens MouseMove hendelsen benytter MouseEventHandler delegatet. Når man definerer hendelses-kode, må man vite hvilket delegat som skal benyttes. Hvis du er usikker, kan du slå opp denne informasjonen i dokumentasjonen.
Heldigvis er Visual Studio istand til å hjelpe oss å generere funksjonskall for hendelseskode for en gitt hendelse. Den enkleste måten å involvere Visual Studio på, er simpelthen å skrive funksjonsnavnet i XAML og la IntelliSense funksjonaliteten i VS gjøre resten av jobben for deg:
Når du velger <New Event Handler> vil Visual Studio generere korrekt hendelseskode i Code-behind filen. Den vil gis navnet <Kontroll-navn>_<navnet på hendelsesfunksjon>, i vårt tilfelle pnlMainGrid_MouseDown. Høyre-klikk på funksjonsnavn og velg Navigate to Event Handler for å gå rett til koden for hendelsesfunksjonen.
Subscribing to an event from Code-behind
Den vanligste måten å abonnere på hendelser er forklart over, men av og til ønsker man å abonnere på en hendelse rett fra kode i Code-behind filen. Dette gjøres ved hjelp av += C# syntaks. Man kan registrere hendelseskode direkte mot objektet som utløser hendelsen. En fullstendig forklaring hører hjemme i et dedikert C# eksempel, men her følger et eksempel som gir rom for sammenlikning:
using System;
using System.Windows;
using System.Windows.Input;
namespace WpfTutorialSamples.XAML
{
public partial class EventsSample : Window
{
public EventsSample()
{
InitializeComponent();
pnlMainGrid.MouseUp += new MouseButtonEventHandler(pnlMainGrid_MouseUp);
}
private void pnlMainGrid_MouseUp(object sender, MouseButtonEventArgs e)
{
MessageBox.Show("You clicked me at " + e.GetPosition(this).ToString());
}
}
}
Nok en gang må du vite hvilket delegat som skal benyttes, og nok en gang er Visual Studio klar til å hjelpe. Så fort du skriver:
pnlMainGrid.MouseDown +=
kommer Visual Studio med en hjelpende hånd
Ganske enkelt; trykk [Tabulator] tasten to ganger etter hverandre og Visual Studio vil generere korrekt hendelseskode for deg med kall til en funksjon der du kan legge inn egen kode..Denne nye funksjonen havner rett under funksjonen der registrering av hendelseskode ble gjort. Når du abonnerer på hendelser på denne måten, trenger du ikke gjøre det i XAML.