Code-Behind 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 Thema werden Anforderungen für CodeBehind sowie ein alternativer Inlinecodemechanismus für Code in XAML beschrieben.

Dieses Thema enthält folgende Abschnitte:

Voraussetzungen

In diesem Thema wird davon ausgegangen, dass SieXAML in WPF gelesen haben und über einige grundlegende Kenntnisse über die CLR und objektorientierte 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 Sprachfunktionen x:Class Directive, x:Subclass Directive und x:ClassModifier Directive. Wie genau der Code erzeugt werden soll und wie man Markup und Code integriert, ist nicht Teil dessen, was die XAML-Sprache spezifiziert. Es bleibt Frameworks wie WPF überlassen, zu bestimmen, wie der Code integriert wird, wie 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 von der partiellen Klasse innerhalb des mit x:Class bezeichneten 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 XAML anzufügen. Bei dieser Technik gibt es jedoch gewisse Einschränkungen, da das Schlüsselwort Handles nicht alle spezifischen Features des WPF-Ereignissystems unterstützen kann (beispielsweise bestimmte Routingereignisszenarien oder angefügte Ereignisse). Ausführliche Informationen finden Sie unter Visual Basic und WPF-Ereignisbehandlung.

x:Code

x:Code ist ein in XAML definiertes Anweisungselement. Ein x:Code-Anweisungselement kann Inlineprogrammiercode enthalten. Der inline definierte Code kann mit dem XAML-Code auf der gleichen Seite interagieren. Im folgenden Beispiel wird Inline-C#-Code veranschaulicht. 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 XML zu escapen, 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 Codierungsphilosophie sorgt die Trennung zwischen Markup und CodeBehind dafür, dass die Rollen des Designers und des Entwicklers 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 XAML generierte Klasse schreiben und nur die standardmäßigen XML-Namespacezuordnungen verwenden können. Da Sie keine using-Anweisungen hinzufügen können, müssen Sie viele Ihrer API-Aufrufe vollständig qualifizieren. Die standardmäßigen WPF-Zuordnungen 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. Außerdem können Sie im Inline-Code nichts definieren, was über die partielle Klasse hinausgeht, und alle Entitäten des Benutzercodes, auf die Sie verweisen, müssen als Member oder Variable innerhalb der generierten partiellen Klasse existieren. Andere sprachspezifische Programmierfunktionen, wie Makros oder #ifdef gegen globale Variablen oder Buildvariablen, sind ebenfalls nicht verfügbar. Weitere Informationen finden Sie unter x:Code Systeminterner XAML-Typ.

Siehe auch