Code-Behind und XAML
Aktualisiert: November 2007
"Code-Behind" ist ein Ausdruck zum Beschreiben des Codes, der mit dem von einem XAML-Prozessor erstellten Code vereint wird, wenn eine XAML-Seite in eine Anwendung kompiliert wird. In diesem Thema werden die Anforderungen für Code-Behind und ein alternativer Inline-Codemechanismus für Code in XAML beschrieben.
Dieses Thema enthält folgende Abschnitte.
- Vorbereitungsmaßnahmen
- Anforderungen von Code-Behind, Ereignishandlern und partiellen Klassen
- x:Code
- Inlinecodeeinschränkungen
- Verwandte Abschnitte
Vorbereitungsmaßnahmen
In diesem Thema wird vorausgesetzt, dass Sie die Übersicht über XAML gelesen haben und über Grundkenntnisse der CLR-Programmierung und objektorientierten Programmierung verfügen.
Anforderungen von Code-Behind, Ereignishandlern und partiellen Klassen
Die partielle Klasse muss vom Typ der Klasse abgeleitet werden, die als Stammelement verwendet wurde. Sie können die Ableitung im Code-Behind in der Definition der partiellen Klasse leer lassen, aber das kompilierte Ergebnis setzt voraus, dass der Seitenstamm die Basisklasse für die partielle Klasse darstellt. Dies ist auch der Fall, wenn dies so nicht angegeben wurde (da die Markup-Hälfte der partiellen Klasse den Seitenstamm als Basis angegeben hat).
Bei den Ereignishandlern, die Sie schreiben, muss es sich um Instanzmethoden handeln, die von der partiellen Klasse innerhalb des per x:Class identifizierten CLR-Namespace definiert werden. Es ist nicht möglich, den Namen eines Ereignishandlers zu qualifizieren, um einen XAML-Prozessor anzuweisen, in einem anderen Klassenbereich nach diesem Handler zu suchen. Sie können auch keine statischen Methoden als Ereignishandler verwenden.
Der Handler muss mit dem Delegaten für das jeweilige Ereignis übereinstimmen.
Für die Microsoft Visual Basic .NET-Sprache können Sie das sprachspezifische Schlüsselwort Handles verwenden, um Instanzen und Ereignissen in der Handlerdeklaration Handler zuzuordnen, anstatt Handler in XAML Attributen zuzuordnen. Dieses Verfahren unterliegt jedoch einigen Einschränkungen, da Handles nicht alle spezifischen Funktionen des WPF-Ereignissystems unterstützen, zum Beispiel bestimmte Szenarios mit Routingereignissen oder angefügten Ereignissen. Ausführliche Informationen finden Sie unter Visual Basic- und WPF-Ereignisbehandlung.
x:Code
x:Code ist ein in XAML definiertes Direktivenelement. Ein x:Code-Direktivenelement kann Inlineprogrammierungscode enthalten. Der Code, der inline definiert wird, kann mit dem XAML-Code auf derselben Seite interagieren. Das folgende Beispiel zeigt C#-Inlinecode. Beachten Sie, dass sich der Code innerhalb des x:Code-Elements befindet und dass der Code in <CDATA[...]]> gesetzt sein muss, damit der XML-Inhalt mit Escapezeichen versehen wird und ein XAML-Prozessor (der entweder das XAML-Schema oder das WPF-Schema interpretiert) nicht versucht, den Inhalt wörtlich als XML zu interpretieren.
<Page
xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="https://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>
Inlinecodeeinschränkungen
Sie sollten erwägen, die Verwendung von Inlinecode für eine XAML-basierte Anwendung zu vermeiden bzw. zu beschränken. Hinsichtlich der Architektur und des Codieransatzes bewirkt eine Trennung zwischen Markup und Code-Behind, dass die Rollen des Designers und des Entwicklers klarer voneinander abgegrenzt sind. Für die technische Ebene bedeutet dies, dass der Code, den Sie als Inlinecode schreiben, ggf. schwierig zu erstellen sein kann. Dies liegt daran, dass Sie immer in die generierte partielle Klasse der XAML-Seite schreiben und dabei nur die standardmäßigen XML-Namespacezuordnungen verwenden können. Da Sie keine using-Anweisungen hinzufügen können, müssen Sie viele der durchgeführten API-Aufrufe vollständig qualifizieren. Die standardmäßigen WPF-Zuordnungen enthalten die meisten CLR-Namespaces, die in den WPF-Assemblys vorhanden sind, jedoch nicht alle. Daher müssen Sie Aufrufe an APIs in anderen CLR-Namespaces vollständig qualifizieren. Außerdem ist es nicht möglich, im Inlinecode mehrere Klassen zu definieren, und alle Codeentitäten müssen in der generierten partiellen Klasse als Member oder Variable vorhanden sein. Andere sprachspezifische Programmierfunktionen, wie Makros oder #ifdef für globale Variablen oder Buildvariablen, stehen ebenfalls nicht zur Verfügung. Weitere Informationen finden Sie unter x:Code-XAML-Direktivenelement.
Siehe auch
Konzepte
Erstellen einer WPF-Anwendung (WPF)