Was ist Windows Presentation Foundation?What is Windows Presentation Foundation

Willkommen beim Desktopleitfaden zu Windows Presentation Foundation (WPF), einem Benutzeroberflächenframework, mit dem Desktopclientanwendungen für Windows erstellt werden können.Welcome to the Desktop Guide for Windows Presentation Foundation (WPF), a UI framework that creates desktop client applications for Windows. Die WPF-Entwicklungsplattform unterstützt eine breite Palette an Anwendungsentwicklungsfeatures, darunter ein Anwendungsmodell, Steuerelemente, Grafik und Datenbindung.The WPF development platform supports a broad set of application development features, including an application model, controls, graphics, and data binding. WPF verwendet XAML (Extensible Application Markup Language), um ein deklaratives Modell für die Anwendungsprogrammierung bereitzustellen.WPF uses Extensible Application Markup Language (XAML) to provide a declarative model for application programming.

Wichtig

Der Desktopleitfaden ist in Bearbeitung.The Desktop Guide documentation is under construction.

Es gibt zwei Implementierungen von WPF:There are two implementations of WPF:

  1. Die Open-Source-Implementierung, die auf GitHub gehostet wird.The open-source implementation hosted on GitHub. Diese Version wird unter .NET Core 3.0 ausgeführt.This version runs on .NET Core 3.0. Der visuelle WPF-Designer für XAML erfordert mindestens Visual Studio 2019 Version 16.3.The WPF Visual Designer for XAML requires, at a minimum, Visual Studio 2019 version 16.3.

  2. Die .NET Framework-Implementierung, die von Visual Studio 2019 und Visual Studio 2017 unterstützt wird.The .NET Framework implementation that's supported by Visual Studio 2019 and Visual Studio 2017.

Dieser Desktopleitfaden bezieht sich auf .NET Core 3.0 und WPF.This Desktop Guide is written for .NET Core 3.0 and WPF. Weitere Informationen zur vorhandenen Dokumentation für WPF mit .NET Framework finden Sie unter Framework „Windows Presentation Foundation“.For more information about the existing documentation for WPF with the .NET Framework, see Framework Windows Presentation Foundation.

XAMLXAML

Bei XAML handelt es sich um eine deklarative XML-basierte Sprache, die von WPF beispielsweise zum Definieren von Ressourcen oder Benutzeroberflächenelementen verwendet wird.XAML is a declarative XML-based language that WPF uses for things such as defining resources or UI elements. Elemente, die in XAML definiert werden, stellen die Instanziierung von Objekten aus einer Assembly dar.Elements defined in XAML represent the instantiation of objects from an assembly. XAML unterscheidet sich von den meisten anderen Markupsprachen, die zur Laufzeit interpretiert werden, ohne dass eine direkte Bindung an ein unterstützendes Typsystem besteht.XAML is unlike most other markup languages, which are interpreted at runtime without a direct tie to a backing type system.

Das folgende Beispiel zeigt, wie Sie eine Schaltfläche als Teil einer Benutzeroberfläche erstellen können.The following example shows how you would create a button as part of a UI. Dieses Beispiel soll Ihnen zeigen, wie XAML ein Objekt darstellt, wobei Button der Typ und Content eine Eigenschaft ist.This example is intended to give you an idea of how XAML represents an object, where Button is the type and Content is a property.

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

XAML-ErweiterungenXAML extensions

XAML stellt Syntax für Markuperweiterungen bereit.XAML provides syntax for markup extensions. Markuperweiterungen können verwendet werden, um Werte für Eigenschaften in Attributform, Eigenschaft-Element-Form oder in beiden Formen bereitzustellen.Markup extensions can be used to provide values for properties in attribute form, property-element form, or both.

