Code-Behind und XAML in WPFCode-Behind and XAML in WPF

CodeBehind ist ein Begriff zum Beschreiben des Codes, der mit Markup-definierten Objekten verknüpft ist, verwendet bei einem XAMLXAML Seite ist Markupkompilierte.Code-behind is a term used to describe the code that is joined with markup-defined objects, when a XAMLXAML page is markup-compiled. Dieses Thema beschreibt die Anforderungen für die Code-Behind sowie eine alternative Inline-Code-Mechanismus für den Code in XAMLXAML.This topic describes requirements for code-behind as well as an alternative inline code mechanism for code in XAMLXAML.

Dieses Thema enthält folgende Abschnitte:This topic contains the following sections:

VorraussetzungenPrerequisites

In diesem Thema wird davon ausgegangen, dass Sie "Lesen" die XAML Overview (WPF) und einige grundlegende Kenntnisse über die CLRCLR und objektorientierten Programmierung.This topic assumes that you have read the XAML Overview (WPF) and have some basic knowledge of the CLRCLR and object-oriented programming.

Code-Behind und XAML-SpracheCode-Behind and the XAML Language

Die XAML-Sprache enthält Features auf, die zum Zuordnen von Codedateien mit Markup-Dateien, auf der Seite der Markup-Datei ermöglichen.The XAML language includes language-level features that make it possible to associate code files with markup files, from the markup file side. Genauer gesagt, die XAML-Sprache definiert die Sprachfunktionen X: Class-Anweisung, X: Subclass-Anweisung, und X: ClassModifier-Anweisung.Specifically, the XAML language defines the language features x:Class Directive, x:Subclass Directive, and x:ClassModifier Directive. Genau wie der Code erstellt werden muss und das Integrieren von Markup und Code, ist nicht Teil, was die XAML-Sprache angibt.Exactly how the code should be produced, and how to integrate markup and code, is not part of what the XAML language specifies. Es bleibt bis zu Frameworks wie WPF, um zu bestimmen, wie Sie den Code integrieren, wie XAML in der Anwendung und Programmiermodelle und der Build mit Aktionen oder anderen unterstützen, die all dies ist erforderlich.It is left up to frameworks such as WPF to determine how to integrate the code, how to use XAML in the application and programming models, and the build actions or other support that all this requires.

Code-Behind-Ereignishandler und Anforderungen der partiellen Klasse in WPFCode-behind, Event Handler, and Partial Class Requirements in WPF

  • Die partielle Klasse muss vom Typ abgeleitet werden, die das Stammelement sichert.The partial class must derive from the type that backs the root element.

  • Beachten Sie, dass es sich bei den Markup kompilieren Buildvorgängen Standardverhalten, Sie die Ableitung in der Definition der partiellen Klasse leer auf der Code-Behind-Seite lassen können.Note that under the default behavior of the markup compile build actions, you can leave the derivation blank in the partial class definition on the code-behind side. Das kompilierte Ergebnis wird die Seitenstamm Unterstützungstyp um als Grundlage für die partielle Klasse ist, werden wird davon ausgegangen, selbst wenn er nicht angegeben.The compiled result will assume the page root's backing type to be the basis for the partial class, even if it not specified. Auf dieses Verhalten ist jedoch nicht empfohlen.However, relying on this behavior is not a best practice.

  • Die Ereignishandler, die Sie im Code-Behind schreiben müssen Instanzmethoden sein und darf nicht statische Methoden sein.The event handlers you write in the code-behind must be instance methods and cannot be static methods. Diese Methoden müssen definiert werden, von der partiellen Klasse innerhalb der CLR-Namespace identifizierte x:Class.These methods must be defined by the partial class within the CLR namespace identified by x:Class. Sie können nicht qualifizieren Sie den Namen eines ereignishandlers um anzuweisen, ein XAMLXAML Prozessor einen Ereignishandler für die ereignisverknüpfung in einer anderen Klassenbereich gesucht.You cannot qualify the name of an event handler to instruct a XAMLXAML processor to look for an event handler for event wiring in a different class scope.

  • Der Handler muss den Delegaten für das entsprechende Ereignis in das System von Unterstützungstypen übereinstimmen.The handler must match the delegate for the appropriate event in the backing type system.

  • Für die Microsoft Visual Basic-Sprache gesagt können Sie die sprachspezifischen Handles zuzuordnende Schlüsselwort Handler Instanzen und Ereignissen in der Handlerdeklaration anstatt durch Anfügen von Handlern, die mit Attributen in XAMLXAML.For the Microsoft Visual Basic language specifically, you can use the language-specific Handles keyword to associate handlers with instances and events in the handler declaration, instead of attaching handlers with attributes in XAMLXAML. Diese Technik verfügt jedoch über einige Einschränkungen. da die Handles Schlüsselwort kann nicht unterstützt, die bestimmte Features von der WPFWPF Ereignissystem, z. B. bestimmte Ereignisszenarien weitergeleitet oder angefügten Ereignisse.However, this technique does have some limitations because the Handles keyword cannot support all of the specific features of the WPFWPF event system, such as certain routed event scenarios or attached events. Weitere Informationen finden Sie unter Visual Basic- und WPF-Ereignisbehandlung.For details, see Visual Basic and WPF Event Handling.

