Übersicht über die XAML (WPF)XAML overview (WPF)

Dieses Thema beschreibt die Funktionen der XAML-Sprache und zeigt, wie Sie XAML zum Schreiben von Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF)-Anwendungen verwenden können.This topic describes the features of the XAML language and demonstrates how you can use XAML to write Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) applications. Dieses Thema beschreibt speziell XAML entsprechend der Implementierung durch WPFWPF.This topic specifically describes XAML as implemented by WPFWPF. XAML selbst geht über das in WPFWPF implementierte Sprachkonzept hinaus.XAML itself is a larger language concept than WPFWPF.

Was ist XAML?What is XAML?

XAML ist eine deklarative Markupsprache.XAML is a declarative markup language. Wie die Anwendung auf das Programmiermodell von .NET Framework XAML vereinfacht das Erstellen einer UIUI für eine .NET Framework-Anwendung.As applied to the .NET Framework programming model, XAML simplifies creating a UIUI for a .NET Framework application. Sie können sichtbare Elemente der UIUI im deklarativen XAML-Markup erstellen und anschließend die Definition der UIUI mithilfe von CodeBehind-Dateien, die über partielle Klassendefinitionen an das Markup geknüpft sind, von der Laufzeitlogik trennen.You can create visible UIUI elements in the declarative XAML markup, and then separate the UIUI definition from the run-time logic by using code-behind files, joined to the markup through partial class definitions. XAML repräsentiert direkt die Instanziierung von Objekten in einem spezifischen Satz von in Assemblys definierten Unterstützungstypen dar.XAML directly represents the instantiation of objects in a specific set of backing types defined in assemblies. Dies ist ein anderer Ansatz als der anderer Markupsprachen, die üblicherweise interpretierte Sprachen sind, die keine direkte Verbindung zu einem System von Unterstützungstypen besitzen.This is unlike most other markup languages, which are typically an interpreted language without such a direct tie to a backing type system. XAML ermöglicht einen Workflow, bei dem separate Parteien auf der UIUI und der Logik einer Anwendung unter der Verwendung möglicherweise unterschiedlicher Tools arbeiten können.XAML enables a workflow where separate parties can work on the UIUI and the logic of an application, using potentially different tools.

Bei der Darstellung als Text sind XAML-Dateien XML-Dateien, die in der Regel die .xaml-Erweiterung haben.When represented as text, XAML files are XML files that generally have the .xaml extension. Die Dateien können in jeder XML-Codierung codiert sein, üblich ist jedoch UTF-8-Codierung.The files can be encoded by any XML encoding, but encoding as UTF-8 is typical.

Das folgende Beispiel zeigt, wie Sie eine Schaltfläche als Teil einer UIUI erstellen können.The following example shows how you might create a button as part of a UIUI. Dieses Beispiel soll Ihnen nur ein erstes Gefühl dafür geben, wie XAML allgemeine UIUI-Programmiermetaphern darstellt (es handelt sich nicht um ein vollständiges Beispiel).This example is just intended to give you a flavor of how XAML represents common UIUI programming metaphors (it is not a complete sample).

<StackPanel>
  <Button Content="Click Me"/>
</StackPanel>

XAML-Syntax in KürzeXAML syntax in brief

In den folgenden Abschnitten werden die grundlegenden Formen der XAML-Syntax erläutert und ein kurzes Markupbeispiel vorgestellt.The following sections explain the basic forms of XAML syntax, and give a short markup example. Diese Abschnitte beabsichtigen keine Wiedergabe vollständiger Informationen über jedes Syntaxformat, z.B. wie diese im Unterstützungstypsystem dargestellt werden.These sections are not intended to provide complete information about each syntax form, such as how these are represented in the backing type system. Weitere Informationen zu den Besonderheiten der XAML-Syntax für jede der in diesem Thema vorgestellten Syntax finden Sie unter Ausführliche Erläuterung der XAML-Syntax.For more information about the specifics of XAML syntax for each of the syntax forms introduced in this topic, see XAML Syntax In Detail.

Wenn Sie bereits mit der XML-Sprache vertraut sind, wird Ihnen vieles dessen, was Sie in den folgenden Abschnitten lesen, elementar erscheinen.Much of the material in the next few sections will be elementary to you, if you have previous familiarity with the XML language. Dies liegt im grundlegenden Entwurfsprinzip von XAML begründet.This is a consequence of one of the basic design principles of XAML. Die XAML-Sprache definiert, eigene Konzepte, aber diese Konzepte arbeiten mit der XML-Sprache und -Markup-Form.The XAML language defines concepts of its own, but these concepts work within the XML language and markup form.

XAML-ObjektelementeXAML object elements

Ein Objektelement deklariert in der Regel eine Instanz eines Typs.An object element typically declares an instance of a type. Dieser Typ ist in den Assemblys definiert, die die Unterstützungstypen für eine Technologie bereitstellen, die XAML als Sprache verwendet.That type is defined in the assemblies that provide the backing types for a technology that uses XAML as a language.

Objektelementsyntax beginnt immer mit einer öffnenden spitzen Klammer (<).Object element syntax always starts with an opening angle bracket (<). Dies wird gefolgt vom Namen des Typs, in dem Sie eine Instanz erstellen möchten.This is followed by the name of the type where you want to create an instance. (Dieser Name kann auch ein Präfix enthalten. Dieses Konzept wird später erläutert.) Danach können Sie optional Attribute für das Objektelement deklarieren.(The name can possibly include a prefix, a concept that will be explained later.) After this, you can optionally declare attributes on the object element. Um das Objektelement-Tag abzuschließen, beenden Sie es mit einer schließenden spitzen Klammer (>).To complete the object element tag, end with a closing angle bracket (>). Sie können stattdessen auch eine selbstschließende Form verwenden, die keinen Inhalte besitzt, indem Sie das Tag mit einem Schrägstrich gefolgt von einer schließenden spitzen Klammer beenden (/>).You can instead use a self-closing form that does not have any content, by completing the tag with a forward slash and closing angle bracket in succession (/>). Sehen Sie sich z.B. den oben gezeigten Markupausschnitt erneut an:For example, look at the previously shown markup snippet again:

<StackPanel>
  <Button Content="Click Me"/>
</StackPanel>

Hier werden zwei Objektelemente angegeben: <StackPanel> (mit Inhalt und einem später folgenden schließenden Tag) und <Button .../> (in selbstschließender Form, mit mehreren Attributen).This specifies two object elements: <StackPanel> (with content, and a closing tag later), and <Button .../> (the self-closing form, with several attributes). Die Objektelemente StackPanel und Button sind jeweils dem Namen einer Klasse zugeordnet, die durch WPFWPF definiert und Teil der WPFWPF Assemblys ist.The object elements StackPanel and Button each map to the name of a class that is defined by WPFWPF and is part of the WPFWPF assemblies. Wenn Sie ein Objektelement-Tag angeben, erstellen Sie eine Anweisung für den XAML-Prozessor, eine neue Instanz zu erstellen.When you specify an object element tag, you create an instruction for XAML processing to create a new instance. Jede Instanz wird durch Aufrufen des Standardkonstruktors des zugrunde liegenden Typs beim Analysieren und Laden des XAML-Codes erstellt.Each instance is created by calling the default constructor of the underlying type when parsing and loading the XAML.

Attributsyntax (Eigenschaften)Attribute syntax (properties)

Eigenschaften eines Objekts können oft als Attribute des Objektelements ausgedrückt werden.Properties of an object can often be expressed as attributes of the object element. Eine Attributsyntax benennt die Eigenschaft, die in der Attributsyntax festgelegt wird, gefolgt vom Zuweisungsoperator (=).An attribute syntax names the property that is being set in attribute syntax, followed by the assignment operator (=). Der Wert eines Attributs wird immer als Zeichenfolge angegeben, die in Anführungszeichen eingeschlossen ist.The value of an attribute is always specified as a string that is contained within quotation marks.

Die Attributsyntax ist die geradlinigste Syntax zur Festlegung von Eigenschaften und die intuitivste Syntax für Entwickler, die bereits in der Vergangenheit Markupsprachen verwendet haben.Attribute syntax is the most streamlined property setting syntax and is the most intuitive syntax to use for developers who have used markup languages in the past. Das folgende Markup erstellt z.B. eine Schaltfläche mit rotem Text und einem blauen Hintergrund, wobei der anzuzeigende Textinhalt als Content angegeben ist.For example, the following markup creates a button that has red text and a blue background in addition to display text specified as Content.

<Button Background="Blue" Foreground="Red" Content="This is a button"/>

Eigenschaftenelement-syntaxProperty element syntax

