WPF-ArchitekturWPF Architecture

Dieses Thema enthält eine Einführung in die Windows Presentation Foundation (WPF)-Klassenhierarchie.This topic provides a guided tour of the Windows Presentation Foundation (WPF) class hierarchy. Es behandelt die meisten der wichtigsten Subsysteme von WPFWPF und beschreibt, wie sie interagieren.It covers most of the major subsystems of WPFWPF, and describes how they interact. Es werden auch einige der durch die Architekten von WPFWPF getroffenen Entscheidungen erläutert.It also details some of the choices made by the architects of WPFWPF.

System.ObjectSystem.Object

Das primäre WPFWPF-Programmiermodell wird mithilfe von verwaltetem Code verfügbar gemacht.The primary WPFWPF programming model is exposed through managed code. In der frühen Entwurfsphase von WPFWPF gab es einige Diskussionen darüber, wo die Linie zwischen den nicht verwalteten und den verwalteten Komponenten des Systems gezogen werden soll.Early in the design phase of WPFWPF there were a number of debates about where the line should be drawn between the managed components of the system and the unmanaged ones. Die CLR bietet eine Reihe von Features, die die Entwicklung produktiver und robuster machen (einschließlich Speicherverwaltung, Fehlerbehandlung, gängiges Typsystem usw.).The CLR provides a number of features that make development more productive and robust (including memory management, error handling, common type system, etc.) but they come at a cost.

Die Hauptkomponenten von WPFWPF sind in der folgenden Abbildung dargestellt.The major components of WPFWPF are illustrated in the figure below. Die roten Abschnitte des Diagramms (PresentationFramework, PresentationCore und Milcore) sind die wichtigsten Teile von WPFWPF.The red sections of the diagram (PresentationFramework, PresentationCore, and milcore) are the major code portions of WPFWPF. Von diesen ist nur eine Komponente nicht verwaltet – Milcore.Of these, only one is an unmanaged component – milcore. Milcore ist in nicht verwaltetem Code geschrieben, um eine enge Integration in DirectX zu ermöglichen.Milcore is written in unmanaged code in order to enable tight integration with DirectX. Die gesamte Anzeige in WPFWPF wird über die DirectX-Engine durchgeführt und ermöglicht eine effiziente Hardware-und Software Rendering.All display in WPFWPF is done through the DirectX engine, allowing for efficient hardware and software rendering. Ebenso erforderte WPFWPF genaue Kontrolle über den Speicher und die Ausführung.WPFWPF also required fine control over memory and execution. Die Kompositions-Engine in Milcore ist äußerst Leistungs sensibel und erfordert eine Vielzahl von Vorteilen der CLR, um die Leistung zu steigern.The composition engine in milcore is extremely performance sensitive, and required giving up many advantages of the CLR to gain performance.

Die Position von WPF innerhalb der .NET Framework.The position of WPF within the .NET Framework.

Die Kommunikation zwischen den verwalteten und nicht verwalteten Teilen von WPFWPF wird weiter unten in diesem Thema behandelt.Communication between the managed and unmanaged portions of WPFWPF is discussed later in this topic. Das restliche verwaltete Programmiermodell wird nachfolgend beschrieben.The remainder of the managed programming model is described below.

System.Threading.DispatcherObjectSystem.Threading.DispatcherObject

Die meisten Objekte in WPFWPF von DispatcherObjectabgeleitet, das die grundlegenden Konstrukte für die Handhabung von Parallelität und Threading bereitstellt.Most objects in WPFWPF derive from DispatcherObject, which provides the basic constructs for dealing with concurrency and threading. WPFWPF basiert auf einem vom Verteiler implementierten Nachrichtensystem.is based on a messaging system implemented by the dispatcher. Dies funktioniert sehr ähnlich wie das vertraute Win32Win32-Nachrichtensystem und tatsächlich verwendet der WPFWPF-Verteiler User32-Nachrichten für threadübergreifende Aufrufe.This works much like the familiar Win32Win32 message pump; in fact, the WPFWPF dispatcher uses User32 messages for performing cross thread calls.

Im Grunde gibt es zwei Kernkonzepte, die man bei der Diskussion über Parallelität in WPFWPF verstehen muss: den Verteiler und Thread-Affinität.There are really two core concepts to understand when discussing concurrency in WPFWPF – the dispatcher and thread affinity.

