La maggior parte delle applicazioni WPF include un markup e un code-behind. All'interno di un progetto, la sintassi XAML viene scritta come file .xaml, mentre per scrivere un file code-behind si utilizza un linguaggio CLR, ad esempio Microsoft Visual Basic .NET o C#. Al momento della compilazione di un file XAML, il percorso del file code-behind XAML per ciascuna pagina XAML viene identificato specificando uno spazio dei nomi e una classe come attributo x:Class dell'elemento radice della pagina XAML.
Negli esempi riportati fino a questo momento sono stati illustrati molti pulsanti, nessuno dei questi era associato a un comportamento logico. Il meccanismo primario a livello di applicazione per l'aggiunta di un comportamento per un elemento oggetto consiste nell'utilizzo di un evento esistente della classe dell'elemento e nella scrittura di un gestore specifico per quell'evento che viene richiamato nel momento in cui l'evento viene generato in fase di esecuzione. Il nome dell'evento e il nome del gestore da utilizzare sono specificati nel markup, mentre il codice che implementa il gestore è definito nel code-behind.
<Page
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="MyNamespace.MyPageCode">
<Button Click="ClickHandler" >Click Me!</Button>
</Page>
namespace MyNamespace
{
public partial class MyPageCode
{
void ClickHandler(object sender, RoutedEventArgs e)
{
Button b = e.Source as Button;
b.Background = Brushes.Red;
}
}
}
Notare che il file code-behind utilizza lo spazio dei nomi CLR MyNamespace e dichiara MyPageCode come classe parziale all'interno di tale spazio dei nomi. Questo è parallelo al valore dell'attributo x:Class di MyNamespace.MyPageCode fornito nella radice del markup. Il compilatore crea automaticamente una classe parziale per ogni pagina XAML compilata, derivando una classe dal tipo di elemento radice. Quando si fornisce code-behind che definisce anche la stessa classe parziale, il codice risultante viene combinato all'interno dello stesso spazio dei nomi e della stessa classe dell'applicazione compilata.
Per ulteriori informazioni sui requisiti per la programmazione del code-behind, vedere la sezione di Code-behind e XAML relativa al code-behind, al gestore eventi e ai requisiti delle classi parziali.
Se non si desidera creare un file code-behind separato, è anche possibile rendere il codice inline all'interno di un file XAML. Tuttavia, il codice inline è una tecnica meno versatile che presenta limitazioni sostanziali. Per informazioni dettagliate, vedere Code-behind e XAML.
Sintassi per attributi dell'evento
Quando si specifica il comportamento tramite gli eventi all'interno del markup, in genere si utilizza la sintassi per attributi per associare i gestori. L'elemento oggetto nel quale viene specificato l'attributo dell'evento diventa l'istanza che resta in ascolto dell'evento e chiama il gestore. Il nome dell'evento specifico che si desidera gestire è il nome dell'attributo. Il valore dell'attributo è il nome del metodo del gestore che viene definito. Successivamente è necessario fornire l'implementazione del gestore in code-behind, con il gestore basato sul delegato per quell'evento. Per la scrittura del gestore in code-behind si utilizza un linguaggio di programmazione quale Microsoft Visual Basic .NET o C#.
Per ogni evento WPF verranno segnalati dei dati al momento della generazione dell'evento. I gestori eventi possono accedere a questi dati evento. Nell'esempio precedente, il gestore ottiene l'origine evento segnalata tramite i dati evento, quindi imposta le proprietà per tale origine.
Eventi indirizzati
Un evento indirizzato è una particolare funzionalità evento, univoca e fondamentale per WPF. Gli eventi indirizzati consentono a un elemento di gestire un evento generato da un elemento diverso, se gli elementi sono connessi tramite una relazione di struttura ad albero dell'elemento. Quando si specifica la gestione degli eventi con un attributo XAML, l'evento indirizzato può essere ascoltato e gestito da qualsiasi elemento, inclusi quelli che non presentano quel particolare evento nella tabella dei membri della classe. Ciò è possibile qualificando l'attributo del nome evento con il nome della classe di appartenenza. Ad esempio, l'elemento padre StackPanel nell'esempio StackPanel / Button potrebbe registrare un gestore per l'evento Click del pulsante dell'elemento figlio specificando l'attributo Button.Click nell'elemento oggetto StackPanel, con il nome del gestore come valore dell'attributo. Per ulteriori informazioni, vedere Cenni preliminari sugli eventi indirizzati.