Einige Eigenschaften eines Objektelements können nicht in Attributsyntax angegeben werden, da die Objekte oder Informationen, die für den Eigenschaftswert benötigt werden, nicht hinreichend innerhalb der durch Anführungszeichen und Zeichenfolgen beschränkten Attributsyntax ausgedrückt werden können.For some properties of an object element, attribute syntax is not possible, because the object or information necessary to provide the property value cannot be adequately expressed within the quotation mark and string restrictions of attribute syntax. Für solche Fälle kann eine andere Syntax, die Eigenschaftenelement-Syntax genannt wird, verwendet werden.For these cases, a different syntax known as property element syntax can be used.

Die Syntax für das Starttag des Eigenschaftenelements lautet <Typname.Eigenschaftenname>.The syntax for the property element start tag is <typeName.propertyName>. Im Allgemeinen ist der Inhalt dieses Tags ein Objektelement des Typs, den die Eigenschaft als Wert annimmt.Generally, the content of that tag is an object element of the type that the property takes as its value . Nachdem der Inhalt angegeben ist, müssen Sie das Eigenschaftenelement mit einem Endtag schließen.After specifying content, you must close the property element with an end tag. Die Syntax für das Endtag lautet </Typname.Eigenschaftenname>.The syntax for the end tag is </typeName.propertyName>.

Wenn Attributsyntax möglich ist, ist deren Verwendung in der Regel bequemer und ermöglicht ein kompakteres Markup, aber das ist oft nur eine Frage des Stils, keine technische Einschränkung.If an attribute syntax is possible, using the attribute syntax is typically more convenient and enables a more compact markup, but that is often just a matter of style, not a technical limitation. Das folgende Beispiel zeigt die Festlegung derselben Eigenschaften wie im vorherigen Attributsyntax-Beispiel, aber dieses Mal unter Verwendung von Eigenschaftenelement-Syntax für alle Eigenschaften des Button-Elements.The following example shows the same properties being set as in the previous attribute syntax example, but this time by using property element syntax for all properties of the Button.

<Button>
  <Button.Background>
    <SolidColorBrush Color="Blue"/>
  </Button.Background>
  <Button.Foreground>
    <SolidColorBrush Color="Red"/>
  </Button.Foreground>
  <Button.Content>
    This is a button
  </Button.Content>
</Button>

AuflistungssyntaxCollection syntax

Die XAML-Sprache enthält einige Optimierungen, die besser lesbares Markup erstellen.The XAML language includes some optimizations that produce more human-readable markup. Eine dieser Optimierungen bewirkt, dass bei Eigenschaften, die vom Typ Auflistung sind, Elemente, die Sie in Markup als untergeordnete Elemente dieses Eigenschaftswerts anlegen, automatisch Teil der Auflistung werden.One such optimization is that if a particular property takes a collection type, then items that you declare in markup as child elements within that property's value become part of the collection. In diesem Fall ist der Wert, welcher der Auflistungseigenschaft zugewiesen wird, eine Auflistung von untergeordneten Objektelementen.In this case a collection of child object elements is the value being set to the collection property.

Im folgenden Beispiel verwendet Auflistungssyntax zum Festlegen von Werten der der GradientStops Eigenschaft:The following example shows collection syntax for setting values of the GradientStops property:

<LinearGradientBrush>  
  <LinearGradientBrush.GradientStops>  
    <!-- no explicit new GradientStopCollection, parser knows how to find or create -->  
    <GradientStop Offset="0.0" Color="Red" />  
    <GradientStop Offset="1.0" Color="Blue" />  
  </LinearGradientBrush.GradientStops>  
</LinearGradientBrush>  

XAML-InhaltseigenschaftenXAML content properties

Ein Feature der XAML-Sprache ist, dass eine Klasse genau eine ihrer Eigenschaften als XAML-Inhaltseigenschaft auszeichnen kann.XAML specifies a language feature whereby a class can designate exactly one of its properties to be the XAML content property. Untergeordnete Elemente dieses Objektelements werden verwendet, um den Wert dieser Inhaltseigenschaft festzulegen.Child elements of that object element are used to set the value of that content property. Anders gesagt: nur für die Inhaltseigenschaft dürfen Sie ein Eigenschaftenelement beim Festlegen dieser Eigenschaft in XAML-Markup auslassen und so eine besser sichtbare übergeordnet/untergeordnet-Metapher im Markup erzeugen.In other words, for the content property uniquely, you can omit a property element when setting that property in XAML markup and produce a more visible parent/child metaphor in the markup.

Z. B. Border gibt an, eine Inhaltseigenschaft von Child.For example, Border specifies a content property of Child. Die folgenden beiden Border -Elemente werden identisch behandelt.The following two Border elements are treated identically. Der erste nutzt den Vorteil der Inhaltseigenschaften-Syntax und lässt das Border.Child-Eigenschaftenelement aus.The first one takes advantage of the content property syntax and omits the Border.Child property element. Das zweite Beispiel zeigt Border.Child explizit.The second one shows Border.Child explicitly.

<Border>  
  <TextBox Width="300"/>  
</Border>  
<!--explicit equivalent-->  
<Border>  
  <Border.Child>  
    <TextBox Width="300"/>  
  </Border.Child>  
</Border>  

In der XAML-Sprache gilt die Regel, dass der Wert einer XAML-Inhaltseigenschaft nur vor oder nach allen anderen Eigenschaftenelemente für dieses Objektelement festgelegt werden darf.As a rule of the XAML language, the value of a XAML content property must be given either entirely before or entirely after any other property elements on that object element. Daher wird das folgende Markup beispielsweise nicht kompilieren:For instance, the following markup does not compile:

<Button>I am a   
  <Button.Background>Blue</Button.Background>  
  blue button</Button>  

Weitere Informationen zu dieser Einschränkung bei XAML-Inhaltseigenschaften finden Sie im Abschnitt "XAML-Inhaltseigenschaften" von Ausführliche Erläuterung der XAML-Syntax.For more information about this restriction on XAML content properties, see the "XAML Content Properties" section of XAML Syntax In Detail.

Text-InhaltText content

Eine kleine Anzahl von XAML-Elementen kann Text direkt als Inhalt verarbeiten.A small number of XAML elements can directly process text as their content. Um dies zu ermöglichen, muss einer der folgenden Fälle zutreffen:To enable this, one of the following cases must be true:

  • Die Klasse muss eine Inhaltseigenschaft deklarieren und Inhaltseigenschaft muss von einem Typ in eine Zeichenfolge sein (der Typ ist möglicherweise Object).The class must declare a content property, and that content property must be of a type assignable to a string (the type could be Object). Z. B. eine ContentControl verwendet Content wie deren Content-Eigenschaft, und es ist Object, unterstützen die folgende Syntax für ein praktisches ContentControl wie z. B. eine Button: <Button>Hello</Button>.For instance, any ContentControl uses Content as its content property and it is type Object, and this supports the following usage on a practical ContentControl such as a Button: <Button>Hello</Button>.

  • Der Typ muss einen Typkonverter deklarieren, für den in diesem Fall der Textinhalt als Initialisierungstext verwendet wird.The type must declare a type converter, in which case the text content is used as initialization text for that type converter. Beispielsweise <Brush>Blue</Brush>.For example, <Brush>Blue</Brush>. Dieser Fall ist in der Praxis weniger häufig.This case is less common in practice.

  • Der Typ muss eine bekanntes XAML-Sprachprimitiv sein.The type must be a known XAML language primitive.

Eigenschaften und der Auflistung Inhaltssyntax kombiniert.Content properties and collection syntax combined

Betrachten Sie das folgende Beispiel:Consider this example:

<StackPanel>  
  <Button>First Button</Button>  
  <Button>Second Button</Button>  
</StackPanel>  

Hier ist jedes Button ist ein untergeordnetes Element des StackPanel.Here, each Button is a child element of StackPanel. Dies ist ein optimiertes und intuitives Markup, bei dem zwei Tags aus zwei verschiedenen Gründen weggelassen wurden.This is a streamlined and intuitive markup that omits two tags for two different reasons.

  • Ausgelassenes StackPanel.Children-Eigenschaftenelement: StackPanel leitet sich von Panel.Omitted StackPanel.Children property element: StackPanel derives from Panel. Panel definiert Panel.Children als seine XAML Inhaltseigenschaft.Panel defines Panel.Children as its XAML content property.

  • Ausgelassenes UIElementCollection-Objektelement: der Panel.Children -Eigenschaft ist vom Typ UIElementCollection, implementiert IList.Omitted UIElementCollection object element: The Panel.Children property takes the type UIElementCollection, which implements IList. Elementtag der Auflistung kann ausgelassen werden, basierend auf den XAML-Regeln zum Verarbeiten von Auflistungen wie z. B. IList.The collection's element tag can be omitted, based on the XAML rules for processing collections such as IList. (In diesem Fall UIElementCollection tatsächlich kann nicht instanziiert werden, weil kein Standardkonstruktor verfügbar macht, und daher die UIElementCollection Object-Element wird auskommentiert angezeigt).(In this case, UIElementCollection actually cannot be instantiated because it does not expose a default constructor, and that is why the UIElementCollection object element is shown commented out).