Während der Entwurfsphase von WPFWPF war es das Ziel, den Schritt zu einem einzigen Ausführungsthread in einem Nicht-Thread „affinierten“ Modell zu schaffen.During the design phase of WPFWPF, the goal was to move to a single thread of execution, but a non-thread "affinitized" model. Thread-Affinität findet dann statt, wenn eine Komponente die Identität des ausgeführten Threads verwendet, um einen irgendwie gearteten Zustand zu speichern.Thread affinity happens when a component uses the identity of the executing thread to store some type of state. Die häufigste Form dieser Vorgehensweise ist, den threadlokalen Speicher (TLS) zu verwenden, um einen Zustand zu speichern.The most common form of this is to use the thread local store (TLS) to store state. Thread-Affinität erfordert, dass jeder logische Ausführungsthread im Besitz von nur einem physischen Thread im Betriebssystem ist, was speicherintensiv werden kann.Thread affinity requires that each logical thread of execution be owned by only one physical thread in the operating system, which can become memory intensive. Letzten Endes wurde das WPF-Threadingmodell synchron mit dem bestehenden User32-Threadingmodell einzelner Ausführungsthread mit Threadaffinität gehalten.In the end, WPF’s threading model was kept in sync with the existing User32 threading model of single threaded execution with thread affinity. Der Hauptgrund dafür war Interoperabilität – Systeme wie OLE 2,0, die Zwischenablage und Internet Explorer erfordern die Ausführung einer einzelnen Thread Affinität (STA).The primary reason for this was interoperability – systems like OLE 2.0, the clipboard, and Internet Explorer all require single thread affinity (STA) execution.

Angesichts der Tatsache, dass Sie Objekte mit STA-Threading haben, benötigen Sie Möglichkeiten der Kommunikation zwischen Threads und der Überprüfung, dass Sie sich im richtigen Thread befinden.Given that you have objects with STA threading, you need a way to communicate between threads, and validate that you are on the correct thread. Genau dies ist die Aufgabe des Verteilers.Herein lies the role of the dispatcher. Der Verteiler ist ein Basis-Nachrichtensystem mit mehreren priorisierten Warteschlangen.The dispatcher is a basic message dispatching system, with multiple prioritized queues. Zu diesen Nachrichten gehören z.B. Rohdateneingabe-Benachrichtigungen (Maus bewegt), Framework-Funktionen (Layout) oder Benutzerbefehle (diese Methode ausführen).Examples of messages include raw input notifications (mouse moved), framework functions (layout), or user commands (execute this method). Durch Ableiten von DispatcherObjecterstellen Sie ein CLR-Objekt, das STA-Verhalten hat, und erhält zum Erstellungs Zeitpunkt einen Zeiger auf einen Verteiler.By deriving from DispatcherObject, you create a CLR object that has STA behavior, and will be given a pointer to a dispatcher at creation time.

System.Windows.DependencyObjectSystem.Windows.DependencyObject

Eine der primären Architekturstrategien bei der Konzeption von WPFWPF war die Bevorzugung von Eigenschaften über Methoden oder Ereignissen.One of the primary architectural philosophies used in building WPFWPF was a preference for properties over methods or events. Eigenschaften sind deklarativ und machen es einfacher, eine Absicht statt einer Aktion anzugeben.Properties are declarative and allow you to more easily specify intent instead of action. Dies bot auch Unterstützung für ein modell- oder datengesteuertes System zur Anzeige von Inhalten der Benutzeroberfläche.This also supported a model driven, or data driven, system for displaying user interface content. Diese Strategie hatte den beabsichtigten Effekt, mehr Eigenschaften zu schaffen, an die Sie anbinden können, um das Verhalten einer Anwendung besser zu steuern.This philosophy had the intended effect of creating more properties that you could bind to, in order to better control the behavior of an application.

Um mehr über die Eigenschaften des Systems zu verfügen, ist ein umfangreicheres Eigenschaften System als das, was die CLR bereitstellt.In order to have more of the system driven by properties, a richer property system than what the CLR provides was needed. Ein einfaches Beispiel für diese Vielfalt sind die Änderungsbenachrichtigungen.A simple example of this richness is change notifications. Um eine zwei-Wege-Bindung zu ermöglichen, müssen beide Seiten der Bindung Änderungsbenachrichtigungen unterstützen.In order to enable two way binding, you need both sides of the bind to support change notification. Um an Eigenschaftswerte ein bestimmtes Verhalten zu binden, müssen Sie benachrichtigt werden, wenn sich der Eigenschaftswert ändert.In order to have behavior tied to property values, you need to be notified when the property value changes. Das Microsoft .NET Framework verfügt über eine Schnittstelle ( INotifyPropertyChange), die einem Objekt das Veröffentlichen von Änderungs Benachrichtigungen ermöglicht, aber es ist optional.The Microsoft .NET Framework has an interface, INotifyPropertyChange, which allows an object to publish change notifications, however it is optional.

WPFWPF bietet ein umfangreicheres Eigenschaften System, das vom DependencyObject-Typ abgeleitet wird.provides a richer property system, derived from the DependencyObject type. Dieses Eigenschaftensystem ist in der Tat ein Eigenschaftensystem der „Abhängigkeiten” in dem Sinne, dass es Abhängigkeiten zwischen Eigenschaftsausdrücken nachverfolgt und Eigenschaftswerte automatisch neu überprüft, wenn sich die Abhängigkeiten ändern.The property system is truly a "dependency" property system in that it tracks dependencies between property expressions and automatically revalidates property values when dependencies change. Wenn Sie z. b. über eine Eigenschaft verfügen, die (z. b. FontSize) erbt, wird das System automatisch aktualisiert, wenn sich die-Eigenschaft für ein übergeordnetes Element eines Elements ändert, das den Wert erbt.For example, if you have a property that inherits (like FontSize), the system is automatically updated if the property changes on a parent of an element that inherits the value.

