Ereignisbehandlung in XAML
Nachdem Sie die XAML-Benutzeroberfläche erstellt haben, können Sie Code hinzufügen, um auf die auftretenden Interaktionen zu reagieren, wenn der Benutzer die Seite besucht. .NET MAUI benachrichtigt die Anwendung mit .NET-Standardereignissen über Benutzereingaben und -interaktionen.
In dieser Lerneinheit erfahren Sie, wie Sie mit diesen Ereignissen umgehen und die von Benutzenden erwarteten Vorgänge ausführen.
Benennen von Elementen auf einer XAML-Seite
Ereignisbehandlungscode muss häufig auf bestimmte Steuerelemente und deren Eigenschaften auf einer Seite verweisen. Sie können jedem Steuerelement einen eindeutigen Namen zuweisen. Verwenden Sie dazu das XAML-Attribut x:Name
. Das x:Name
-Attribut bewirkt zweierlei:
Der generierten CodeBehind-Datei wird ein privates Feld hinzugefügt, das diesem Element zugeordnet wird. Verwenden Sie dieses Feld in Ihrem Code für die Interaktion mit dem visuellen Element, um Laufzeiteigenschaften festzulegen und Ereignisse zu behandeln.
Es macht das Element XAML durch seinen Namen bekannt. Sie können auf diese Elemente von anderen Elementen aus verweisen, die in derselben XAML-Datei definiert sind.
Zum Benennen des Elements können Sie keine beliebige Zeichenfolge verwenden. Der dem x:Name
-Attribut zugewiesene Wert wird zum Erstellen eines Felds im Code verwendet. Stattdessen muss er die Namenskonventionen für eine Variable befolgen. Der Name muss auch eindeutig sein, da er in die CodeBehind-Definition kompiliert wird.
Nachdem Sie einen Namen für ein Element festgelegt haben, können Sie mit diesem Element in der CodeBehind-Datei interagieren. Das folgende XAML-Fragment definiert ein Label
-Steuerelement. Es trägt den Namen CounterLabel (dieses Beispiel stammt aus der Standard-App, die von der .NET MAUI-Vorlage generiert wird):
<Label Text="Current count: 0"
...
x:Name="CounterLabel"
... />
Im CodeBehind für diese Seite können Sie über das CounterLabel
-Feld auf dieses Steuerelement verweisen und dessen Eigenschaften ändern:
count++;
CounterLabel.Text = $"Current count: {count}";
Wichtig
Das Feld wird erst initialisiert, wenn die InitializeComponent
-Methode der Seite ausgeführt wird. Diese Methode ist Bestandteil des Prozesses zur XAML-Analyse und Objektinstanziierung. Platzieren Sie nach diesem Aufruf jeglichen Code, der mit einem Element interagiert, das in XAML definiert ist. Die Ausnahme von dieser Regel ist die ContentPage
-Klasse selbst. Sie können auf alle Eigenschaften der Klasse zugreifen, bevor Sie die InitializeComponent
-Methode ausführen. Wenn Sie jedoch in XAML Eigenschaften für diese Klasse festlegen, überschreiben diese Eigenschaftswerte alle Werte, die Sie ggf. vor der Ausführung von InitializeComponent
festgelegt haben.
Verknüpfen von Ereignissen mit einem Attribut
Viele Steuerelemente machen Eigenschaften verfügbar, die den Ereignissen entsprechen, auf die diese Steuerelemente reagieren können, z. B. das Clicked
-Ereignis für eine Schaltfläche. Die verschiedenen Steuerelemente unterstützen unterschiedliche Ereignisse. Ein Button
-Steuerelement kann beispielsweise auf die Ereignisse Clicked
, Pressed
und Released
reagieren, während ein Entry
-Steuerelement über Ereignisse wie TextChanged
verfügt. Sie können eine Ereigniseigenschaft im XAML-Markup einer Seite initialisieren und den Namen der Methode angeben, die bei Auslösung des Ereignisses ausgeführt werden soll. Die Ereignismethode muss die folgenden Signaturanforderungen erfüllen:
- Sie kann keinen Wert zurückgeben, die Methode muss
void
sein. - Sie muss zwei Parameter übernehmen: ein
object
-Verweis, der das Objekt angibt, das das Ereignis ausgelöst hat (als Sender bezeichnet), und einenEventArgs
-Parameter, der alle Argumente enthält, die vom Sender an den Ereignishandler übergeben werden. - Der Ereignishandler sollte
private
sein. Dies ist zwar nicht zwingend erforderlich, aber wenn Sie einen Ereignishandler als öffentlich definieren, kann von außen auf ihn zugegriffen werden, und er könnte von einer anderen Aktion als dem erwarteten ausgelösten Ereignis aufgerufen werden. - Der Ereignishandler kann
async
sein, wenn asynchrone Vorgänge ausgeführt werden müssen.
Das folgende Beispiel zeigt die Definition des Clicked
-Ereignishandlers für die Schaltfläche in der Beispiel-App aus der .NET MAUI-Vorlage. Der Name der Methode folgt einer Standardkonvention: On gefolgt vom Namen des Steuerelements (die Schaltfläche heißt Counter) und dem Namen des Ereignisses (Clicked). Diese Konvention ist nicht zwingend, aber eine bewährte Vorgehensweise:
private void OnCounterClicked(object sender, EventArgs e)
{
...
}
Trennung von Zuständigkeiten
Das Verknüpfen von Ereignissen in XAML ist praktisch, dabei wird jedoch das Verhalten des Steuerelements mit der Benutzeroberflächendefinition vermischt. Viele Entwickelnde ziehen es vor, diese Aspekte getrennt zu halten und in der CodeBehind-Datei alle Abonnements benannter Elemente des Ereignishandlers einzurichten. So ist einfacher zu erkennen, was verknüpft wurde und wo das Verhalten zugeordnet ist. Dadurch wird es auch schwieriger, unbeabsichtigt einen Codefehler zu verursachen, indem im XAML-Code ein Handler entfernt wird, ohne dies zu bemerken. Ein entfernter Handler wird vom Compiler nicht abgefangen und wird nur dann ein Problem, wenn der Code das Verhalten nicht ordnungsgemäß ausführt.
Ob Sie Ereignishandler mithilfe von XAML oder per Code verknüpfen, ist eine individuelle Entscheidung.
Verwenden Sie zum Verknüpfen eines Ereignishandlers im Code den +=
-Operator, um das Ereignis zu abonnieren. In der Regel erfolgt dies im Konstruktor für die Seite nach dem Aufruf von InitializeComponent
:
public partial class MainPage : ContentPage, IPage
{
public MainPage()
{
InitializeComponent();
Counter.Clicked += OnCounterClicked;
}
...
private void OnCounterClicked(object sender, EventArgs e)
{
...
}
}
Hinweis
Sie können diese Vorgehensweise verwenden, um mehrere Ereignisbehandlungsmethoden für dasselbe Ereignis zu abonnieren. Die einzelnen Ereignisbehandlungsmethoden werden ausgeführt, wenn das Ereignis auftritt. Sie dürfen allerdings nicht davon ausgehen, dass die Ausführung in einer bestimmten Reihenfolge erfolgt. Deshalb sollte es keine Abhängigkeiten zwischen ihnen geben.
Ebenso können Sie einen Ereignishandler entfernen, indem Sie ihn später in Ihrer Anwendung mit dem -=
-Operator vom Ereignis abmelden:
Counter.Clicked -= OnCounterClicked;