<StackPanel>  
  <StackPanel.Children>  
    <!--<UIElementCollection>-->  
    <Button>First Button</Button>  
    <Button>Second Button</Button>  
    <!--</UIElementCollection>-->  
  </StackPanel.Children>  
</StackPanel>  

Attributsyntax (Ereignisse)Attribute syntax (events)

Attributsyntax kann auch für Mitglieder verwendet werden, die Ereignisse und keine Eigenschaften sind.Attribute syntax can also be used for members that are events rather than properties. In diesem Fall ist der Name des Attributs der Name des Ereignisses.In this case, the attribute's name is the name of the event. In der WPF-Implementierung von Ereignissen für XAML ist der Wert des Attributs der Name eines Ereignishandlers, der den Ereignisdelegaten implementiert.In the WPF implementation of events for XAML, the attribute's value is the name of a handler that implements that event's delegate. Das folgende Markup weist beispielsweise einen Handler für die Click Ereignis, um eine Button im Markup erstellt:For example, the following markup assigns a handler for the Click event to a Button created in markup:

<Page 
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  x:Class="ExampleNamespace.ExamplePage">
  <Button Click="Button_Click" >Click Me!</Button>
</Page>

Es steckt noch mehr hinter Ereignissen und XAML in WPF, als dieses Beispiel für die Attributsyntax zeigt.There is more to events and XAML in WPF than just this example of the attribute syntax. So fragen Sie sich vielleicht, was der hier referenzierte ClickHandler darstellt und wie er definiert wird.For example, you might wonder what the ClickHandler referenced here represents and how it is defined. Dies wird im kommenden Abschnitt Ereignisse und XAML-Code-Behind dieses Themas erläutert.This will be explained in the upcoming Events and XAML Code-Behind section of this topic.

Groß-/Kleinschreibung und Leerzeichen in XAMLCase and white space in XAML

In XAML wird im Allgemeinen Groß-/Kleinschreibung beachtet.XAML is generally speaking case sensitive. Zum Auflösen von Unterstützungstypen wird in WPF-XAML die Groß-/Kleinschreibung nach den gleichen Regeln wie in CLR beachtet.For purposes of resolving backing types, WPF XAML is case sensitive by the same rules that the CLR is case sensitive. Bei Objektelementen, Eigenschaftenelementen und Attributnamen muss beim Vergleich anhand des Namens des zugrunde liegenden Typs in der Assembly oder eines Typmitglieds immer die Groß-/Kleinschreibung beachtet werden.Object elements, property elements, and attribute names must all be specified by using the sensitive casing when compared by name to the underlying type in the assembly, or to a member of a type. Auch XAML-Schlüsselwörter und Primitive beachten die Groß-/Kleinschreibung.XAML language keywords and primitives are also case sensitive. Bei Werte wird nicht immer Groß-/Kleinschreibung beachtet.Values are not always case sensitive. Ob bei Werten Groß-/Kleinschreibung beachtet wird, hängt vom Verhalten ab, das dem Typkonverter für die den Wert annehmende Eigenschaft zugeordnet ist, oder vom Typ des Eigenschaftswerts.Case sensitivity for values will depend on the type converter behavior associated with the property that takes the value, or the property value type. Z. B. Eigenschaften, die haben die Boolean Typ akzeptiert entweder true oder True als gleichwertig, aber nur, weil der systemeigene WPF XAML-Parser-typkonvertierung von Zeichenfolgen zu Boolean lässt bereits als Entsprechungen.For example, properties that take the Boolean type can take either true or True as equivalent values, but only because the native WPF XAML parser type conversion for string to Boolean already permits these as equivalents.

WPF XAML-Prozessoren und Serialisierungsprogramme werden ignorieren oder löschen Sie alle nicht signifikanten Leerraum, und wird normalisieren alle signifikanten Leerraum.WPF XAML processors and serializers will ignore or drop all nonsignificant white space, and will normalize any significant white space. Dies entspricht der standardempfehlungen für Leerraumverhalten der XAML-Spezifikation.This is consistent with the default white-space behavior recommendations of the XAML specification. Dieses Verhalten hat im Allgemeinen nur dann Auswirkungen, wenn Sie Zeichenfolgen innerhalb von XAML-Inhaltseigenschaften angeben.This behavior is generally only of consequence when you specify strings within XAML content properties. Vereinfacht ausgedrückt: XAML konvertiert Leerzeichen, Zeilenvorschub und Tabulatorzeichen in Leerzeichen und behält anschließend ein Leerzeichen bei, wenn sich dieses an einem Ende einer zusammenhängenden Zeichenfolge befindet.In simplest terms, XAML converts space, linefeed and tab characters into spaces, and then preserves one space if found at either end of a contiguous string. Eine vollständige Erläuterung der XAML-White-Space-Behandlung ist in diesem Thema nicht behandelt.The full explanation of XAML white-space handling is not covered in this topic. Weitere Informationen finden Sie unter Leerzeichen, die Verarbeitung in XAML.For details, see White space processing in XAML.

MarkuperweiterungenMarkup extensions

Markuperweiterungen sind ein XAML-Sprachkonzept.Markup extensions are a XAML language concept. Wenn geschweifte Klammern zum Bereitstellen des Werts einer Attributsyntax verwendet werden ({ und }), handelt es sich dabei um die Verwendung einer Markuperweiterung.When used to provide the value of an attribute syntax, curly braces ({ and }) indicate a markup extension usage. Diese Verwendung weist den XAML-Prozessor an, von der allgemeinen Behandlung von Attributwerten als Zeichenfolgenliteral oder zu einer Zeichenfolge konvertierbarem Wert abzuweichen.This usage directs the XAML processing to escape from the general treatment of attribute values as either a literal string or a string-convertible value.

Die in der WPFWPF-Anwendungsprogrammierung am häufigsten verwendeten Markuperweiterungen sind Binding für Datenbindungsausdrücke und die Ressourcenverweise StaticResource und DynamicResource.The most common markup extensions used in WPFWPF application programming are Binding, used for data binding expressions, and the resource references StaticResource and DynamicResource. Durch die Verwendung von Markuperweiterungen können Sie mit Attributsyntax auch dann Werte für Eigenschaften bereitstellen, wenn diese Eigenschaft im Allgemeinen keine Attributsyntax unterstützt.By using markup extensions, you can use attribute syntax to provide values for properties even if that property does not support an attribute syntax in general. Markuperweiterungen verwenden oft intermediäre Ausdruckstypen, um Features wie z.B. das Zurückstellen von Werten oder das Verweisen auf andere Objekte, die nur zur Laufzeit vorhanden sind, zu aktivieren.Markup extensions often use intermediate expression types to enable features such as deferring values or referencing other objects that are only present at run time.

Das folgende Markup legt beispielsweise den Wert für die Style Eigenschaft mithilfe der Attributsyntax.For example, the following markup sets the value of the Style property using attribute syntax. Die Style Eigenschaft akzeptiert eine Instanz der Style -Klasse, die standardmäßig nicht von einer Zeichenfolge der Attributsyntax instanziiert werden kann.The Style property takes an instance of the Style class, which by default could not be instantiated by an attribute syntax string. In diesem Fall verweist das Attribut jedoch auf eine bestimmte Markuperweiterung, StaticResource.But in this case, the attribute references a particular markup extension, StaticResource. Wenn diese Markuperweiterung verarbeitet wird, wird ein Verweis auf einen Stil zurückgegeben, der bereits zuvor als mit einem Schlüssel versehene Ressource in einem Ressourcenverzeichnis instanziiert wurde.When that markup extension is processed, it returns a reference to a style that was previously instantiated as a keyed resource in a resource dictionary.

<Page.Resources>
  <SolidColorBrush x:Key="MyBrush" Color="Gold"/>
  <Style TargetType="Border" x:Key="PageBackground">
    <Setter Property="Background" Value="Blue"/>
  </Style>
</Page.Resources>
<StackPanel>
  <Border Style="{StaticResource PageBackground}">
  </Border>
</StackPanel>

Eine Verweisliste mit Markuperweiterungen für XAML, die spezifisch in WPF implementiert sind, finden Sie unter WPF-XAML-Erweiterungen.For a reference listing of all markup extensions for XAML implemented specifically in WPF, see WPF XAML Extensions. Eine Verweisliste der Markuperweiterungen, die von System.Xaml definiert und für .NET Framework-XAML-Implementierungen besser verfügbar sind, finden Sie unter XAML Namespace (x:) Language Features (Sprachfunktionen des XAML-Namespace (x:)).For a reference listing of the markup extensions that are defined by System.Xaml and are more widely available for .NET Framework XAML implementations, see XAML Namespace (x:) Language Features. Weitere Informationen über die Konzepte der Markuperweiterungen finden Sie unter Markuperweiterungen und WPF XAML.For more information about markup extension concepts, see Markup Extensions and WPF XAML.