Das WPFWPF-Eigenschaftensystem fußt auf dem Konzept eines Eigenschaftsausdrucks.The foundation of the WPFWPF property system is the concept of a property expression. In dieser ersten Version von WPFWPF ist das Eigenschaftensystem geschlossen, und die Ausdrücke werden alle als Teil des Frameworks bereitgestellt.In this first release of WPFWPF, the property expression system is closed, and the expressions are all provided as part of the framework. Ausdrücke sind der Grund, warum im Eigenschaftensystem keine Datenbindungen, Stile oder Vererbungen hartcodiert sind, sondern stattdessen von später gebildeten Ebenen innerhalb des Frameworks bereitgestellt werden.Expressions are why the property system doesn’t have data binding, styling, or inheritance hard coded, but rather provided by later layers within the framework.

Das Eigenschaftensystem ermöglicht auch verstreutes Speichern von Eigenschaftswerten.The property system also provides for sparse storage of property values. Da Objekte Dutzende (wenn nicht gar Hunderte) von Eigenschaften haben können, und die meisten Werte im Standardzustand sind (geerbt, von Stilen festgelegt usw.), benötigt nicht jede Instanz eines Objekts die vollständige Last aller seiner definierten Eigenschaften.Because objects can have dozens (if not hundreds) of properties, and most of the values are in their default state (inherited, set by styles, etc.), not every instance of an object needs to have the full weight of every property defined on it.