Der XAML-Code oben hat z. B. eine Schaltfläche definiert, bei der der sichtbare Inhalt auf die Literalzeichenfolge "Click Me!" festgelegt wird, aber der Inhalt kann stattdessen von einer unterstützten Markuperweiterung festgelegt werden.For example, the previous XAML code defined a button with the visible content set to the literal string "Click Me!", but the content can be instead set by a supported markup extension. Eine Markuperweiterung wird mit öffnenden und schließenden geschweiften Klammern ({ }) definiert.A markup extension is defined with opening and closing curly braces { }. Das Zeichenfolgentoken, das unmittelbar auf die öffnende geschweifte Klammer folgt, bestimmt den Typ der Markuperweiterung.The type of markup extension is then identified by the string token immediately following the opening curly brace.

<StackPanel>
    <Button Content="{MarkupType}" />
</StackPanel>

WPF bietet verschiedene Markuperweiterungen für XAML, z. B. {Binding} für Datenbindung.WPF provides different markup extensions for XAML such as {Binding} for data binding.

Weitere Informationen finden Sie unter Markuperweiterungen und WPF-XAML.For more information, see Markup Extensions and WPF XAML.

EigenschaftensystemProperty system

WPF bietet eine Reihe von Diensten, die zum Erweitern der Funktionalität einer Eigenschaft eines Typs verwendet werden können.WPF provides a set of services that can be used to extend the functionality of a type's property. Zusammen werden diese Dienste als WPF-Eigenschaftensystem bezeichnet.Collectively, these services are referred to as the WPF property system. Eine Eigenschaft, die von der WPF-Eigenschaft unterstützt wird, wird als Abhängigkeitseigenschaft bezeichnet.A property that is backed by the WPF property system is known as a dependency property.

Abhängigkeitseigenschaften erweitern die Eigenschaftsfunktionalität durch Bereitstellen des DependencyProperty-Typs, der eine Eigenschaft unterstützt.Dependency properties extend property functionality by providing the DependencyProperty type that backs a property. Der Typ der Abhängigkeitseigenschaft ist eine alternative Implementierung des Standardmusters, bei dem die Eigenschaft durch ein privates Feld unterstützt wird.The dependency property type is an alternative implementation of the standard pattern of backing the property with a private field.

AbhängigkeitseigenschaftDependency property

In WPF werden Abhängigkeitseigenschaften in der Regel als .NET-Standardeigenschaften bereitgestellt.In WPF, dependency properties are typically exposed as standard .NET properties. Grundsätzlich können Sie direkt mit diesen Eigenschaften direkt interagieren, ohne zu wissen, dass sie als Abhängigkeitseigenschaft implementiert werden.At a basic level, you could interact with these properties directly and never know that they're implemented as a dependency property.

Abhängigkeitseigenschaften dienen der Berechnung des Werts einer Eigenschaft anhand des Werts von anderen Eingaben.The purpose of dependency properties is to provide a way to compute the value of a property based on the value of other inputs. Diese anderen Eingaben können Systemeigenschaften (z. B. Designs und Benutzereinstellungen) oder eine Just-in-Time-Eigenschaft aus der Datenbindung und Animationen umfassen.These other inputs might include system properties such as themes and user preferences, or just-in-time property from data binding and animations.

Eine Abhängigkeitseigenschaft kann implementiert werden, um Validierung, Standardwerte und Rückrufe bereitzustellen, die Änderungen an anderen Eigenschaften überwachen.A dependency property can be implemented to provide validation, default values, and callbacks that monitor changes to other properties. Abgeleitete Klassen können auch einige spezifische Eigenschaften einer vorhandenen Eigenschaft ändern, indem sie die Metadaten der Abhängigkeitseigenschaften überschreiben, anstatt eine neue Eigenschaft zu erstellen oder eine vorhandene Eigenschaft zu überschreiben.Derived classes can also change some specific characteristics of an existing property by overriding dependency property metadata, rather than creating a new property or overriding an existing property.

AbhängigkeitsobjektDependency object