TypkonverterType converters

Im Abschnitt XAML-Syntax in Kürze wurde behauptet, dass man den Attributwert durch eine Zeichenfolge festlegen können muss.In the XAML Syntax in Brief section, it was stated that the attribute value must be able to be set by a string. Die einfache, native Behandlung, wie Zeichenfolgen in andere Objekttypen oder primitive Werte konvertiert werden basiert auf der String Geben Sie selbst, sowie auf der nativen Verarbeitung bestimmter Typen wie DateTime oder Uri.The basic, native handling of how strings are converted into other object types or primitive values is based on the String type itself, in addition to native processing for certain types such as DateTime or Uri. Viele WPFWPF-Typen oder deren Mitglieder erweitern das grundlegende Verhalten der Zeichenfolgenverarbeitung so, dass Instanzen komplexerer Objekttypen als Zeichenfolgen und Attribute angegeben werden können.But many WPFWPF types or members of those types extend the basic string attribute processing behavior, in such a way that instances of more complex object types can be specified as strings and attributes.

Die Thickness Struktur ist ein Beispiel für einen Typ, der eine typkonvertierung für XAML-Verwendungen aktiviert wurde.The Thickness structure is an example of a type that has a type conversion enabled for XAML usages. Thickness gibt Maße innerhalb eines geschachtelten Rechtecks an und dient als der Wert für Eigenschaften wie z. B. Margin.Thickness indicates measurements within a nested rectangle and is used as the value for properties such as Margin. Durch Festlegen eines Typkonverters für Thickness, alle Eigenschaften, mit denen eine Thickness lassen sich einfacher in XAML angeben, da sie als Attribute angegeben werden können.By placing a type converter on Thickness, all properties that use a Thickness are easier to specify in XAML because they can be specified as attributes. Im folgenden Beispiel wird ein Typ Konvertierung und die Attributsyntax, um einen Wert für eine Margin:The following example uses a type conversion and attribute syntax to provide a value for a Margin:

<Button Margin="10,20,10,30" Content="Click me"/>

Das obige Attributsyntax-Beispiel entspricht der folgenden umständlicheren Beispiel, in dem die Margin stattdessen festgelegt ist, über die Eigenschaft mit Syntax eine Thickness Object-Element.The previous attribute syntax example is equivalent to the following more verbose syntax example, where the Margin is instead set through property element syntax containing a Thickness object element. Die vier wichtige Eigenschaften der Thickness werden als Attribute auf der neuen Instanz festgelegt:The four key properties of Thickness are set as attributes on the new instance:

<Button Content="Click me">
  <Button.Margin>
    <Thickness Left="10" Top="20" Right="10" Bottom="30"/>
  </Button.Margin>
</Button>

Hinweis

Es gibt auch eine begrenzte Anzahl von Objekten, in denen die Typkonvertierung die einzige öffentliche Methode zum Festlegen einer Eigenschaft auf diesen Typ ist, die keine Unterklasse benötigt, da der Typ selbst nicht über einen Standardkonstruktor verfügt.There are also a limited number of objects where the type conversion is the only public way to set a property to that type without involving a subclass, because the type itself does not have a default constructor. Ein Beispiel hierfür ist Cursor.An example is Cursor.

Weitere Informationen zu Typkonvertierung und wie deren Verwendung in Attributsyntax unterstützt wird, finden Sie unter TypeConverter und XAML.For more information on how type conversion and its use for attribute syntax is supported, see TypeConverters and XAML.

XAML-Stammelemente und XAML-namespacesXAML root elements and XAML namespaces

Eine XAML-Datei darf nur ein Stammelement haben, um sowohl wohlgeformtes XMLXML als auch eine gültige XAML-Datei zu sein.A XAML file must have only one root element, in order to be both a well-formed XMLXML file and a valid XAML file. Für normale WPF-Szenarios, die Sie verwenden ein Stammelement, das eine herausragende Bedeutung in WPF-Anwendungsmodell hat (z. B. Window oder Page für eine Seite, ResourceDictionary für ein externes Wörterbuch oder Application für die Definition der Anwendung).For typical WPF scenarios, you use a root element that has a prominent meaning in the WPF application model (for example, Window or Page for a page, ResourceDictionary for an external dictionary, or Application for the application definition). Das folgende Beispiel zeigt eine typische XAML-Datei für das Stammelement einer WPFWPF Seite mit dem Stammelement des Page.The following example shows the root element of a typical XAML file for a WPFWPF page, with the root element of Page.

<Page
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
</Page>

Das Stammelement enthält auch die Attribute xmlns und xmlns:x.The root element also contains the attributes xmlns and xmlns:x. Diese Attribute geben einem XAML-Prozessor an, welche XAML-Namespaces die Typdefinitionen für Unterstützungstypen enthalten, auf die das Markup als Elemente verweist.These attributes indicate to a XAML processor which XAML namespaces contain the type definitions for backing types that the markup will reference as elements. Das xmlns-Attribut gibt ausdrücklich den XAML-Standardnamespace an.The xmlns attribute specifically indicates the default XAML namespace. Innerhalb des XAML-Standardnamespaces können Objektelemente im Markup ohne Präfix angegeben werden.Within the default XAML namespace, object elements in the markup can be specified without a prefix. Für die meisten WPFWPF-Anwendungsszenarios und für fast alle der in den WPFWPF-Abschnitten des SDKSDK gegebenen Beispiele, ist der XAML-Standardnamespace dem WPFWPF-Namespace http://schemas.microsoft.com/winfx/2006/xaml/presentationhttp://schemas.microsoft.com/winfx/2006/xaml/presentation zugeordnet.For most WPFWPF application scenarios, and for almost all of the examples given in the WPFWPF sections of the SDKSDK, the default XAML namespace is mapped to the WPFWPF namespace http://schemas.microsoft.com/winfx/2006/xaml/presentationhttp://schemas.microsoft.com/winfx/2006/xaml/presentation. Das xmlns:x-Attribut gibt einen zusätzlichen XAML-Namespace an, der dem XAML-Sprachnamespace http://schemas.microsoft.com/winfx/2006/xamlhttp://schemas.microsoft.com/winfx/2006/xaml zugeordnet ist.The xmlns:x attribute indicates an additional XAML namespace, which maps the XAML language namespace http://schemas.microsoft.com/winfx/2006/xamlhttp://schemas.microsoft.com/winfx/2006/xaml.

Diese Verwendung von xmlns zum Definieren eines Geltungsbereich für die Verwendung und Zuordnung eines Namescopes ist mit der XML 1.0-Spezifikation verträglich.This usage of xmlns to define a scope for usage and mapping of a namescope is consistent with the XML 1.0 specification. XAML-Namescopes unterscheiden sich von XML-Namescopes nur darin, dass ein XAML-Namescope auch darüber etwas impliziert, wie Elemente durch Typen unterstützt werden, wenn es zur Typauflösung und Analyse des XAML-Codes kommt.XAML namescopes are different from XML namescopes only in that a XAML namescope also implies something about how the namescope's elements are backed by types when it comes to type resolution and parsing the XAML.

Beachten Sie, dass die xmlns-Attribute nur für das Stammelement jeder XAML-Datei unbedingt erforderlich sind.Note that the xmlns attributes are only strictly necessary on the root element of each XAML file. xmlns-Definitionen gelten für alle Nachfolgerelemente des Stammelements (dieses Verhalten entspricht wieder der XML 1.0-Spezifikation für xmlns.) xmlns-Attribute sind auch bei anderen Elementen unterhalb des Stamms zulässig und gelten für alle Nachfolgerelemente des definierenden Elements.xmlns definitions will apply to all descendant elements of the root element (this behavior is again consistent with the XML 1.0 specification for xmlns.) xmlns attributes are also permitted on other elements underneath the root, and would apply to any descendant elements of the defining element. Allerdings kann häufiges Definieren oder Neudefinieren von XAML-Namespaces zu einem nur schwer lesbaren XAML-Markup-Stil führen.However, frequent definition or redefinition of XAML namespaces can result in a XAML markup style that is difficult to read.