Das abschließende neue Feature des Eigenschaftensystems ist das Konzept der angefügten Eigenschaften.The final new feature of the property system is the notion of attached properties. WPFWPF-Elemente basieren auf dem Prinzip der Komposition und Wiederverwendung von Komponenten aufgebaut.elements are built on the principle of composition and component reuse. Häufig ist es der Fall, dass einige enthaltende Elemente (z. b. ein Grid Layoutelemente) zusätzliche Daten für untergeordnete Elemente benötigen, um das Verhalten zu steuern (z. b. Zeilen-/SpalteninformationenIt is often the case that some containing element (like a Grid layout element) needs additional data on child elements to control its behavior (like the Row/Column information). Statt alle diese Eigenschaften jedem Element zuzuordnen, darf jedes beliebige Objekt Eigenschaftsdefinitionen für andere Objekte bereitstellen.Instead of associating all of these properties with every element, any object is allowed to provide property definitions for any other object. Dies ähnelt den „Expando”-Funktionen von JavaScript.This is similar to the "expando" features of JavaScript.

System.Windows.Media.VisualSystem.Windows.Media.Visual

Ist ein System einmal definiert, besteht der nächste Schritt darin, Pixel auf den Bildschirm zu zeichnen.With a system defined, the next step is getting pixels drawn to the screen. Die Visual-Klasse ermöglicht das Erstellen einer Struktur von visuellen Objekten, von denen jede optional Zeichnungs Anweisungen und Metadaten zum Renderingvorgang enthält (clipping, Transformation usw.).The Visual class provides for building a tree of visual objects, each optionally containing drawing instructions and metadata about how to render those instructions (clipping, transformation, etc.). Visual ist äußerst einfach und flexibel, sodass die meisten Features keine öffentliche API-Präsenz aufweisen und stark auf geschützte Rückruf Funktionen basieren.Visual is designed to be extremely lightweight and flexible, so most of the features have no public API exposure and rely heavily on protected callback functions.

Visual ist wirklich der Einstiegspunkt für das WPFWPF Kompositions System.Visual is really the entry point to the WPFWPF composition system. Visual ist der Verbindungspunkt zwischen diesen beiden Subsystemen, der verwalteten API und der nicht verwalteten Milcore.Visual is the point of connection between these two subsystems, the managed API and the unmanaged milcore.

WPFWPF zeigt Daten an, indem es die vom nicht verwalteten Milcore verwalteten Datenstrukturen durchläuft.displays data by traversing the unmanaged data structures managed by the milcore. Diese Strukturen, die man Kompositionsknoten nennt, stellen eine hierarchische Anzeige-Struktur mit Rendering-Anweisungen in jedem Knoten dar.These structures, called composition nodes, represent a hierarchical display tree with rendering instructions at each node. Auf diese Struktur, die auf der rechten Seite der folgenden Abbildung dargestellt ist, kann nur über ein Nachrichtenprotokoll zugegriffen werden.This tree, illustrated on the right hand side of the figure below, is only accessible through a messaging protocol.

Wenn Sie WPFWPFprogrammieren, erstellen Sie Visual Elemente und abgeleitete Typen, die intern über dieses Messaging Protokoll mit der Kompositionsstruktur kommunizieren.When programming WPFWPF, you create Visual elements, and derived types, which internally communicate to the composition tree through this messaging protocol. Jede Visual in WPFWPF kann einen, keinen oder mehrere Kompositions Knoten erstellen.Each Visual in WPFWPF may create one, none, or several composition nodes.

Der Windows Presentation Foundation visuelle Struktur.The Windows Presentation Foundation Visual Tree.

Es gibt hier ein sehr wichtiges architektonisches Detail zu beachten: die gesamte Struktur von visuellen Objekten und Zeichenanweisungen wird zwischengespeichert.There is a very important architectural detail to notice here – the entire tree of visuals and drawing instructions is cached. Im Grafik-Vokabular heißt dies, WPFWPF verwendet ein Retained-Rendering-System, was so viel wie „zurückbehaltenes Rendering” bedeutet.In graphics terms, WPFWPF uses a retained rendering system. Dies ermöglicht es dem System, mit hohen Aktualisierungsraten neu zu zeichnen, ohne dass das Kompositionssystem dies aufgrund von Rückrufen auf Benutzercode blockiert.This enables the system to repaint at high refresh rates without the composition system blocking on callbacks to user code. Dies verhindert eine scheinbar nicht reagierende Anwendung.This helps prevent the appearance of an unresponsive application.

Ein weiteres wichtiges Detail, das man dem Diagramm eher nicht entnehmen kann, ist wie das System die Komposition tatsächlich durchführt.Another important detail that isn’t really noticeable in the diagram is how the system actually performs composition.

In User32 und GDI arbeitet das System mit einem Clippingsystem im unmittelbaren Modus.In User32 and GDI, the system works on an immediate mode clipping system. Wenn eine Komponente gerendert werden muss, erstellt das System eine Clippinggrenze, außerhalb derer die Komponente keine Pixel berühren darf. Danach wird die Komponente aufgefordert, Pixel in dieses Feld zu zeichnen.When a component needs to be rendered, the system establishes a clipping bounds outside of which the component isn’t allowed to touch the pixels, and then the component is asked to paint pixels in that box. Dieses System funktioniert sehr gut auf Systemen mit beschränktem Arbeitsspeicher, weil man bei jeder Änderung immer nur die betroffene Komponente anfassen muss – es tragen nie zwei Komponenten zur Farbe eines einzelnen Pixels bei.This system works very well in memory constrained systems because when something changes you only have to touch the affected component – no two components ever contribute to the color of a single pixel.

WPFWPF verwendet als Zeichenmodell einen „Maleralgorithmus”.uses a "painter's algorithm" painting model. Dies bedeutet, dass, statt jede Komponente zu beschneiden, diese stattdessen aufgefordert wird, von hinten nach vorne in die Anzeige zu rendern.This means that instead of clipping each component, each component is asked to render from the back to the front of the display. Dadurch kann jede Komponente die Anzeige der vorherigen Komponente übermalen.This allows each component to paint over the previous component's display. Der Vorteil dieses Modells ist, dass Sie komplexe, teilweise transparente Formen schaffen können.The advantage of this model is that you can have complex, partially transparent shapes. Mit der modernen Grafikhardware von heute ist dieses Modell relativ schnell (was bei der Erstellung von User32/GDI nicht der Fall war).With today’s modern graphics hardware, this model is relatively fast (which wasn’t the case when User32/ GDI were created).

Wie bereits erwähnt, ist eine zentrale Strategie von WPFWPF der Schritt zu einem deklarativen, „eigenschaftenzentrierten” Programmiermodell.As mentioned previously, a core philosophy of WPFWPF is to move to a more declarative, "property centric" model of programming. Im visuellen System zeigt sich dies an einigen interessanten Stellen.In the visual system, this shows up in a couple of interesting places.

Wenn man sich zunächst das Grafiksystem mit seinem zurückbehaltenden Modus vor Augen führt, ist dies wirklich ein großer Schritt weg von einem imperativen Modell vom Typ „DrawLine/DrawLine”, hin zu einem datenorientierten Modell: „new Line() / new Line()/”.First, if you think about the retained mode graphic system, this is really moving away from an imperative DrawLine/DrawLine type model, to a data oriented model – new Line()/new Line(). Dieser Schritt hin zu datengesteuertem Rendering ermöglicht es, komplexe Operationen in den Zeichenanweisungen mithilfe von Eigenschaften auszudrücken.This move to data driven rendering allows complex operations on the drawing instructions to be expressed using properties. Die Typen, die von Drawing abgeleitet werden, sind im Grunde das Objektmodell für das Rendering.The types deriving from Drawing are effectively the object model for rendering.

Wenn Sie sich zum Zweiten das Animationssystem anschauen, sehen Sie, dass es fast vollständig deklarativ ist.Second, if you evaluate the animation system, you'll see that it is almost completely declarative. Statt einen Entwickler zu benötigen, der die nächste Position oder Farbe berechnet, können Sie Animationen als eine Reihe von Eigenschaften für ein Animationsobjekt ausdrücken.Instead of requiring a developer to compute the next location, or next color, you can express animations as a set of properties on an animation object. Diese Animationen können dann die Absicht des Entwicklers oder Designers ausdrücken (bewege diese Schaltfläche innerhalb von 5 Sekunden von hier nach dort), und das System ermittelt die effizienteste Methode dieses zu bewerkstelligen.These animations can then express the intent of the developer or designer (move this button from here to there in 5 seconds), and the system can determine the most efficient way to accomplish that.

System.Windows.UIElementSystem.Windows.UIElement

UIElement definiert Kern Subsysteme, einschließlich Layout, Eingabe und Ereignisse.UIElement defines core subsystems including Layout, Input, and Events.

Layout ist ein Kernkonzept in WPFWPF.Layout is a core concept in WPFWPF. In vielen Systemen gibt es entweder einen festen Satz von Layout-Modellen (HTML unterstützt drei Modelle für das Layout: fließend, absolut und Tabellen) oder keine (User32 unterstützt wirklich nur die absolute Positionierung).In many systems there is either a fixed set of layout models (HTML supports three models for layout; flow, absolute, and tables) or no model for layout (User32 really only supports absolute positioning). WPFWPF begann mit der Annahme, dass Entwickler und Designer ein flexibles, erweiterbares Layout-Modell möchten, das durch Eigenschaftswerte an Stelle von imperativer Logik gesteuert werden kann.started with the assumption that developers and designers wanted a flexible, extensible layout model, which could be driven by property values rather than imperative logic. Auf UIElement Ebene wird der grundlegende Vertrag für das Layout eingeführt – ein zweistufiges Modell mit Measure und Arrange übergibt.At the UIElement level, the basic contract for layout is introduced – a two phase model with Measure and Arrange passes.

mit Measure kann eine Komponente ermitteln, wie viel Größe Sie benötigen.Measure allows a component to determine how much size it would like to take. Dabei handelt es sich um eine separate Phase von Arrange, da ein übergeordnetes Element ein untergeordnetes Element anfordert, mehrere Male zu messen, um die optimale Position und Größe zu ermitteln.This is a separate phase from Arrange because there are many situations where a parent element will ask a child to measure several times to determine its optimal position and size. Die Tatsache, dass übergeordnete Elemente von untergeordneten Elementen Messungen anfordern, zeigt eine andere wichtige Strategie von WPFWPF – die Größe dem Inhalt anzupassen.The fact that parent elements ask child elements to measure demonstrates another key philosophy of WPFWPF – size to content. Alle Steuerelemente im WPFWPF unterstützen die Fähigkeit, ihre Größe dem Inhalts entsprechend anzupassen.All controls in WPFWPF support the ability to size to the natural size of their content. Dies erleichtert die Lokalisierung ungemein und lässt ein dynamische Layout von Elementen zu, die Ihre Größe ändern.This makes localization much easier, and allows for dynamic layout of elements as things resize. In der Arrange Phase kann ein übergeordnetes Element die endgültige Größe der einzelnen untergeordneten Elemente positionieren und ermitteln.The Arrange phase allows a parent to position and determine the final size of each child.

Häufig wird viel Zeit für die Ausgabe Seite von WPFWPFVisual und verknüpften Objekten aufgewendet.A lot of time is often spent talking about the output side of WPFWPFVisual and related objects. Es gibt jedoch auch eine enorme Anzahl an Innovationen auf der Eingabeseite.However there is a tremendous amount of innovation on the input side as well. Die wahrscheinlich wichtigste Änderung des Eingabemodells für WPFWPF ist das konsistente Modell, Eingabeereignisse durch das System weiterzuleiten.Probably the most fundamental change in the input model for WPFWPF is the consistent model by which input events are routed through the system.

Eingabedaten starten als Signal in einem Kernelmodus-Gerätetreiber und werden durch einen komplexen Prozess, der den Windows-Kernel und User32 einbezieht, an den korrekten Prozess und Thread weitergeleitet.Input originates as a signal on a kernel mode device driver and gets routed to the correct process and thread through an intricate process involving the Windows kernel and User32. Sobald die zur Eingabe gehörende User32-Nachricht an WPFWPF weitergeleitet ist, wird sie in eine WPFWPF Rohdaten-Eingabenachricht konvertiert und an den Verteiler gesendet.Once the User32 message corresponding to the input is routed to WPFWPF, it is converted into a WPFWPF raw input message and sent to the dispatcher. In WPFWPF können Rohdaten-Eingabeereignisse in mehrere tatsächliche Ereignisse konvertiert werden, was die Implementierung von Funktionen wie "MouseEnter" auf einer niedrigen Systemebene mit garantierter Übermittlung ermöglicht.WPFWPF allows for raw input events to be converted to multiple actual events, enabling features like "MouseEnter" to be implemented at a low level of the system with guaranteed delivery.

Jedes Eingabeereignis wird in mindestens zwei Ereignisse konvertiert: ein „Vorschau”-Ereignis und das tatsächliche Ereignis.Each input event is converted to at least two events – a "preview" event and the actual event. Allen Ereignisse in WPFWPF ist gemein, dass sie durch die Elementstruktur geleitet werden.All events in WPFWPF have a notion of routing through the element tree. Ereignisse werden als "Blase" bezeichnet, wenn Sie von einem Ziel nach oben in der Struktur durchlaufen und als "Tunnel" bezeichnet werden, wenn Sie am Stamm beginnen und zu einem Ziel übertragen werden.Events are said to "bubble" if they traverse from a target up the tree to the root, and are said to "tunnel" if they start at the root and traverse down to a target. Eingabe-Vorschauereignisse tunneln, was jedem Element der Struktur die Möglichkeit gibt, etwas herauszufiltern oder eine Aktion auf das Ereignis durchzuführen.Input preview events tunnel, enabling any element in the tree an opportunity to filter or take action on the event. Das tatsächliche (Nicht-Vorschau-) Ereignis bubblet anschließend vom Ziel aufwärts zum Stamm.The regular (non-preview) events then bubble from the target up to the root.

Diese Auftrennung zwischen tunnelnder und bubblender Phase sorgt dafür, dass die Implementierung von Funktionen wie Tastenkombinationen auch in einer gemischten Umgebung konsistent funktioniert.This split between the tunnel and bubble phase makes implementation of features like keyboard accelerators work in a consistent fashion in a composite world. In User32 würden Sie Zugriffstasten mithilfe einer einzelnen globalen Tabelle implementieren, die alle zu unterstützenden Zugriffstasten enthält (z.B. STRG + N für "Neu").In User32 you would implement keyboard accelerators by having a single global table containing all the accelerators you wanted to support (Ctrl+N mapping to "New"). Sie würden im Verteiler Ihrer Anwendung TranslateAccelerator aufrufen, welches die eingehende Nachrichten in User32 untersuchen und bestimmen würde, welche davon registrierten Zugriffstaste entsprechen.In the dispatcher for your application you would call TranslateAccelerator which would sniff the input messages in User32 and determine if any matched a registered accelerator. In WPFWPF würde dies nicht funktionieren, da das System vollständig "komponierbar" ist – jedes Element darf jede beliebige Zugriffstaste behandeln und verwenden.In WPFWPF this wouldn’t work because the system is fully "composable" – any element can handle and use any keyboard accelerator. Dieses zweiphasige Eingabemodell ermöglicht es Komponenten, ihre eigene „TranslateAccelerator“-Komponente zu implementieren.Having this two phase model for input allows components to implement their own "TranslateAccelerator".

Um dies noch einen Schritt weiter zu tun, führt UIElement auch das Konzept von commandbindungen ein.To take this one step further, UIElement also introduces the notion of CommandBindings. Das WPFWPF-Befehlssystem ermöglicht Entwicklern das Definieren von Funktionen in Bezug auf einen Befehls Endpunkt – etwas, das ICommandimplementiert.The WPFWPF command system allows developers to define functionality in terms of a command end point – something that implements ICommand. Befehlsbindungen ermöglichen es Elementen, eine Zuordnung zwischen einer Eingabegeste (STRG + N) und einem Befehl (Neu) zu definieren.Command bindings enable an element to define a mapping between an input gesture (Ctrl+N) and a command (New). Sowohl die Eingabegesten als auch die Befehlsdefinitionen sind erweiterbar und können zum Zeitpunkt der Verwendung miteinander verknüpft werden.Both the input gestures and command definitions are extensible, and can be wired together at usage time. Dies macht es für den Endbenutzer extrem einfach, z.B. die Zuordnung von Tastenkombinationen anzupassen, die innerhalb einer Anwendung verwendet werden soll.This makes it trivial, for example, to allow an end user to customize the key bindings that they want to use within an application.

Was dieses Thema betrifft, lag der Schwerpunkt auf den „Kern-”Features von WPFWPF – Features, die in der PresentationCore-Assembly implementiert wurden.To this point in the topic, "core" features of WPFWPF – features implemented in the PresentationCore assembly, have been the focus. Beim Erstellen WPFWPFwar eine saubere Trennung zwischen grundlegenden Teilen (z. b. der Vertrag für das Layout mit Measure und anordnen) und frameworkez (z. b. die Implementierung eines bestimmten Layouts wie Grid) das gewünschte Ergebnis.When building WPFWPF, a clean separation between foundational pieces (like the contract for layout with Measure and Arrange) and framework pieces (like the implementation of a specific layout like Grid) was the desired outcome. Es war das Ziel, externen Entwicklern einen Erweiterungspunkt tief im Stapel anzubieten, der ihnen erlauben würde, bei Bedarf ihre eigenen Frameworks zu erstellen.The goal was to provide an extensibility point low in the stack that would allow external developers to create their own frameworks if needed.

System.Windows.FrameworkElementSystem.Windows.FrameworkElement

FrameworkElement kann auf zwei verschiedene Arten betrachtet werden.FrameworkElement can be looked at in two different ways. Zum Einen führt es eine Reihe von Richtlinien und Anpassungen auf Subsysteme ein, die auf den unteren Ebenen von WPFWPF eingeführt wurden.It introduces a set of policies and customizations on the subsystems introduced in lower layers of WPFWPF. Zum Anderen führt es auch eine Reihe neuer Subsysteme ein.It also introduces a set of new subsystems.

Die von FrameworkElement eingeführte primäre Richtlinie ist um das Anwendungs Layout herum.The primary policy introduced by FrameworkElement is around application layout. FrameworkElement baut auf dem grundlegenden Layoutvertrag auf, der durch UIElement eingeführt wurde, und fügt das Konzept eines Layoutslots hinzu, das es Entwicklern ermöglicht, einen konsistenten Satz von Eigenschaften orientierter Layoutsemantik zu haben.FrameworkElement builds on the basic layout contract introduced by UIElement and adds the notion of a layout "slot" that makes it easier for layout authors to have a consistent set of property driven layout semantics. Eigenschaften wie HorizontalAlignment, VerticalAlignment, MinWidthund Margin (um nur einige zu nennen) weisen alle Komponenten, die von FrameworkElement konsistenten Verhalten in Layoutcontainern abgeleitet sind, zu.Properties like HorizontalAlignment, VerticalAlignment, MinWidth, and Margin (to name a few) give all components derived from FrameworkElement consistent behavior inside of layout containers.

FrameworkElement bietet außerdem eine einfachere API-Verfügbarkeit für viele Features, die in den kernschichten WPFWPFgefunden werden.FrameworkElement also provides easier API exposure to many features found in the core layers of WPFWPF. FrameworkElement ermöglicht beispielsweise den direkten Zugriff auf Animationen über die BeginStoryboard-Methode.For example, FrameworkElement provides direct access to animation through the BeginStoryboard method. Eine Storyboard bietet eine Möglichkeit, mehrere Animationen mit einem Satz von Eigenschaften zu erstellen.A Storyboard provides a way to script multiple animations against a set of properties.

Die zwei wichtigsten Dinge, die FrameworkElement eingeführt, sind die Datenbindung und Stile.The two most critical things that FrameworkElement introduces are data binding and styles.

Das Daten Bindungs Subsystem in WPFWPF sollte allen Personen, die Windows FormsWindows Forms oder ASP.net zum Erstellen einer Anwendungs Benutzeroberfläche (User Interface, UI)user interface (UI)verwendet haben, relativ vertraut sein.The data binding subsystem in WPFWPF should be relatively familiar to anyone that has used Windows FormsWindows Forms or ASP.NET for creating an application Benutzeroberfläche (User Interface, UI)user interface (UI). In jedem dieser Systeme besteht eine einfache Möglichkeit, um auszudrücken, dass Sie eine oder mehrere Eigenschaften aus einem angegebenen Element an Daten binden möchten.In each of these systems, there is a simple way to express that you want one or more properties from a given element to be bound to a piece of data. WPFWPF bietet vollständige Unterstützung für Eigenschaftenbindung, Transformation und Listenbindung.has full support for property binding, transformation, and list binding.

Eines der interessantesten Features der Datenbindung in WPFWPF ist die Einführung von Datenvorlagen.One of the most interesting features of data binding in WPFWPF is the introduction of data templates. Mit Datenvorlagen können Sie deklarativ angeben, wie Daten visualisiert werden sollen.Data templates allow you to declaratively specify how a piece of data should be visualized. Statt eine benutzerdefinierte Benutzeroberfläche zu erzeugen, die an Daten gebunden werden kann, können Sie stattdessen das Problem umzukehren, und die Daten selbst die Anzeige bestimmen lassen, die erstellt werden soll.Instead of creating a custom user interface that can be bound to data, you can instead turn the problem around and let the data determine the display that will be created.

Formatierung ist im Grunde eine schlanke Form der Datenbindung.Styling is really a lightweight form of data binding. Mithilfe von Formatierungen kann eine Reihe von Eigenschaften aus einer freigegebenen Definition an eine oder mehrere Instanzen eines Elements gebunden werden.Using styling you can bind a set of properties from a shared definition to one or more instances of an element. Stile werden auf ein Element entweder durch einen expliziten Verweis (durch Festlegen der Style-Eigenschaft) oder implizit durch Zuordnen eines Stils zu einem CLR-Typ des Elements angewendet.Styles get applied to an element either by explicit reference (by setting the Style property) or implicitly by associating a style with the CLR type of the element.

System.Windows.Controls.ControlSystem.Windows.Controls.Control

Das wichtigste Feature von Control ist das Vorlagensystem.Control’s most significant feature is templating. Da das Kompositionssystem von WPF ein zurückbehaltendes Renderingsystem ist, erlaubt das Vorlagensystem eine Renderingbeschreibung in einer parametrisierten, deklarativen Art und Weise.If you think about WPF’s composition system as a retained mode rendering system, templating allows a control to describe its rendering in a parameterized, declarative manner. Ein ControlTemplate ist wirklich nichts anderes als ein Skript zum Erstellen eines Satzes von untergeordneten Elementen, mit Bindungen zu Eigenschaften, die vom Steuerelement angeboten werden.A ControlTemplate is really nothing more than a script to create a set of child elements, with bindings to properties offered by the control.

Control bietet eine Reihe von vordefinierten Eigenschaften, Foreground, Background, Padding, um nur einige zu benennen. diese Vorlagen Autoren können dann verwenden, um die Anzeige eines Steuer Elements anzupassen.Control provides a set of stock properties, Foreground, Background, Padding, to name a few, which template authors can then use to customize the display of a control. Die Implementierung eines Steuerelements stellt ein Datenmodell und ein Interaktionsmodell bereit.The implementation of a control provides a data model and interaction model. Das Interaktionsmodell definiert einen Satz von Befehlen (z.B. „Schließen” für Fenster) und Bindungen an Eingabegesten (z.B. ein Klick auf das rote X in der oberen Ecke des Fensters).The interaction model defines a set of commands (like Close for a window) and bindings to input gestures (like clicking the red X in the upper corner of the window). Das Datenmodell bietet eine Reihe von Eigenschaften, um entweder das Interaktionsmodell oder die Anzeige anzupassen (durch die Vorlage festgelegt).The data model provides a set of properties to either customize the interaction model or customize the display (determined by the template).

Diese Auftrennung zwischen Datenmodell (Eigenschaften), Interaktionsmodell (Befehle und Ereignisse) und Anzeigemodell (Vorlagen) ermöglicht die vollständige Anpassung von Aussehen und Verhalten eines Steuerelements.This split between the data model (properties), interaction model (commands and events), and display model (templates) enables complete customization of a control’s look and behavior.

Ein allgemeiner Aspekt des Datenmodells von Steuerelementen ist das Inhaltsmodell.A common aspect of the data model of controls is the content model. Wenn Sie ein Steuerelement wie Buttonbetrachten, sehen Sie, dass es über eine Eigenschaft mit dem Namen "Content" vom Typ "Object" verfügt.If you look at a control like Button, you will see that it has a property named "Content" of type Object. In Windows FormsWindows Forms und ASP.net wäre diese Eigenschaft normalerweise eine Zeichenfolge, die den Typ des Inhalts einschränkt, den Sie in eine Schaltfläche einfügen können.In Windows FormsWindows Forms and ASP.NET, this property would typically be a string – however that limits the type of content you can put in a button. Der Inhalt einer Schaltfläche kann entweder eine einfache Zeichenfolge, ein komplexes Datenobjekt oder eine komplette Elementstruktur sein.Content for a button can either be a simple string, a complex data object, or an entire element tree. Bei einem Datenobjekt wird die Anzeige mithilfe einer Datenvorlage erstellt.In the case of a data object, the data template is used to construct a display.

ZusammenfassungSummary

WPFWPF wurde entworfen, um Ihnen die Erstellung dynamischer, datengesteuerter Präsentationssysteme zu ermöglichen.is designed to allow you to create dynamic, data driven presentation systems. Jeder Teil des Systems dient zum Erstellen von Objekten über Eigenschaftensätze, die das Verhalten steuern.Every part of the system is designed to create objects through property sets that drive behavior. Datenbindungen sind ein grundlegender Teil des Systems und auf jeder Ebene integriert.Data binding is a fundamental part of the system, and is integrated at every layer.

Herkömmliche Anwendungen erzeugen eine Anzeige und binden anschließend Daten an.Traditional applications create a display and then bind to some data. In WPFWPF ist die Steuerung, ist jeder Aspekt der Anzeige, durch irgendeine Art von Datenbindung generiert.In WPFWPF, everything about the control, every aspect of the display, is generated by some type of data binding. Der Text in einer Schaltfläche wird angezeigt, indem ein zusammengesetztes Steuerelement in der Schaltfläche erstellt und seine Anzeige an die Content-Eigenschaft der Schaltfläche gebunden wird.The text found inside a button is displayed by creating a composed control inside of the button and binding its display to the button’s content property.

Wenn Sie beginnen, WPFWPF-basierte Anwendungen zu entwickeln, sollte Ihnen alles sehr vertraut vorkommen.When you begin developing WPFWPF based applications, it should feel very familiar. Sie können Eigenschaften festlegen, Objekte und Daten Bindungen auf die gleiche Weise wie Windows FormsWindows Forms oder ASP.NET verwenden.You can set properties, use objects, and data bind in much the same way that you can using Windows FormsWindows Forms or ASP.NET. Wenn Sie dann tiefer in die Architektur von WPFWPF eintauchen, werden Sie entdecken, dass es Ihnen die Möglichkeit bietet, wesentlich vielfältigere Anwendungen zu erstellen, deren grundlegende Steuerungsmechanismen über Daten stattfinden.With a deeper investigation into the architecture of WPFWPF, you'll find that the possibility exists for creating much richer applications that fundamentally treat data as the core driver of the application.

Siehe auchSee also