This article has been localized into Italian by the community.
Eventi in XAML
La maggior parte dei framework per interfacce utente si rifà alla programmazione a eventi (event driven) e lo stesso fa WPF. Tutti i controlli, inclusa la Window (la quale eredita dalla classe Control), espongono una gamma di eventi ai quali ci si può sottoscrivere. Sottoscriversi a un evento significa ricevere una notifica quando questo accade e si può quindi reagire di conseguenza.
Ci sono molti tipi di eventi, ma alcuni dei più comunemente usati sono quelli che riguardano l'interazione tra l'utente e l'applicazione tramite mouse o tastiera. Sulla maggior parte dei controlli si possono infatti trovare eventi come KeyDown, KeyUp, MouseDown, MouseEnter, MouseLeave, MouseUp e molti altri.
Vedremo più avanti come gli eventi funzionano in WPF, dato che è un argomento complesso, ma per il momento quello che ci serve sapere è come collegare un evento generato da un controllo XAML a una porzione di codice nel nostro file "Code-behind". Vediamo questo esempio:
<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>
Abbiamo creato una sottoscrizione all'evento MouseUp del controllo Grid indicando il nome di un metodo. Questo metodo dovrà essere definito nel nostro code-behind usando la segnatura corretta. In questo caso dovrà essere scritta così:
private void pnlMainGrid_MouseUp(object sender, MouseButtonEventArgs e)
{
MessageBox.Show("You clicked me at " + e.GetPosition(this).ToString());
}
L'evento MouseUp usa un delegato chiamato MouseButtonEventHandler, al quale ci si può sottoscrivere. Ha due parametri: un sender (il controllo che ha generato l'evento) e un oggetto MouseButtonEventArgs che contiente utili informazioni. Nel nostro esempio lo usiamo per ottenere la posizione del cursore del mouse e comunicarla all'utente.
Eventi diversi possono usare lo stesso tipo di delegato. Per esempio, sia MouseUp che MouseDown usano MouseButtonEventHandler, mentre MouseMove usa MouseEventHandler. In fase di scrittura del metodo che gestirà l'evento si deve conoscere che tipo di delegato l'evento usa; in caso di dubbi si può consultare la documentazione.
Fortunatamente, Visual Studio ci aiuta a generare il metodo corretto per gestire un particolare evento. Il modo più facile per farlo consiste semplicemente nello scrivere il nome dell'evento in XAML e lasciar fare il resto a IntelliSense:
Selezionando <Nuovo gestore eventi>, Visual Studio genererà il codice appropriato del metodo per gestire l'evento e lo inserirà nel file di code-behind. Sarà chiamato <nome controllo>_<nome evento>, nel nostro caso pnlMainGrid_MouseDown. Cliccando con il destro sul nome dell'evento e selezionando Vai a definizione, VS ci porterà direttamente lì.
Sottoscriversi a un evento dal code-behind
Il metodo più comune per sottoscriversi a un evento è stato spiegato sopra, ma potrebbe capitare di volersi sottoscrivere a degli eventi direttamente dal code-behind. Per farlo, si usa la sintassi C# +=, aggiungendo un gestore di eventi direttamente all'oggetto. La spiegazione completa di questo metodo richiede un esempio C# dedicato, ma per un paragone veloce, ecco un esempio semplice:
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());
}
}
}
Come prima, è necessario conoscere quale delegato usare, e come sempre Visual Studio ci viene incontro; scrivendo:
pnlMainGrid.MouseDown +=
Visual Studio offrirà il suo aiuto:
Premendo [Tab] due volte faremo in modo che Visual Studio generi il gestore eventi corretto, subito sotto il metodo corrente e pronto per essere implementato. Se ci si sottoscrive a un evento in questo modo non sarà necessario farlo poi in XAML.