Die WPFWPF-Implementierung des XAML-Prozessors schließt eine Infrastruktur ein, der die WPF-Kernassemblys bekannt sind.The WPFWPF implementation of its XAML processor includes an infrastructure that has awareness of the WPF core assemblies. Ihr ist bekannt, dass die WPFWPF-Kernassemblys die Typen enthalten, welche die WPFWPF-Zuordnungen zum XAML-Standardnamespace unterstützen.The WPFWPF core assemblies are known to contain the types that support the WPFWPF mappings to the default XAML namespace. Dies wird durch eine Konfiguration ermöglicht, die Teil Ihrer Projekt-Builddatei und des WPF-Builds und -Projektsystems ist.This is enabled through configuration that is part of your project build file and the WPF build and project systems. Daher ist die Deklaration des XAML-Namespaces als Standard-xmlns das Einzige, was benötigt wird, um auf XAML-Elemente zu verweisen, die aus WPFWPF-Assemblys stammen.Therefore, declaring the default XAML namespace as the default xmlns is all that is necessary in order to reference XAML elements that come from WPFWPF assemblies.

Das Präfix x:The x: prefix

Im vorherigen Beispiel zum Stammelement wurde das Präfix x: verwendet, um den XAML-Namespaces http://schemas.microsoft.com/winfx/2006/xamlhttp://schemas.microsoft.com/winfx/2006/xaml zuzuordnen, also der dedizierte XAML-Namespace, der XAML-Sprachkonstrukte unterstützt.In the previous root element example, the prefix x: was used to map the XAML namespace http://schemas.microsoft.com/winfx/2006/xamlhttp://schemas.microsoft.com/winfx/2006/xaml, which is the dedicated XAML namespace that supports XAML language constructs. Dieses x:-Präfix wird für die Zuordnung des XAML-Namespaces in den Vorlagen für Projekte, in Beispielen und in der Dokumentation im gesamten SDKSDK verwendet.This x: prefix is used for mapping this XAML namespace in the templates for projects, in examples, and in documentation throughout this SDKSDK. Der XAML-Namespace für die XAML-Sprache enthält verschiedene Programmierkonstrukte, die Sie häufig in XAML verwenden werden.The XAML namespace for the XAML language contain several programming constructs that you will use very frequently in your XAML. Im folgenden finden Sie eine Liste der häufigsten x:-Präfix-Programmierkonstrukte, die Sie verwenden werden:The following is a listing of the most common x: prefix programming constructs you will use:

  • X: Key: Legt einen eindeutigen Schlüssel für jede Ressource in einem ResourceDictionary (oder in ähnlichen Wörterbuchkonzepten in anderen Frameworks).x:Key: Sets a unique key for each resource in a ResourceDictionary (or similar dictionary concepts in other frameworks). x:Key wird wahrscheinlich für 90 % der Verwendungen von x: im Markup einer normalen WPF-Anwendung verantwortlich zeigen.x:Key will probably account for 90% of the x: usages you will see in a typical WPF application's markup.

  • x:Class: Gibt den CLRCLR-Namespace und den Namen für die Klasse an, die CodeBehind für eine XAML-Seite bereitstellt.x:Class: Specifies the CLRCLR namespace and class name for the class that provides code-behind for a XAML page. Das WPF-Programmiermodell schreibt eine solche Klasse für CodeBehind-Unterstützung vor, weshalb Sie fast immer eine Zuordnung von x: sehen werden, selbst wenn keine Ressourcen vorhanden sind.You must have such a class to support code-behind per the WPF programming model, and therefore you almost always see x: mapped, even if there are no resources.

  • x:Name: Gibt einen Namen für das Laufzeitobjekt einer Instanz an, die im Laufzeitcode existiert, nachdem ein Objektelement verarbeitet ist.x:Name: Specifies a run-time object name for the instance that exists in run-time code after an object element is processed. Im Allgemeinen werden Sie häufig eine entsprechende WPF-definierte Eigenschaft für x:Name verwenden.In general, you will frequently use a WPF-defined equivalent property for x:Name. Solche Eigenschaften werden spezifisch einer CLR-Unterstützungseigenschaft zugeordnet und erleichtern daher die Anwendungsprogrammierung, bei der Sie häufig Laufzeitcode verwenden, um die benannten Elemente aus initialisiertem XAML zu finden.Such properties map specifically to a CLR backing property and are thus more convenient for application programming, where you frequently use run time code to find the named elements from initialized XAML. Die am häufigsten verwendeten Eigenschaft dieser Art ist FrameworkElement.Name.The most common such property is FrameworkElement.Name. Weiterhin können X: Name Wenn die entsprechende WPF-Frameworkebene Name Eigenschaft wird in einem bestimmten Typ nicht unterstützt.You might still use x:Name when the equivalent WPF framework-level Name property is not supported in a particular type. Dies ist bei einigen Animations-Szenarios der Fall.This occurs in certain animation scenarios.

  • x:Static: Ermöglicht einen Verweis, der einen statischen Wert zurückgibt, der nicht anderweitig als XAML-kompatible Eigenschaft verwendbar ist.x:Static: Enables a reference that returns a static value that is not otherwise a XAML-compatible property.

  • X: Type-: erstellt eine Type Verweis basierend auf einem Typnamen.x:Type: Constructs a Type reference based on a type name. Wird verwendet, um Attribute anzugeben, die annehmen Type, z. B. Style.TargetType, obwohl Sie häufig die Eigenschaft über native Zeichenfolge verfügt-zu-Type Konvertierung so, die die X: Type- Markuperweiterung optional.This is used to specify attributes that take Type, such as Style.TargetType, although frequently the property has native string-to-Type conversion in such a way that the x:Type markup extension usage is optional.

Es gibt weitere Programmierkonstrukte im x:-Präfix/XAML-Namespace, die nicht so häufig verwendet werden.There are additional programming constructs in the x: prefix/XAML namespace, which are not as common. Weitere Informationen finden Sie unter Sprachfunktionen des XAML-Namespace (x:).For details, see XAML Namespace (x:) Language Features.

Benutzerdefinierte Präfixe und benutzerdefinierte Typen in XAMLCustom prefixes and custom types in XAML

Für eigene benutzerdefinierte Assemblys oder Assemblys außerhalb des WPF-Kerns aus PresentationCore, PresentationFramework und WindowsBase können Sie die Assembly als Teil einer benutzerdefinierten xmlns-Zuordnung angeben.For your own custom assemblies, or for assemblies outside the WPF core of PresentationCore, PresentationFramework and WindowsBase, you can specify the assembly as part of a custom xmlns mapping. Sie können dann auf Typen aus dieser Assembly in Ihrem XAML verweisen, sofern dieser Typ korrekt implementiert wird, um die von Ihnen beabsichtigten XAML-Verwendungen zu unterstützen.You can then reference types from that assembly in your XAML, so long as that type is correctly implemented to support the XAML usages you are attempting.

Im Folgenden sehen Sie ein einfaches Beispiel dafür, wie benutzerdefinierte Präfixe in XAML-Markup funktionieren.The following is a very basic example of how custom prefixes work in XAML markup. Das Präfix custom ist im Stammelement definiert und einer bestimmten Assembly zugeordnet, die mit der Anwendung verpackt wird und verfügbar ist.The prefix custom is defined in the root element tag, and mapped to a specific assembly that is packaged and available with the application. Diese Assembly enthält einen Typ NumericUpDown, der für die Unterstützung allgemeiner XAML-Verwendung implementiert ist und eine Klassenvererbung verwendet, die ihre Einfügung an diesem bestimmten Punkt im WPF-XAML-Inhaltsmodell zulässt.This assembly contains a type NumericUpDown, which is implemented to support general XAML usage as well as using a class inheritance that permits its insertion at this particular point in a WPF XAML content model. Eine Instanz dieses NumericUpDown-Steuerelements wird mithilfe des Präfix als Objektelement deklariert, damit der XAML-Parser weiß, welcher XAML-Namespace den Typ enthält und damit auch, wo sich die Unterstützungsassembly befindet, die die Typdefinition enthält.An instance of this NumericUpDown control is declared as an object element, using the prefix so that a XAML parser knows which XAML namespace contains the type, and therefore where the backing assembly is that contains the type definition.

<Page  
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"   
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"   
    xmlns:custom="clr-namespace:NumericUpDownCustomControl;assembly=CustomLibrary"  
    >  
  <StackPanel Name="LayoutRoot">  
    <custom:NumericUpDown Name="numericCtrl1" Width="100" Height="60"/>  
...  
  </StackPanel>  
</Page>  

Weitere Informationen zu benutzerdefinierten Typen in XAML finden Sie unter XAML- und benutzerdefinierte Klassen für WPF.For more information about custom types in XAML, see XAML and Custom Classes for WPF.

Weitere Informationen zur Beziehung zwischen XML-Namespaces und den Namespaces des unterstützenden Codes in Assemblys finden Sie unter XAML-Namespaces und Namespace-Zuordnung für WPF-XAML.For more information about how XML namespaces and the namespaces of the backing code in assemblies are related, see XAML Namespaces and Namespace Mapping for WPF XAML.

