Freigeben über


Code-Behind und XAML in WPF

"Code-Behind" ist ein Ausdruck zum Beschreiben des Codes, der mit Markup-definierten Objekten verknüpft ist, wenn für eine XAML-Seite die Markupkompilierung ausgeführt 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:

  • Voraussetzungen

  • Code-Behind und die XAML-Sprache

  • Anforderungen von Code-Behind, Ereignishandlern und partiellen Klassen in WPF

  • x:Code

  • Inlinecodeeinschränkungen

Voraussetzungen

In diesem Thema wird vorausgesetzt, dass Sie die Übersicht über XAML (WPF) gelesen haben und über Grundkenntnisse der CLR-Programmierung und objektorientierten Programmierung verfügen.

Code-Behind und die XAML-Sprache

Die XAML-Sprache schließt Funktionen auf Sprachenebene ein, mit denen Codedateien von der Markupdateiseite mit Markupdateien verknüpft werden können. Insbesondere definiert die XAML-Sprache die Sprachfunktionen x:Class-Direktive, x:Subclass-Direktive und x:ClassModifier-Direktive. Die genaue Angabe zur Erstellung des Codes und zur Integration von Markup und Code ist nicht Bestandteil der Angaben der XAML-Sprache. Es bleibt Frameworks wie z. B. WPF überlassen zu bestimmen, wie der Code integriert wird, wie XAML in der Anwendung und den Programmiermodellen verwendet wird. Ebenso übernehmen die Frameworks die Erstellungsvorgänge und sonstige Unterstützung, die dazu erforderlich ist.

Anforderungen von Code-Behind, Ereignishandlern und partiellen Klassen in WPF

  • Die partielle Klasse muss von dem Typ abgeleitet werden, der das Stammelement unterstützt.

  • Beachten Sie, dass Sie mit dem Standardverhalten der Erstellungsaktionen zur Markupkompilierung den Ableitungszwischenraum in der partiellen Klassendefinition auf der Code-Behind-Seite frei lassen können. Das kompilierte Ergebnis geht davon aus, dass der Unterstützungstyp des Seitenstamms die Grundlage für die partielle Klasse bildet, auch wenn er nicht angegeben ist. Sich auf dieses Verhalten zu verlassen ist jedoch keine optimale Methode.

  • Die Ereignishandler, die Sie in den Code-Behind schreiben, müssen Instanzmethoden sein und können keine statischen Methoden sein. Diese Methoden müssen von der partiellen Klasse innerhalb des durch 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 einem Ereignishandler für die Ereignisverknüpfung zu suchen.

  • Der Handler muss mit dem Delegat für das entsprechende Ereignis im Unterstützungstypsystem übereinstimmen.

  • Für die Microsoft Visual Basic-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 das Handles-Schlüsselwort nicht alle spezifischen Funktionen des WPF-Ereignissystems unterstützen kann, 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 zu vermeiden oder einzuschrä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 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 Typen und Member in anderen CLR-Namespaces vollständig qualifizieren. Außerdem ist es nicht möglich, im Inlinecode mehr als die partielle Klasse zu definieren, und alle Benutzercodeentitäten, auf die Sie verweisen, 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 Systeminterner x:Code-XAML-Typ.

Siehe auch

Referenz

Systeminterner x:Code-XAML-Typ

Konzepte

Übersicht über XAML (WPF)

Erstellen einer WPF-Anwendung (WPF)

Ausführliche Erläuterung der XAML-Syntax