Ein anderer Typ, der wichtig für das WPF-Eigenschaftensystem ist, ist DependencyObject.Another type that is key to the WPF property system is the DependencyObject. Dieser Typ definiert die Basisklasse, die eine Abhängigkeitseigenschaft registrieren und besitzen kann.This type defines the base class that can register and own a dependency property. Die Methoden GetValue und SetValue stellen die unterstützende Implementierung der Abhängigkeitseigenschaft für die Abhängigkeitsobjektinstanz bereit.The GetValue and SetValue methods provide the backing implementation of the dependency property for the dependency object instance.

Das folgende Beispiel zeigt ein Abhängigkeitsobjekt, das einen einzelnen Abhängigkeitseigenschaftbezeichner namens ValueProperty definiert.The following example shows a dependency object that defines a single dependency property identifier named ValueProperty. Die Abhängigkeitseigenschaft wird mit der .NET-Eigenschaft Value erstellt.The dependency property is created with the Value .NET property.

public class TextField: DependencyObject
{
    public static readonly DependencyProperty ValueProperty =
        DependencyProperty.Register("Value", typeof(string), typeof(TextField), new PropertyMetadata(""));

    public string Value
    {
        get { return (string)GetValue(ValueProperty); }
        set { SetValue(ValueProperty, value); }
    }
}

Die Abhängigkeitseigenschaft wird als statischer Member eines Abhängigkeitsobjekttyps definiert, z. B. mit TextField im Beispiel oben.The dependency property is defined as a static member of a dependency object type, such as TextField in example above. Die Abhängigkeitseigenschaft muss beim Abhängigkeitsobjekt registriert werden.The dependency property must be registered with the dependency object.

Die Value-Eigenschaft im Beispiel oben umschließt die Abhängigkeitseigenschaft und stellt das .NET-Eigenschaftenstandardmuster bereit, das Sie wahrscheinlich kennen.The Value property in the example above wraps the dependency property, providing the standard .NET property pattern you're probably used to.

EreignisseEvents

WPF bietet ein Ereignissystem, das auf den .NET CLR-Ereignissen (Common Language Runtime) aufsetzt, mit denen Sie vertraut sind.WPF provides an eventing system that is layered on top of the .NET common language runtime (CLR) events you're familiar with. Diese WPF-Ereignisse werden als Routingereignisse bezeichnet.These WPF events are called routed events.

Ein Routingereignis ist ein CLR-Ereignis, das von einer Instanz der RoutedEvent-Klasse unterstützt und im WPF-Ereignissystem registriert wird.A routed event is a CLR event that is backed by an instance of the RoutedEvent class and registered with the WPF event system. Die aus der Ereignisregistrierung abgerufene RoutedEvent-Instanz bleibt in der Regel als ein public static readonly-Feldmember der Klasse erhalten, die das Routingereignis registriert und somit dessen Besitzer ist.The RoutedEvent instance obtained from event registration is typically retained as a public static readonly field member of the class that registers, and thus owns the routed event. Die Verbindung mit dem identisch benannten CLR-Ereignis (das manchmal auch als Wrapper-Ereignis bezeichnet wird) erfolgt durch das Außerkraftsetzen der add- und remove-Implementierungen für das CLR-Ereignis.The connection to the identically named CLR event (which is sometimes termed the wrapper event) is accomplished by overriding the add and remove implementations for the CLR event. Der Unterstützungs- und Verbindungsmechanismus des Routingereignisses ist vom Konzept her genauso wie eine Abhängigkeitseigenschaft eine CLR-Eigenschaft ist, die von der DependencyProperty-Klasse unterstützt und im WPF-Eigenschaftensystem registriert wird.The routed event backing and connection mechanism is conceptually similar to how a dependency property is a CLR property that is backed by the DependencyProperty class and registered with the WPF property system.