Ereignisse und XAML-Code-behindEvents and XAML code-behind

Die meisten WPFWPF-Anwendungen bestehen aus XAML-Markup und CodeBehind.Most WPFWPF applications consist of both XAML markup and code-behind. In einem Projekt richtet sich die XAML als eine .xaml -Datei, und ein CLRCLR Sprache wie z. B. Microsoft Visual Basic oder C# -Code wird verwendet, um eine CodeBehind-Datei zu schreiben.Within a project, the XAML is written as a .xaml file, and a CLRCLR language such as Microsoft Visual Basic or C# is used to write a code-behind file. Wenn das Markup einer XAML-Datei als Teil der WPF-Programmierungs- und -Anwendungsmodelle kompiliert wird, wird der Speicherort der XAML-CodeBehind-Datei für eine XAML-Datei durch Angeben eines Namespaces und einer Klasse als x:Class-Attribut des Stammelements des XAML identifiziert.When a XAML file is markup compiled as part of the WPF programming and application models, the location of the XAML code-behind file for a XAML file is identified by specifying a namespace and class as the x:Class attribute of the root element of the XAML.

In den bisherigen Beispielen haben Sie verschiedene Schaltflächen gesehen, aber noch war keiner dieser Schaltflächen ein logisches Verhalten zugeordnet.In the examples so far, you have seen several buttons, but none of these buttons had any logical behavior associated with them yet. Der primäre Mechanismus auf Anwendungsebene zum Hinzufügen eines Verhaltens für ein Objektelement ist, ein vorhandenes Ereignis der Elementklasse zu verwenden und einen bestimmten Handler für dieses Ereignis zu schreiben, der aufgerufen wird, wenn das Ereignis zur Laufzeit ausgelöst wird.The primary application-level mechanism for adding a behavior for an object element is to use an existing event of the element class, and to write a specific handler for that event that is invoked when that event is raised at run time. Der Name des Ereignisses und der Name der zu verwendenden Handler werden im Markup angegeben, während der Code, der den Handler implementiert, im CodeBehind definiert ist.The event name and the name of the handler to use are specified in the markup, whereas the code that implements your handler is defined in the code-behind.

<Page 
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  x:Class="ExampleNamespace.ExamplePage">
  <Button Click="Button_Click" >Click Me!</Button>
</Page>
namespace ExampleNamespace
{
  public partial class ExamplePage
  {
    void Button_Click(object sender, RoutedEventArgs e)
    {
      Button b = e.Source as Button;
      b.Foreground = Brushes.Red;
    }
  }
}
Private Sub Button_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs)
    Dim b As Button = e.Source
    b.Foreground = Brushes.Red
End Sub

Beachten Sie, dass die CodeBehind-Datei den CLR-Namespace ExampleNamespace verwendet und ExamplePage als partielle Klasse in diesem Namespace deklariert.Notice that the code-behind file uses the CLR namespace ExampleNamespace and declares ExamplePage as a partial class within that namespace. Dies entspricht dem x:Class-Attributwert von ExampleNamespace.ExamplePage,This parallels the x:Class attribute value of ExampleNamespace.ExamplePage der im Stammelement des Markups bereitgestellt wurde.that was provided in the markup root. Der WPF-Markupcompiler erstellt für jede kompilierte XAML-Datei eine partielle Klasse durch Ableiten einer Klasse des Typs des Stammelements.The WPF markup compiler will create a partial class for any compiled XAML file, by deriving a class from the root element type. Wenn Sie CodeBehind bereitstellen, in dem die gleiche partielle Klasse definiert ist, wird der resultierende Code innerhalb der gleichen Namespace- und Klassennamen der kompilierten Anwendung kombiniert.When you provide code-behind that also defines the same partial class, the resulting code is combined within the same namespace and class of the compiled application.

Weitere Informationen zu den Anforderungen für die CodeBehind-Programmierung in WPF finden Sie im Abschnitt "Code-Behind-Ereignishandler und Anforderungen der partiellen Klasse" von Code-Behind und XAML in WPF.For more information about requirements for code-behind programming in WPF, see the "Code-behind, Event Handler, and Partial Class Requirements" section of Code-Behind and XAML in WPF.

Wenn Sie keine separate CodeBehind-Datei erstellen möchten, können Sie Ihren den Code auch inline in eine XAML-Datei schreiben.If you do not want to create a separate code-behind file, you can also inline your code in a XAML file. Inline-Code ist jedoch eine weniger vielseitige Technik, die erhebliche Einschränkungen hat.However, inline code is a less versatile technique that has substantial limitations. Weitere Informationen finden Sie unter CodeBehind und XAML in WPF.For details, see Code-Behind and XAML in WPF.

RoutingereignisseRouted events

Ein bestimmtes, in WPFWPF grundlegendes Ereignis-Feature ist das Routingereignis.A particular event feature that is fundamental to WPFWPF is a routed event. Routingereignisse ermöglichen es einem Element, ein Ereignis zu behandeln, das durch ein anderes Element ausgelöst wurde, solange diese Elemente über eine strukturelle Beziehung verbunden sind.Routed events enable an element to handle an event that was raised by a different element, as long as the elements are connected through a tree relationship. Gibt man eine Ereignisbehandlung über ein XAML-Attribut an, kann jedes beliebige Element nach diesem Routingereignis lauschen und es behandeln, einschließlich der Elemente, für die dieses bestimmte Element nicht in der Mitgliedstabelle der Klasse aufgeführt ist.When specifying event handling with a XAML attribute, the routed event can be listened for and handled on any element, including elements that do not list that particular event in the class members table. Dies wird durch Qualifizierung des Ereignisnamen-Attributs mit dem besitzenden Klassennamen erreicht.This is accomplished by qualifying the event name attribute with the owning class name. Z. B. das übergeordnete Element StackPanel im aktuellen StackPanel / Button Beispiel konnte registriert einen Handler für die Schaltfläche des untergeordneten Elements des Click Ereignis durch Festlegen des-Attributs Button.Click auf die StackPanel Object-Element, mit dem Handlernamen als Attributwert.For instance, the parent StackPanel in the ongoing StackPanel / Button example could register a handler for the child element button's Click event by specifying the attribute Button.Click on the StackPanel object element, with your handler name as the attribute value. Weitere Informationen zu Routingereignissen finden Sie unter Übersicht über Routingereignisse.For more information about how routed events work, see Routed Events Overview.

Benannte Elemente XAMLXAML named elements

Die Objektinstanz, die in einem Objektdiagramm durch Verarbeitung eines XAML-Objektelements erstellt wird, hat standardmäßig keinen eindeutigen Bezeichner oder Objektverweis.By default, the object instance that is created in an object graph by processing a XAML object element does not possess a unique identifier or object reference. Wenn Sie allerdings einen Konstruktor im Code aufrufen, verwenden Sie fast immer das Konstruktorergebnis zum Festlegen einer Variablen auf die erstellte Instanz, damit Sie später im Code auf die Instanz verweisen können.In contrast, if you call a constructor in code, you almost always use the constructor result to set a variable to the constructed instance, so that you can reference the instance later in your code. Um standardisierten Zugriff auf Objekte bereitzustellen, die durch eine Markupdefinition erstellt wurden, definiert XAML-Code das x:Name-Attribut.In order to provide standardized access to objects that were created through a markup definition, XAML defines the x:Name attribute. Sie können den Wert des x:Name-Attributs auf jedes beliebiges Objektelement festlegen.You can set the value of the x:Name attribute on any object element. Im CodeBehind entspricht der von Ihnen gewählte Bezeichner einer Instanzvariablen, die auf die erstellte Instanz verweist.In your code-behind, the identifier you choose is equivalent to an instance variable that refers to the constructed instance. Benannte Elemente funktionieren in jeder Hinsicht wie Objektinstanzen (der Name verweist auf diese Instanz), und das CodeBehind kann auf die benannten Elemente verweisen, um anwendungsinterne Interaktionen zur Laufzeit zu behandeln.In all respects, named elements function as if they were object instances (the name references that instance), and your code-behind can reference the named elements to handle run-time interactions within the application. Diese Verbindung zwischen Instanzen und Variablen wird erreicht, indem der WPF XAML-Markupcompiler und schließt insbesondere Funktionen und Muster wie z. B. InitializeComponent , die nicht in diesem Thema ausführlich erörtert.This connection between instances and variables is accomplished by the WPF XAML markup compiler, and more specifically involve features and patterns such as InitializeComponent that will not be discussed in detail in this topic.