x:Codex:Code

X: Code wird in einem-Anweisungselement definiert XAMLXAML.x:Code is a directive element defined in XAMLXAML. Ein x:Code Richtlinie Element kann Inline-Programmcode enthalten.An x:Code directive element can contain inline programming code. Der Code Inline definiert interagieren kann die XAMLXAML auf derselben Seite.The code that is defined inline can interact with the XAMLXAML on the same page. Das folgende Beispiel veranschaulicht die C#-Inlinecode.The following example illustrates inline C# code. Beachten Sie, dass der Code innerhalb der x:Code -Element und der Code in gesetzt werden muss <CDATA[... ]]> Inhalt mit Escapezeichen versehen XMLXML, sodass eine XAMLXAML Prozessor (Interpretieren von entweder die XAMLXAML Schema oder die WPFWPF Schema) wird nicht versucht, zum Interpretieren des Inhalts buchstäblich wie XMLXML.Notice that the code is inside the x:Code element and that the code must be surrounded by <CDATA[...]]> to escape the contents for XMLXML, so that a XAMLXAML processor (interpreting either the XAMLXAML schema or the WPFWPF schema) will not try to interpret the contents literally as XMLXML.

<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 von InlinecodeInline Code Limitations

Sie sollten erwägen, zu vermeiden oder die Verwendung von Inline-Code einzuschränken.You should consider avoiding or limiting the use of inline code. Im Hinblick auf die Architektur und die Codierung der Philosophie behält eine Trennung zwischen Markup und Code-Behind die Rollen-Designer und Entwickler viel klarer.In terms of architecture and coding philosophy, maintaining a separation between markup and code-behind keeps the designer and developer roles much more distinct. Auf Weitere technische Ebene, der Code, den Sie für Inline-Code schreiben kann sein, schwierig zu erstellen, da Sie immer in schreiben die XAMLXAML partielle Klasse generiert und können nur die standardzuordnungen von XML-Namespace verwenden.On a more technical level, the code that you write for inline code can be awkward to write, because you are always writing into the XAMLXAML generated partial class, and can only use the default XML namespace mappings. Da Sie keine hinzufügen können using -Anweisungen, müssen Sie vollständig qualifizieren vieler der APIAPI Aufrufe, die Sie vornehmen.Because you cannot add using statements, you must fully qualify many of the APIAPI calls that you make. Der Standardwert WPFWPF Zuordnungen enthalten, die jedoch nicht alle CLRCLR Namespaces, die in vorhanden sind die WPFWPF Assemblys müssen vollqualifiziert Aufrufe von Typen und Member in anderen CLR-Namespaces enthalten sind.The default WPFWPF mappings include most but not all CLRCLR namespaces that are present in the WPFWPF assemblies; you will have to fully qualify calls to types and members contained within the other CLR namespaces. Außerdem kann nicht definieren nichts über die partielle Klasse in den Inlinecode, und alle Benutzercodeentitäten, die Sie verweisen, als ein Element oder eine Variable in der generierten partiellen Klasse vorhanden sein.You also cannot define anything beyond the partial class in the inline code, and all user code entities you reference must exist as a member or variable within the generated partial class. Andere Sprache Programmierfunktionen, z. B. Makros oder #ifdef für globale Variablen oder Buildvariablen, sind ebenfalls nicht verfügbar.Other language specific programming features, such as macros or #ifdef against global variables or build variables, are also not available. Weitere Informationen finden Sie unter X: Code-XAML-Grundtyp.For more information, see x:Code Intrinsic XAML Type.

Siehe auchSee also