Der Hauptvorteil des Routingereignissystems besteht darin, dass Ereignisse in der Steuerelementstruktur aufsteigen, um nach einem Handler zu suchten.The main advantage of the routed event system is that events are bubbled up the control element tree looking for a handler. Da WPF z. B. ein umfangreiches Inhaltsmodell aufweist, legen Sie ein Bildsteuerelement als Inhalt eines Schaltflächensteuerelements fest.For example, because WPF has a rich content model, you set an image control as the content of a button control. Wenn mit der Maus auf das Bildsteuerelement geklickt wird, würden Sie erwarten, dass es die Mausereignisse verarbeitet und somit die Treffertests unterbricht, die dazu führen, dass eine Schaltfläche das Click-Ereignis aufruft.When the mouse is clicked on the image control, you would expect it to consume the mouse events, and thus break the hit-tests that cause a button to invoke the Click event. In einem herkömmlichen CLR-Ereignismodell würden Sie diese Einschränkung umgehen, indem Sie denselben Handler an das Bild und die Schaltfläche anfügen.In a traditional CLR eventing model, you would work around this limitation by attaching the same handler to both the image and the button. Mit dem Routingereignissystem steigen die Mausereignisse, die für das Bildsteuerelement aufgerufen werden (z. B. seine Auswahl), jedoch zum übergeordneten Schaltflächensteuerelement auf.But with the routed event system, the mouse events invoked on the image control (such as selecting it) bubble up to the parent button control.

DatenbindungData binding

WPF-Datenbindung bietet für Anwendungen eine einfache und konsistente Möglichkeit, Daten darzustellen und mit ihnen zu interagieren.WPF data binding provides a simple and consistent way for applications to present and interact with data. Elemente können an Daten aus unterschiedlichen Typen von Datenquellen in Form von CLR-Objekten (Common Language Runtime) und XML gebunden werden.Elements can be bound to data from different types of data sources in the form of common language runtime (CLR) objects and XML. WPF bietet außerdem einen Mechanismus für die Übertragung von Daten durch Drag & Drop-Vorgänge.WPF also provides a mechanism for the transfer of data through drag-and-drop operations.

Datenbindung ist der Vorgang, bei dem eine Verbindung zwischen der Benutzeroberfläche der Anwendung und der Geschäftslogik eingerichtet wird.Data binding is the process that establishes a connection between the application UI and business logic. Wenn die Bindung ordnungsgemäße Einstellungen aufweist und die Daten die richtigen Benachrichtigungen bereitstellen, ändern sich die an die Daten gebundenen Elemente automatisch bei jeder Änderung des Werts der Daten, sodass die Änderungen entsprechend wiedergespiegelt werden.If the binding has the correct settings and the data provides the proper notifications, then, when the data changes its value, the elements that bound to the data reflect changes automatically. Datenbindung kann auch bedeuten, dass bei einer Änderung der äußeren Darstellung von Daten in einem Element die zugrunde liegenden Daten automatisch aktualisiert werden, um die Änderung widerzuspiegeln.Data binding can also mean that if an outer representation of the data in an element changes, then the underlying data is automatically updated to reflect the change. Wenn der Benutzer beispielsweise den Wert in einem TextBox-Element bearbeitet, wird der zugrunde liegende Datenwert automatisch aktualisiert, um diese Änderung widerzuspiegeln.For example, if the user edits the value in a TextBox element, the underlying data value is automatically updated to reflect that change.

Datenbindung kann in XAML über die {Binding}-Markuperweiterung konfiguriert werden.Data binding can be configured in XAML through the {Binding} markup extension. Im folgenden Beispiel wird die Bindung an die ButtonText-Eigenschaft eines Datenobjekts veranschaulicht.The following example demonstrates binding to a data object's ButtonText property. Wenn diese Bindung fehlschlägt, wird der Wert Click Me! verwendet.If that binding fails, the value of Click Me! is used.

<StackPanel>
    <Button Content="{Binding ButtonText, FallbackValue='Click Me!'}" />
</StackPanel>

Weitere Informationen finden Sie unter Übersicht über Datenbindung.For more information, see Data binding overview.

BenutzeroberflächenkomponentenUI components