WPF-Frameworkebene XAML-Elemente erben eine Name -Eigenschaft, die entspricht, für die XAML-definierten x:Name Attribut.WPF framework-level XAML elements inherit a Name property, which is equivalent to the XAML defined x:Name attribute. Bestimmte andere Klassen bieten ebenfalls Entsprechungen für x:Name auf Eigenschaftenebene, was in der Regel ebenfalls als Name-Eigenschaft definiert ist.Certain other classes also provide property-level equivalents for x:Name, which is also generally defined as a Name property. Allgemein gilt, dass Sie ersatzweise x:Name nutzen sollten, wenn Sie keine Name-Eigenschaft in der Mitgliedertabelle Ihres gewünschten Elements/Typs finden können.Generally speaking, if you cannot find a Name property in the members table for your chosen element/type, use x:Name instead. Die x:Name Werte bieten einen Bezeichner, der ein XAML-Element, das zur Laufzeit, indem bestimmte Subsysteme oder Utility-Methoden wie z. B. verwendet werden kann FindName.The x:Name values will provide an identifier to a XAML element that can be used at run time, either by specific subsystems or by utility methods such as FindName.

Im folgenden Beispiel wird Name auf eine StackPanel Element.The following example sets Name on a StackPanel element. Klicken Sie dann einen Handler für eine Button innerhalb der StackPanel Verweise der StackPanel mithilfe seines instanzverweises buttonContainer entsprechend der Festlegung durch Name.Then, a handler on a Button within that StackPanel references the StackPanel through its instance reference buttonContainer as set by Name.

<StackPanel Name="buttonContainer">
  <Button Click="RemoveThis">Click to remove this button</Button>
</StackPanel>
void RemoveThis(object sender, RoutedEventArgs e)
{
    FrameworkElement fe = e.Source as FrameworkElement;
    if (buttonContainer.Children.Contains(fe))
    {
        buttonContainer.Children.Remove(fe);
    }
}
 Private Sub RemoveThis(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs)
     Dim fe As FrameworkElement = e.Source
     If (buttonContainer.Children.Contains(fe)) Then
         buttonContainer.Children.Remove(fe)
     End If
End Sub

Der XAML-Name einer Instanz unterliegt genau wie eine Variable dem Konzept eines Geltungsbereichs, sodass die Eindeutigkeit von Namen innerhalb eines bestimmten, vorhersagbaren Geltungsbereichs erzwungen werden kann.Just like a variable, the XAML name for an instance is governed by a concept of scope, so that names can be enforced to be unique within a certain scope that is predictable. Das primäre Markup, das eine Seite definiert, kennzeichnet einen eindeutigen XAML-Namescope, dessen Grenze das Stammelement dieser Seite ist.The primary markup that defines a page denotes one unique XAML namescope, with the XAML namescope boundary being the root element of that page. Allerdings können andere Markupquellen zur Laufzeit mit einer Seite interagieren, z.B. Stile oder Vorlagen innerhalb von Stilen, und solche Markupquellen verfügen häufig über ihre eigenen XAML-Namescopes, die nicht unbedingt mit dem XAML-Namescope der Seite verbunden sind.However, other markup sources can interact with a page at run time, such as styles or templates within styles, and such markup sources often have their own XAML namescopes that do not necessarily connect with the XAML namescope of the page. Weitere Informationen zu x:Name und XAML-Namescopes finden Sie unter Name, X: Name Directive, oder WPF-XAML-Namescopes.For more information on x:Name and XAML namescopes, see Name, x:Name Directive, or WPF XAML Namescopes.

Angefügte Eigenschaften und angefügte EreignisseAttached properties and attached events

In XAML ist ein Sprachfeature spezifiziert, das es ermöglicht, bestimmte Eigenschaften oder Ereignisse für jedes Element zu aktivieren, unabhängig davon, ob diese Eigenschaft oder dieses Ereignis in den Typdefinitionen für das Element vorhanden sind, für die sie festgelegt werden.XAML specifies a language feature that enables certain properties or events to be specified on any element, regardless of whether the property or event exists in the type's definitions for the element it is being set on. Die Eigenschaftsversion dieser Funktion wird „angefügte Eigenschaft”, die Ereignisversion „angefügtes Ereignis” genannt.The properties version of this feature is called an attached property, the events version is called an attached event. Im Prinzip können Sie sich angefügte Eigenschaften und Ereignisse als globale Mitglieder vorstellen, die für eine Instanz jedes XAML-Elements oder -Objekts festgelegt werden können.Conceptually, you can think of attached properties and attached events as global members that can be set on any XAML element/object instance. Jedoch muss dieses Element/diese Klasse oder eine größere Infrastruktur einen unterstützenden Eigenschaftenspeicher für die angefügten Werte unterstützen.However, that element/class or a larger infrastructure must support a backing property store for the attached values.

Angefügte Eigenschaften in XAML werden in der Regel über die Attributsyntax verwendet.Attached properties in XAML are typically used through attribute syntax. In der Attributsyntax geben Sie eine angefügte Eigenschaft in der Form Besitzertyp.Eigenschaftenname an.In attribute syntax, you specify an attached property in the form ownerType.propertyName.

Oberflächlich betrachtet, gleicht dies der Verwendung eines Eigenschaftenelements, aber in diesem Fall ist der von Ihnen angegebene Besitzertyp immer ein anderer Typ als das Objektelement, in dem die angefügte Eigenschaft festgelegt wird.Superficially, this resembles a property element usage, but in this case the ownerType you specify is always a different type than the object element where the attached property is being set. Besitzertyp ist der Typ, der die Accessormethoden bereitstellt, die von einem XAML-Prozessor zum Abrufen oder Festlegen des Werts der angefügten Eigenschaft benötigt werden.ownerType is the type that provides the accessor methods that are required by a XAML processor in order to get or set the attached property value.

Das häufigste Szenario für angefügte Eigenschaften ist, es untergeordneten Elementen zu ermöglichen, einen Eigenschaftswert an ihr übergeordnetes Element zu melden.The most common scenario for attached properties is to enable child elements to report a property value to their parent element.

Das folgende Beispiel veranschaulicht die DockPanel.Dock angefügte Eigenschaft.The following example illustrates the DockPanel.Dock attached property. Die DockPanel -Klasse definiert die Accessoren für DockPanel.Dock und daher die angefügte Eigenschaft besitzt.The DockPanel class defines the accessors for DockPanel.Dock and therefore owns the attached property. Die DockPanel -Klasse enthält auch die Logik, die die untergeordneten Elemente durchläuft und insbesondere überprüft jedes Element auf einen festgelegten Wert von DockPanel.Dock.The DockPanel class also includes logic that iterates its child elements and specifically checks each element for a set value of DockPanel.Dock. Wenn ein Wert gefunden wird, wird dieser Wert während des Layouts zum Positionieren der untergeordneten Elemente verwendet.If a value is found, that value is used during layout to position the child elements. Verwenden der DockPanel.Dock angefügte Eigenschaft und diese positionierungs-Fähigkeit ist in der Tat das hauptmotivations-Szenario für die DockPanel Klasse.Use of the DockPanel.Dock attached property and this positioning capability is in fact the motivating scenario for the DockPanel class.

<DockPanel>
  <Button DockPanel.Dock="Left" Width="100" Height="20">I am on the left</Button>
  <Button DockPanel.Dock="Right" Width="100" Height="20">I am on the right</Button>
</DockPanel>

In WPFWPF sind die meisten angefügten Eigenschaften auch als Abhängigkeitseigenschaften implementiert.In WPFWPF, most or all the attached properties are also implemented as dependency properties. Weitere Informationen finden Sie unter Übersicht über angefügte Eigenschaften.For details, see Attached Properties Overview.

Angefügte Ereignisse verwenden eine ähnliche Besitzertyp. EventName-Form der Attributsyntax.Attached events use a similar ownerType.eventName form of attribute syntax. Wie bei nicht angefügten Ereignissen gibt der Attributwert für ein angefügtes Ereignis in XAML den Namen der Handlermethode an, die aufgerufen wird, wenn das Ereignis für das Element behandelt wird.Just like the non-attached events, the attribute value for an attached event in XAML specifies the name of the handler method that is invoked when the event is handled on the element. Angefügte Ereignisse werden in WPF-XAML seltener verwendet.Attached event usages in WPF XAML are less common. Weitere Informationen finden Sie unter Übersicht über angefügte Ereignisse.For more information, see Attached Events Overview.

Basistypen und XAMLBase types and XAML

