CodeBehind und XAML in WPF
CodeBehind ist ein Ausdruck, mit dem der Code beschrieben wird, der beim Ausführen der Markupkompilierung für eine XAML-Seite mit Markup-definierten Objekten verknüpft wird. In diesem Artikel werden Anforderungen für CodeBehind sowie ein alternativer Inlinecodemechanismus für Code in der XAML beschrieben.
Dieses Thema enthält die folgenden Abschnitte:
Voraussetzungen
In diesem Thema wird davon ausgegangen, dass Sie XAML in WPF gelesen haben und über grundlegende Kenntnisse der CLR und objektorientierten Programmierung verfügen.
CodeBehind und die XAML-Sprache
Die XAML-Sprache umfasst Funktionen auf Sprachebene, die es ermöglichen, Codedateien mit Markupdateien zu verknüpfen, und zwar von der Seite der Markupdatei aus. Die XAML-Sprache definiert insbesondere die Sprachfeatures x:Class Directive, x:Subclass Directive und x:ClassModifier Directive. Genau wie der Code erstellt werden soll und wie Markup und Code integriert werden sollten, wird nicht von der XAML-Sprache spezifiziert. Es bleibt Frameworks wie WPF überlassen, zu bestimmen, wie der Code integriert wird, wie die XAML in der Anwendung und den Programmiermodellen verwendet wird und welche Buildaktionen oder andere Unterstützung all dies erfordert.
Anforderungen an CodeBehind, Ereignishandler und partielle Klassen in WPF
Die partielle Klasse muss vom Typ abgeleitet werden, der das Stammelement unterstützt.
Beachten Sie, dass Sie unter dem Standardverhalten der Markupkompilierungs-Buildaktionen die Ableitung in der Definition partieller Klassen auf der CodeBehind-Seite leer lassen können. Das kompilierte Ergebnis nimmt an, dass der Unterstützungstyp des Seitenstamms die Grundlage für die partielle Klasse ist, auch wenn er nicht angegeben ist. Das Vertrauen auf dieses Verhalten ist jedoch keine bewährte Methode.
Die Ereignishandler, die Sie im CodeBehind schreiben, müssen Instanzmethoden sein und dürfen keine statischen Methoden sein. Diese Methoden müssen durch die partielle Klasse innerhalb des durch
x:Class
identifizierten CLR-Namespace definiert werden. Sie können den Namen eines Ereignishandlers nicht qualifizieren, um einen XAML-Prozessor anzuweisen, nach einem Ereignishandler für die Ereignisverknüpfung in einem anderen Klassenbereich zu suchen.Der Handler muss dem Delegat für das entsprechende Ereignis im Unterstützungstypsystem entsprechen.
Für die Microsoft Visual Basic-Sprache können Sie das sprachspezifische Schlüsselwort
Handles
verwenden, um Handler mit Instanzen und Ereignissen in der Handlerdeklaration zu verknüpfen, anstatt Handler mit Attributen in der XAML anzufügen. Diese Technik hat jedoch einige Einschränkungen, da das schlüsselwortHandles
nicht alle spezifischen Features des WPF-Ereignissystems unterstützen kann, z. B. bestimmte Routingereignisszenarien oder angefügte Ereignisse. Ausführliche Informationen finden Sie unter Visual Basic- und WPF-Ereignisbehandlung.
x:Code
x:Code ist ein in der XAML definiertes Anweisungselement. Ein x:Code
-Anweisungselement kann Inlineprogrammiercode enthalten. Der inline definierte Code kann mit dem XAML-Code auf der gleichen Seite interagieren. Das folgende Beispiel veranschaulicht inline C#-Code. Beachten Sie, dass sich der Code innerhalb des x:Code
-Elements befindet und dass der Code in <CDATA[
...]]>
eingeschlossen sein muss, um den Inhalt für die XML mit Escapezeichen zu versehen, damit ein XAML-Prozessor (der entweder das XAML-Schema oder das WPF-Schema interpretiert) nicht versucht, den Inhalt als XML zu interpretieren.
<Page
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="MyNamespace.MyCanvasCodeInline"
>
<Button Name="button1" Click="Clicked">Click Me!</Button>
<x:Code><![CDATA[
void Clicked(object sender, RoutedEventArgs e)
{
button1.Content = "Hello World";
}
]]></x:Code>
</Page>
Einschränkungen für Inlinecode
Sie sollten die Verwendung von Inlinecode vermeiden oder einschränken. In Bezug auf die Architektur und die Programmierphilosophie sorgt die Trennung zwischen Markup und dem CodeBehind dafür, dass die Rollen der entwerfenden und entwickelnden Personen klarer voneinander getrennt sind. Technisch betrachtet ist der Code, den Sie für Inlinecode schreiben, möglicherweise umständlich zu schreiben, da Sie immer in die partielle, von der XAML generierte Klasse schreiben und nur die XML-Standardnamespacezuordnungen verwenden können. Da Sie keine using
-Anweisungen hinzufügen können, müssen Sie viele Ihrer API-Aufrufe vollständig qualifizieren. Die WPF-Standardzuordnungen enthalten die meisten, aber nicht alle CLR-Namespaces, die in den WPF-Assemblys vorhanden sind. Aufrufe von Typen und Membern, die in den anderen CLR-Namespaces enthalten sind, müssen vollständig qualifiziert werden. Sie können auch nichts über die partielle Klasse im Inlinecode hinaus definieren, und alle Benutzercodeentitäten, auf die Sie verweisen, müssen als Element oder Variable innerhalb der generierten Partielle Klasse vorhanden sein. Andere sprachspezifische Programmierfeatures wie Makros oder #ifdef
für globale Variablen oder Buildvariablen sind ebenfalls nicht verfügbar. Weitere Informationen finden Sie unter x:Code Systeminterner XAML-Typ.
Siehe auch
.NET Desktop feedback