WPF stellt viele der gängigen Komponenten der Benutzeroberfläche zur Verfügung, die in nahezu jeder Windows-Anwendung zum Einsatz kommen, beispielsweise Button, Label, TextBox, Menu und ListBox.WPF provides many of the common UI components that are used in almost every Windows application, such as Button, Label, TextBox, Menu, and ListBox. In der Vergangenheit wurden diese Objekte als Steuerelemente bezeichnet.Historically, these objects have been referred to as controls. Während im WPF-SDK weiterhin der Begriff „Steuerelement“ (Control) für jede Klasse verwendet wird, die ein sichtbares Objekt in einer Anwendung darstellt, ist es wichtig zu beachten, dass eine Klasse nicht notwendigerweise von der Control-Klasse erben muss, um eine sichtbare Präsenz zu haben.While the WPF SDK continues to use the term control to loosely mean any class that represents a visible object in an application, it's important to note that a class doesn't need to inherit from the Control class to have a visible presence. Klassen, die von der Control-Klasse erben, enthalten ein ControlTemplate-Objekt, das es dem Benutzer eines Steuerelements ermöglicht, die Darstellung des Steuerelements radikal zu ändern, ohne eine neue Unterklasse erstellen zu müssen.Classes that inherit from the Control class contain a ControlTemplate, which allows the consumer of a control to radically change the control's appearance without having to create a new subclass.

Stile und VorlagenStyles and templates

Zum Erstellen von Stilen und Vorlagen in WPF stehen eine Reihe von Funktionen (Stile, Vorlagen, Trigger und Storyboards) zur Verfügung, die es einer Anwendung, einem Dokument oder dem Entwickler einer Benutzeroberfläche ermöglichen, visuell ansprechende Effekte zu erstellen und ein einheitliches Erscheinungsbild des Produkts zu erzielen.WPF styling and templating refer to a suite of features (styles, templates, triggers, and storyboards) that allow an application, document, or UI designer to create visually compelling applications and to standardize on a particular look for their product.

Ein weiteres Feature des WPF-Stilmodells ist die Trennung von Präsentation und Logik, d. h. Designer können an der Darstellung einer Anwendung mit XAML arbeiten, während Entwickler an anderer Stelle an der Programmierlogik arbeiten.Another feature of the WPF styling model is the separation of presentation and logic, which means designers can work on the appearance of an application with XAML while developers work on the programming logic elsewhere.

Darüber hinaus ist es wichtig, die Ressourcen zu kennen, die die Wiederverwendung von Stilen und Vorlagen ermöglichen.In addition, it's important to understand resources, which are what enable styles and templates to be reused.

Weitere Informationen finden Sie unter Stile und Vorlagen.For more information, see Styles and templates.

RessourcenResources

WPF-Ressourcen sind Objekte, die an unterschiedlichen Stellen in der Anwendung erneut verwendet werden können.WPF resources are objects that can be reused in different places in your application. Beispiele für Ressourcen sind Stile, Vorlagen und Farbpinsel.Examples of resources include styles, templates, and color brushes. Ressourcen können sowohl im Code als auch im XAML-Format definiert und referenziert werden.Resources can be both defined and referenced in code and in XAML format.

Jedes Element auf Frameworkebene (FrameworkElement oder FrameworkContentElement) verfügt über eine Resources-Eigenschaft. Hierbei handelt es sich um einen ResourceDictionary-Typ, der definierte Ressourcen enthält.Every framework-level element (FrameworkElement or FrameworkContentElement) has a Resources property (which is a ResourceDictionary type) that contains defined resources. Da alle-Elemente von einem Element auf Frameworkebene erben, können alle Elemente Ressourcen definieren.Since all elements inherit from a framework-level element, all elements can define resources. Meistens werden Ressourcen jedoch für ein Stammelement eines XAML-Dokuments definiert.It's most common, however, to define resources on a root element of a XAML document.

Nächste SchritteNext steps