WPF-XAML und dem zugehörigen XAML-Namespace liegt zusätzlich zu Markupelementen für XAML eine Auflistung von Typen zugrunde, die CLRCLR-Objekten entsprechen.Underlying WPF XAML and its XAML namespace is a collection of types that correspond to CLRCLR objects in addition to markup elements for XAML. Allerdings können nicht alle Klassen Elementen zugeordnet werden.However, not all classes can be mapped to elements. Abstrakte Klassen wie z. B. ButtonBase, und bestimmte nicht-abstrakte Klassen werden verwendet, für die Vererbung in der CLRCLR Objekte Modell.Abstract classes, such as ButtonBase, and certain nonabstract base classes are used for inheritance in the CLRCLR objects model. Basisklassen, einschließlich abstrakter Klassen, sind dennoch wichtig für die XAML-Entwicklung, da jedes konkrete XAML-Element Mitglieder einer Basisklasse in der eigenen Hierarchie erbt.Base classes, including abstract ones, are still important to XAML development because each of the concrete XAML elements inherits members from some base class in its hierarchy. Häufig enthalten diese Mitglieder Eigenschaften, die als Attribute für das Element festgelegt werden können, oder Ereignisse, die behandelt werden können.Often these members include properties that can be set as attributes on the element, or events that can be handled. FrameworkElement ist die konkrete Basis- UIUI Klasse WPFWPF auf der WPF-Frameworkebene.FrameworkElement is the concrete base UIUI class of WPFWPF at the WPF framework level. Beim Entwerfen von UIUI, verwenden Sie verschiedene Form-, Bereichs-, Decorator- oder ableiten von Steuerelementklassen, der alle FrameworkElement.When designing UIUI, you will use various shape, panel, decorator, or control classes, which all derive from FrameworkElement. Eine zugehörige Basisklasse, FrameworkContentElement, unterstützt dokumentorientierte Elemente, die funktionieren gut für Flusslayout-Präsentationen, mit APIsAPIs , die absichtlich spiegeln die APIsAPIs in FrameworkElement.A related base class, FrameworkContentElement, supports document-oriented elements that work well for a flow layout presentation, using APIsAPIs that deliberately mirror the APIsAPIs in FrameworkElement. Die Kombination aus Attributen auf Elementebene und einem CLRCLR-Objektmodell stellt Ihnen eine Reihe von allgemeinen Eigenschaften bereit, die für die meisten konkreten XAML-Elemente unabhängig vom jeweiligen XAML-Element und dem zugrunde liegenden Typ festlegbar sind.The combination of attributes at the element level and a CLRCLR object model provides you with a set of common properties that are settable on most concrete XAML elements, regardless of the specific XAML element and its underlying type.

XAML-SicherheitXAML security

XAML ist eine Markupsprache, die Objektinstanziierung und -ausführung direkt darstellt.XAML is a markup language that directly represents object instantiation and execution. Daher verfügen in XAML erstellte Elemente über dieselbe Fähigkeit zur Interaktion mit Systemressourcen (z.B. Netzwerkzugriff, Dateisystem E/A), wie der gleichwertig generierte Code.Therefore, elements created in XAML have the same ability to interact with system resources (network access, file system IO, for example) as the equivalent generated code does.

WPFWPF unterstützt das .NET Framework 4.NET Framework 4-Sicherheitsframework Codezugriffssicherheit (Code Access Security, CAS)Code Access Security (CAS). supports the .NET Framework 4.NET Framework 4 security framework Codezugriffssicherheit (Code Access Security, CAS)Code Access Security (CAS). Dies bedeutet, dass in der Internetzone ausgeführter WPFWPF-Inhalt eingeschränkte Ausführungsberechtigungen hat.This means that WPFWPF content running in the internet zone has reduced execution permissions. "Loose XAML" (Seiten nicht kompilierten XAML-Codes, die beim Laden von einem XAML-Viewer interpretiert werden) und XAML-Browseranwendung (XBAP)XAML browser application (XBAP) werden normalerweise in dieser Internetzone ausgeführt und verwenden die gleiche Berechtigungsmenge."Loose XAML" (pages of noncompiled XAML interpreted at load time by a XAML viewer) and XAML-Browseranwendung (XBAP)XAML browser application (XBAP) are usually run in this internet zone and use the same permission set. Wenn XAML allerdings in eine voll vertrauenswürdige Anwendung geladen wird, hat es den gleichen Zugriff auf Systemressourcen wie die Hostanwendung.However, XAML loaded in to a fully trusted application has the same access to the system resources as the hosting application does. Weitere Informationen finden Sie unter WPF-Sicherheit mit teilweiser Vertrauenswürdigkeit.For more information, see WPF Partial Trust Security.

Laden von XAML aus codeLoading XAML from code

XAML kann zum Definieren der gesamten Benutzeroberfläche verwendet werden, aber manchmal ist es auch sinnvoll, nur einen Teil der Benutzeroberfläche in XAML zu definieren.XAML can be used to define all of the UI, but it is sometimes also appropriate to define just a piece of the UI in XAML. Diese Fähigkeit könnte man für eine teilweise Anpassungsfähigkeit durch den Benutzer verwenden, lokales Speichern von Informationen, die Verwendung von XAML zur Bereitstellung eines Geschäftsobjekts oder eine Vielzahl weiterer möglicher Szenarios.This capability could be used to enable partial customization, local storage of information, using XAML to provide a business object, or a variety of possible scenarios. Der Schlüssel für diese Szenarien ist die XamlReader Klasse und die zugehörige Load Methode.The key to these scenarios is the XamlReader class and its Load method. Als Eingabe dient eine XAML-Datei, und die Ausgabe ist ein Objekt, das die gesamte Laufzeitstruktur von Objekten darstellt, die über dieses Markup erstellt wurde.The input is a XAML file, and the output is an object that represents all of the run-time tree of objects that was created from that markup. Sie können dieses Objekt dann als Eigenschaft eines anderen, bereits in der Anwendung bestehenden Objektes einfügen.You then can insert the object to be a property of another object that already exists in the application. Solange die Eigenschaft eine geeignete Eigenschaft im Inhaltsmodell ist, die tatsächliche Anzeigefähigkeiten besitzt und die der Ausführungs-Engine meldet, dass in der Anwendung neue Inhalte hinzugefügt wurden, können Sie den Inhalt einer laufenden Anwendung sehr einfach durch Laden von externem XAML ändern.So long as the property is an appropriate property in the content model that has eventual display capabilities and that will notify the execution engine that new content has been added into the application, you can modify a running application's contents very easily by loading in XAML. Beachten Sie, dass aufgrund der offensichtlichen Sicherheitsimplikationen beim Laden von Dateien in laufende Anwendungen diese Funktion im Allgemeinen nur in voll vertrauenswürdigen Umgebungen verfügbar ist.Note that this capability is generally only available in full-trust applications, because of the obvious security implications of loading files into applications as they run.

AusblickWhat's next

Dieses Thema enthält eine grundlegende Einführung in Konzepte und Terminologie der XAML-Syntax, wie sie in WPF Anwendung finden.This topic provides a basic introduction to XAML syntax concepts and terminology as it applies to WPF. Weitere Informationen zu den hier verwendeten Begriffen finden Sie unter Ausführliche Erläuterung der XAML-Syntax.For more information about the terms used here, see XAML Syntax In Detail.

Wenn Sie dies noch nicht getan haben, versuchen Sie es mit die Übungen im Tutorial Exemplarische Vorgehensweise: Meine erste WPF-Desktopanwendung.If you have not already done this, try the exercises in the tutorial topic Walkthrough: My first WPF desktop application. Wenn Sie die im Tutorial beschriebene Markup-orientierte Anwendung erstellen, kann diese Übung helfen, viele der in diesem Thema beschriebenen Konzepte zu vertiefen.When you create the markup-centric application described by the tutorial, the exercise will help reinforce many of the concepts described in this topic.

WPFWPF verwendet ein bestimmtes Anwendungsmodell, das basierend auf den Application Klasse. uses a particular application model that is based on the Application class. Weitere Informationen finden Sie unter Übersicht über die Anwendungsverwaltung.For details, see Application Management Overview.

Unter Erstellen einer WPF-Anwendung erhalten Sie weitere Informationen zum Erstellen von XAML, einschließlich Anwendungen über die Befehlszeile und mit Microsoft Visual StudioMicrosoft Visual Studio.Building a WPF Application gives you more details about how to build XAML inclusive applications from the command line and with Microsoft Visual StudioMicrosoft Visual Studio.

Unter Übersicht über Abhängigkeitseigenschaften finden Sie weitere Informationen über die Vielseitigkeit der Eigenschaften in WPFWPF und das Konzept von Abhängigkeitseigenschaften.Dependency Properties Overview gives more information about the versatility of properties in WPFWPF, and introduces the concept of dependency properties.

Siehe auchSee also

Ausführliche Erläuterung der XAML-SyntaxXAML Syntax In Detail
XAML- und benutzerdefinierte Klassen für WPFXAML and Custom Classes for WPF
Sprachfunktionen des XAML-Namespace (x:)XAML Namespace (x:) Language Features
WPF-XAML-ErweiterungenWPF XAML Extensions
Übersicht über BasiselementeBase Elements Overview
Strukturen in WPFTrees in WPF