Architettura WPFWPF Architecture

In questo argomento viene fornita una presentazione guidata della gerarchia di classi Windows Presentation Foundation (WPF).This topic provides a guided tour of the Windows Presentation Foundation (WPF) class hierarchy. Viene illustrata la maggior parte dei principali sottosistemi di WPF e viene descritta la modalità di interazione.It covers most of the major subsystems of WPF, and describes how they interact. Vengono inoltre illustrate alcune delle scelte effettuate dagli architetti di WPF.It also details some of the choices made by the architects of WPF.

System.ObjectSystem.Object

Il modello di programmazione WPF primario viene esposto tramite codice gestito.The primary WPF programming model is exposed through managed code. Nelle fasi iniziali della fase di progettazione di WPF sono state illustrate alcune discussioni sulla posizione in cui deve essere disegnata la linea tra i componenti gestiti del sistema e quelli non gestiti.Early in the design phase of WPF there were a number of debates about where the line should be drawn between the managed components of the system and the unmanaged ones. CLR fornisce una serie di funzionalità che rendono lo sviluppo più produttivo e affidabile (inclusa la gestione della memoria, la gestione degli errori, Common Type System e così via), ma hanno un costo.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.

I componenti principali di WPF sono illustrati nella figura seguente.The major components of WPF are illustrated in the figure below. Le sezioni rosse del diagramma (PresentationFramework, PresentationCore e milcore) sono le parti principali del codice di WPF.The red sections of the diagram (PresentationFramework, PresentationCore, and milcore) are the major code portions of WPF. Di queste, solo milcore è un componente non gestito.Of these, only one is an unmanaged component – milcore. Milcore è scritto in codice non gestito per consentire una stretta integrazione con DirectX.Milcore is written in unmanaged code in order to enable tight integration with DirectX. Tutte le visualizzazioni in WPF vengono eseguite tramite il motore DirectX, consentendo un efficiente rendering dell'hardware e del software.All display in WPF is done through the DirectX engine, allowing for efficient hardware and software rendering. WPF necessitava anche di un controllo accurato sulla memoria e sull'esecuzione.WPF also required fine control over memory and execution. Il motore di composizione in milcore è estremamente sensibile alle prestazioni ed è necessario rinunciare a molti vantaggi di CLR per ottenere prestazioni ottimali.The composition engine in milcore is extremely performance sensitive, and required giving up many advantages of the CLR to gain performance.

Posizione di WPF in .NET FrameworkThe position of WPF within the .NET Framework.

La comunicazione tra le parti gestite e non gestite di WPF viene discussa più avanti in questo argomento.Communication between the managed and unmanaged portions of WPF is discussed later in this topic. Il resto del modello di programmazione gestito viene descritto di seguito.The remainder of the managed programming model is described below.

System.Threading.DispatcherObjectSystem.Threading.DispatcherObject

La maggior parte degli oggetti in WPF deriva da DispatcherObject , che fornisce i costrutti di base per la gestione della concorrenza e del threading.Most objects in WPF derive from DispatcherObject, which provides the basic constructs for dealing with concurrency and threading. WPF si basa su un sistema di messaggistica implementato dal dispatcher.WPF is based on a messaging system implemented by the dispatcher. Funziona in modo molto simile a quello del messaggio Win32 familiare; in realtà, il dispatcher WPF USA messaggi User32 per l'esecuzione di chiamate cross-thread.This works much like the familiar Win32 message pump; in fact, the WPF dispatcher uses User32 messages for performing cross thread calls.

Esistono due concetti principali da comprendere quando si discute la concorrenza in WPF, ovvero il dispatcher e l'affinità di thread.There are really two core concepts to understand when discussing concurrency in WPF – the dispatcher and thread affinity.

Durante la fase di progettazione di WPF, lo scopo era quello di passare a un singolo thread di esecuzione, ma a un modello "creata un'affinità" non thread.During the design phase of WPF, the goal was to move to a single thread of execution, but a non-thread "affinitized" model. L'affinità di thread si verifica quando un componente utilizza l'identità del thread in esecuzione per archiviare un tipo di stato.Thread affinity happens when a component uses the identity of the executing thread to store some type of state. Nella forma più comune, per archiviare lo stato viene utilizzata l'archiviazione locale di thread (TLS).The most common form of this is to use the thread local store (TLS) to store state. L'affinità di thread richiede che ciascun thread di esecuzione logico appartenga a un solo thread fisico del sistema operativo, che può richiedere un elevato consumo di memoria.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. Alla fine, il modello di threading di WPF è stato tenuto in sincronia con il modello di threading User32 esistente dell'esecuzione a thread singolo con affinità di thread.In the end, WPF’s threading model was kept in sync with the existing User32 threading model of single threaded execution with thread affinity. Il motivo principale di questa interoperabilità è che i sistemi, ad esempio OLE 2,0, gli appunti e Internet Explorer, richiedono l'esecuzione di affinità a thread singolo (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.

Disponendo di oggetti con threading STA, è necessaria una modalità di comunicazione tra thread e di conferma di utilizzo del thread corretto.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. Qui si colloca il ruolo del dispatcher.Herein lies the role of the dispatcher. Il dispatcher è un sistema di base di invio di messaggi con più code in ordine di priorità.The dispatcher is a basic message dispatching system, with multiple prioritized queues. Gli esempi di messaggi includono le notifiche di input non elaborato (spostamenti del mouse), le funzionalità del framework (layout) o i comandi utente (esecuzione di metodi).Examples of messages include raw input notifications (mouse moved), framework functions (layout), or user commands (execute this method). Tramite la derivazione da DispatcherObject viene creato un oggetto CLR con un comportamento sta e a un dispatcher viene assegnato un puntatore al momento della creazione.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

Una delle principali filosofie dell'architettura utilizzate nella creazione di WPF era una preferenza per le proprietà di metodi o eventi.One of the primary architectural philosophies used in building WPF was a preference for properties over methods or events. Le proprietà sono dichiarative e consentono di specificare più facilmente lo scopo anziché l'azione.Properties are declarative and allow you to more easily specify intent instead of action. In tal modo veniva anche supportato un sistema basato sui modelli o sui dati per la visualizzazione dei contenuti dell'interfaccia utente.This also supported a model driven, or data driven, system for displaying user interface content. Lo scopo di tale approccio era di creare un maggior numero di proprietà con cui stabilire l'associazione per poter controllare meglio il comportamento di un'applicazione.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.

Per avere un maggior numero di sistemi basati sulle proprietà, è necessario un sistema di proprietà più completo rispetto a quello fornito da CLR.In order to have more of the system driven by properties, a richer property system than what the CLR provides was needed. Un semplice esempio è rappresentato dalle notifiche di modifica.A simple example of this richness is change notifications. Per abilitare l'associazione bidirezionale, è necessario che entrambi i lati supportino la notifica di modifica.In order to enable two way binding, you need both sides of the bind to support change notification. Per associare il comportamento a valori di proprietà, è necessario ricevere una notifica quando tale valore viene modificato.In order to have behavior tied to property values, you need to be notified when the property value changes. Il Framework Microsoft .NET dispone di un'interfaccia, INotifyPropertyChange, che consente a un oggetto di pubblicare notifiche di modifica, ma è facoltativo.The Microsoft .NET Framework has an interface, INotifyPropertyChange, which allows an object to publish change notifications, however it is optional.

WPF fornisce un sistema di proprietà più completo, derivato dal DependencyObject tipo.WPF provides a richer property system, derived from the DependencyObject type. Il sistema di proprietà è effettivamente un sistema di proprietà delle "dipendenze" nel senso che tiene traccia delle dipendenze tra espressioni di proprietà e riconvalida automaticamente i valori delle proprietà quando tali dipendenze vengono modificate.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. Se, ad esempio, si dispone di una proprietà che eredita (come FontSize ), il sistema viene aggiornato automaticamente se la proprietà viene modificata in un elemento padre di un elemento che eredita il valore.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.

La base del sistema di proprietà WPF è il concetto di espressione di proprietà.The foundation of the WPF property system is the concept of a property expression. Nella prima versione di WPF, il sistema di espressioni di proprietà viene chiuso e tutte le espressioni vengono fornite come parte del Framework.In this first release of WPF, the property expression system is closed, and the expressions are all provided as part of the framework. Le espressioni rappresentano il motivo per cui il sistema di proprietà non dispone di associazione dati, stili o ereditarietà hardcoded forniti invece dai livelli successivi all'interno del framework.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.

Il sistema di proprietà, inoltre, presenta possibilità limitate di archiviazione per i valori di proprietà.The property system also provides for sparse storage of property values. Poiché gli oggetti hanno decine, se non centinaia, di proprietà e la maggior parte dei valori si trova nel relativo stato predefinito (ereditato, impostato per stile e così via), non tutte le istanze di un oggetto devono avere il peso di ciascuna proprietà in esso definita.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.

La nuova funzionalità finale del sistema di proprietà è la nozione di proprietà associate.The final new feature of the property system is the notion of attached properties. Gli elementi WPF sono basati sul principio della composizione e sul riutilizzo dei componenti.WPF elements are built on the principle of composition and component reuse. Spesso è necessario che alcuni elementi che lo contengono (ad esempio un Grid elemento di layout) necessitino di dati aggiuntivi sugli elementi figlio per controllarne il comportamento, ad esempio le informazioni sulla riga o sulla colonna.It 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). Anziché associare tutte queste proprietà a ciascun elemento, un oggetto può fornire le definizioni delle proprietà per qualsiasi altro oggetto,Instead of associating all of these properties with every element, any object is allowed to provide property definitions for any other object. come avviene per le funzionalità "expando" di JavaScript.This is similar to the "expando" features of JavaScript.

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

Dopo avere definito un sistema, è necessario ottenere pixel disegnati sullo schermo.With a system defined, the next step is getting pixels drawn to the screen. La Visual classe fornisce per la compilazione di una struttura ad albero di oggetti visivi, ognuno dei quali contiene facoltativamente istruzioni di disegno e metadati su come eseguire il rendering di tali istruzioni (ritaglio, trasformazione e così via).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 è progettato per essere estremamente leggero e flessibile, quindi la maggior parte delle funzionalità non hanno un'esposizione API pubblica e si basano molto sulle funzioni di callback protette.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 rappresenta effettivamente il punto di ingresso del sistema di composizione WPF.Visual is really the entry point to the WPF composition system. Visual è il punto di connessione tra questi due sottosistemi, l'API gestita e il milcore non gestito.Visual is the point of connection between these two subsystems, the managed API and the unmanaged milcore.

WPF Visualizza i dati attraversando le strutture di dati non gestite gestite da milcore.WPF displays data by traversing the unmanaged data structures managed by the milcore. Queste strutture, denominate nodi di composizione, rappresentano una struttura di visualizzazione gerarchica ad albero con istruzioni di rendering in ciascun nodo.These structures, called composition nodes, represent a hierarchical display tree with rendering instructions at each node. La struttura ad albero, illustrata a destra nella figura riportata di seguito, è accessibile solo mediante un protocollo di messaggistica.This tree, illustrated on the right hand side of the figure below, is only accessible through a messaging protocol.

Quando si programma WPF, vengono creati Visual elementi e tipi derivati che comunicano internamente all'albero della composizione tramite questo protocollo di messaggistica.When programming WPF, you create Visual elements, and derived types, which internally communicate to the composition tree through this messaging protocol. Ogni Visual in WPF può creare uno, nessuno o più nodi di composizione.Each Visual in WPF may create one, none, or several composition nodes.

Struttura ad albero visuale di Windows Presentation FoundationThe Windows Presentation Foundation Visual Tree.

In questo caso va notato un dettaglio molto importante relativo all'architettura: l'intera struttura ad albero degli elementi visivi e delle istruzioni di disegno è memorizzata nella cache.There is a very important architectural detail to notice here – the entire tree of visuals and drawing instructions is cached. Nei termini grafici, WPF usa un sistema di rendering mantenuto.In graphics terms, WPF uses a retained rendering system. Ciò fornisce al sistema elevate frequenze di aggiornamento senza che il sistema di composizione si blocchi sui callback al codice utenteThis enables the system to repaint at high refresh rates without the composition system blocking on callbacks to user code. e consente di impedire la visualizzazione di applicazioni che non rispondono.This helps prevent the appearance of an unresponsive application.

Un altro dettaglio importante, non facilmente individuabile nel diagramma, è il modo in cui il sistema esegue effettivamente la composizione.Another important detail that isn’t really noticeable in the diagram is how the system actually performs composition.

In User32 e GDI il sistema funziona in un sistema di ritaglio in modalità immediata.In User32 and GDI, the system works on an immediate mode clipping system. Quando è necessario eseguire il rendering di un componente, il sistema stabilisce un limite di ritaglio al di fuori del quale il componente non può toccare i pixel; successivamente, viene chiesto al componente di disegnare i pixel in tale casella.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. Questo sistema funziona molto bene nei sistemi con memoria limitata poiché quando vengono apportate modifiche basta intervenire solo sul componente interessato. Non sono mai richiesti due componenti per il colore di un singolo pixel.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.

WPF usa un modello di disegno "algoritmo del pittore".WPF uses a "painter's algorithm" painting model. Ciò significa che anziché ritagliare ogni componente, viene richiesto il rendering di ciascun componente dallo sfondo al primo piano della visualizzazione.This means that instead of clipping each component, each component is asked to render from the back to the front of the display. In tal modo ciascun componente viene disegnato sulla visualizzazione del componente precedente.This allows each component to paint over the previous component's display. Il vantaggio di questo modello è la possibilità di avere forme complesse, parzialmente trasparenti.The advantage of this model is that you can have complex, partially transparent shapes. Con l'attuale hardware grafico moderno, questo modello è relativamente veloce, che non era il caso in cui User32/GDI fosse stato creato.With today’s modern graphics hardware, this model is relatively fast (which wasn’t the case when User32/ GDI were created).

Come indicato in precedenza, una filosofia di base di WPF consiste nel passare a un modello di programmazione più dichiarativo "incentrato sulle proprietà".As mentioned previously, a core philosophy of WPF is to move to a more declarative, "property centric" model of programming. Nel sistema visuale questo è evidente in un paio di punti interessanti.In the visual system, this shows up in a couple of interesting places.

Innanzitutto, se si pensa al sistema grafico in modalità memorizzata, si nota un deciso allontanamento da un modello imperativo di tipo DrawLine/DrawLine verso un modello orientato ai dati di tipo 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(). Questo spostamento verso il rendering basato sui dati consente operazioni complesse sulle istruzioni di disegno da esprimere utilizzando le proprietà.This move to data driven rendering allows complex operations on the drawing instructions to be expressed using properties. I tipi che derivano da Drawing sono in effetti il modello a oggetti per il rendering.The types deriving from Drawing are effectively the object model for rendering.

In secondo luogo, se si esamina il sistema di animazione appare evidente che è quasi completamente dichiarativo.Second, if you evaluate the animation system, you'll see that it is almost completely declarative. Anziché richiedere a uno sviluppatore di calcolare la posizione o il colore successivo, è possibile esprimere le animazioni come un set di proprietà su un oggetto di animazione.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. Le animazioni possono quindi esprimere l'intenzione dello sviluppatore o del progettista (spostare questo pulsante da questa a quella posizione in 5 secondi) e il sistema può stabilire il modo più efficace per raggiungere tale scopo.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 definisce sottosistemi di base, inclusi layout, input ed eventi.UIElement defines core subsystems including Layout, Input, and Events.

Il layout è un concetto di base di WPF.Layout is a core concept in WPF. In molti sistemi è presente un insieme fisso di modelli di layout (HTML supporta tre modelli di layout: flusso, assoluto e tabelle) oppure non è presente alcun modello di layout (User32 supporta effettivamente solo il posizionamento assoluto).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). WPF ha iniziato con il presupposto che gli sviluppatori e i progettisti volevano un modello di layout flessibile ed estendibile, che poteva essere basato su valori di proprietà anziché su una logica imperativa.WPF 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. Al UIElement livello, viene introdotto il contratto di base per il layout, ovvero un modello a due fasi con Measure e Arrange passa.At the UIElement level, the basic contract for layout is introduced – a two phase model with Measure and Arrange passes.

Measure consente a un componente di determinare la quantità di dimensioni che si desidera eseguire.Measure allows a component to determine how much size it would like to take. Si tratta di una fase separata da Arrange perché esistono molte situazioni in cui un elemento padre chiede a un figlio di misurare più volte per determinare la posizione e le dimensioni ottimali.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. Il fatto che gli elementi padre chiedano agli elementi figlio di misurare dimostrano un'altra filosofia chiave di WPF, ovvero le dimensioni del contenuto.The fact that parent elements ask child elements to measure demonstrates another key philosophy of WPF – size to content. Tutti i controlli in WPF supportano la possibilità di ridimensionare le dimensioni naturali del contenuto.All controls in WPF support the ability to size to the natural size of their content. Tutto ciò semplifica il processo di localizzazione e consente il layout dinamico degli elementi quando gli oggetti vengono ridimensionati.This makes localization much easier, and allows for dynamic layout of elements as things resize. La Arrange fase consente a un elemento padre di posizionare e determinare le dimensioni finali di ogni elemento figlio.The Arrange phase allows a parent to position and determine the final size of each child.

Molto tempo è spesso dedicato a parlare del lato di output di WPF, Visual oltre che degli oggetti correlati.A lot of time is often spent talking about the output side of WPF – Visual and related objects. Esiste, tuttavia, una straordinaria quantità di innovazione anche sul lato input.However there is a tremendous amount of innovation on the input side as well. Probabilmente la modifica più importante nel modello di input per WPF è il modello coerente in base al quale gli eventi di input vengono instradati attraverso il sistema.Probably the most fundamental change in the input model for WPF is the consistent model by which input events are routed through the system.

L'input come segnale proviene da un driver di dispositivo in modalità kernel e viene indirizzato verso il processo e il thread corretti mediante un complicato processo che interessa il kernel di Windows e User32.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. Una volta che il messaggio User32 corrispondente all'input viene indirizzato a WPF, viene convertito in un messaggio di input non elaborato WPF e inviato al dispatcher.Once the User32 message corresponding to the input is routed to WPF, it is converted into a WPF raw input message and sent to the dispatcher. WPF consente la conversione di eventi di input non elaborati in più eventi effettivi, consentendo l'implementazione di funzionalità come "MouseEnter" a un livello basso del sistema con recapito garantito.WPF 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.

Ciascun evento di input viene convertito in almeno due eventi: un evento in "anteprima" e l'evento effettivo.Each input event is converted to at least two events – a "preview" event and the actual event. Tutti gli eventi in WPF hanno una nozione di routing nell'albero degli elementi.All events in WPF have a notion of routing through the element tree. Gli eventi vengono detti "bolle" se passano da una destinazione verso l'alto nell'albero alla radice e vengono detti "tunnel" se iniziano alla radice e passano a una destinazione.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. Gli eventi di input in anteprima effettuano il tunneling consentendo a qualsiasi elemento della struttura ad albero di filtrare o svolgere un'azione sull'evento.Input preview events tunnel, enabling any element in the tree an opportunity to filter or take action on the event. Gli eventi regolari (non in anteprima) vengono propagati dalla destinazione fino alla radice.The regular (non-preview) events then bubble from the target up to the root.

Questa suddivisione tra fase di tunneling e fase di bubbling consente di implementare funzionalità, quali i tasti di scelta rapida, in modo coerente in un contesto composito.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 i tasti di scelta rapida vengono implementati con una sola tabella globale che contiene tutti i tasti da supportare (mapping di Ctrl+N su "Nuovo").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"). Nel dispatcher dell'applicazione viene chiamato TranslateAccelerator che rileva la presenza dei messaggi di input in User32 e stabilisce se esiste una corrispondenza con un tasto di scelta rapida registrato.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 WPF questa operazione non funzionerebbe perché il sistema è completamente "componibile", qualsiasi elemento può gestire e utilizzare qualsiasi tasto di scelta rapida.In WPF this wouldn’t work because the system is fully "composable" – any element can handle and use any keyboard accelerator. Questo modello a due fasi per l'input consente ai componenti di implementare il proprio "TranslateAccelerator".Having this two phase model for input allows components to implement their own "TranslateAccelerator".

Per eseguire ulteriormente questo passaggio, UIElement introduce anche il concetto di CommandBindings.To take this one step further, UIElement also introduces the notion of CommandBindings. Il sistema di comandi WPF consente agli sviluppatori di definire le funzionalità in termini di un punto finale del comando, ovvero un elemento che implementa ICommand .The WPF command system allows developers to define functionality in terms of a command end point – something that implements ICommand. Le associazioni di comandi consentono a un elemento di definire un mapping tra un movimento di input (Ctrl+N) e un comando (Nuovo).Command bindings enable an element to define a mapping between an input gesture (Ctrl+N) and a command (New). I movimenti di input e le definizioni dei comandi sono estendibili e possono essere collegati al momento dell'utilizzo.Both the input gestures and command definitions are extensible, and can be wired together at usage time. In tal modo, ad esempio, è possibile consentire a un utente finale di personalizzare le combinazioni di tasti da utilizzare in un'applicazione.This makes it trivial, for example, to allow an end user to customize the key bindings that they want to use within an application.

Fino a questo punto nell'argomento, le funzionalità di base di WPF, ovvero le funzionalità implementate nell'assembly PresentationCore, hanno avuto lo stato attivo.To this point in the topic, "core" features of WPF – features implemented in the PresentationCore assembly, have been the focus. Quando si compila WPF, è stata ottenuta una netta separazione tra le parti fondamentali (ad esempio il contratto per il layout con misura e disposizione) e le parti del Framework (come l'implementazione di un layout specifico come Grid ).When building WPF, 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. Lo scopo era quello di fornire un punto di estendibilità basso nello stack per consentire agli sviluppatori esterni di creare i propri framework, se necessario.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 può essere analizzato in due modi diversi.FrameworkElement can be looked at in two different ways. Introduce un set di criteri e personalizzazioni nei sottosistemi introdotti in livelli inferiori di WPF.It introduces a set of policies and customizations on the subsystems introduced in lower layers of WPF. e dall'altro un insieme di nuovi sottosistemi.It also introduces a set of new subsystems.

Il criterio principale introdotto da FrameworkElement è relativo al layout dell'applicazione.The primary policy introduced by FrameworkElement is around application layout. FrameworkElement si basa sul contratto di layout di base introdotto da UIElement e aggiunge la nozione di "slot" del layout che rende più semplice per gli autori di layout avere un set coerente di semantica di layout basata su Proprietà.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. Le proprietà come HorizontalAlignment , VerticalAlignment , MinWidth e Margin (per citarne alcune) forniscono tutti i componenti derivati dal FrameworkElement comportamento coerente all'interno dei contenitori di layout.Properties like HorizontalAlignment, VerticalAlignment, MinWidth, and Margin (to name a few) give all components derived from FrameworkElement consistent behavior inside of layout containers.

FrameworkElement offre anche un'esposizione più semplice delle API a molte funzionalità disponibili nei livelli principali di WPF.FrameworkElement also provides easier API exposure to many features found in the core layers of WPF. Ad esempio, FrameworkElement fornisce l'accesso diretto all'animazione tramite il BeginStoryboard metodo.For example, FrameworkElement provides direct access to animation through the BeginStoryboard method. Un oggetto Storyboard consente di creare script per più animazioni rispetto a un set di proprietà.A Storyboard provides a way to script multiple animations against a set of properties.

I due aspetti più importanti FrameworkElement introdotti sono data binding e stili.The two most critical things that FrameworkElement introduces are data binding and styles.

Il sottosistema data binding in WPF dovrebbe essere relativamente familiare a chiunque abbia utilizzato Windows Forms o ASP.NET per la creazione di un'applicazione interfaccia utenteuser interface (UI) .The data binding subsystem in WPF should be relatively familiar to anyone that has used Windows Forms or ASP.NET for creating an application interfaccia utenteuser interface (UI). In ciascuno di questi sistemi è possibile effettuare in modo semplice l'associazione di una o più proprietà di un dato elemento a un blocco di dati.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. WPF dispone del supporto completo per l'associazione di proprietà, trasformazione ed elenco.WPF has full support for property binding, transformation, and list binding.

Una delle funzionalità più interessanti di data binding in WPF è l'introduzione dei modelli di dati.One of the most interesting features of data binding in WPF is the introduction of data templates. che consentono di specificare in modo dichiarativo come deve essere visualizzato un blocco di dati.Data templates allow you to declaratively specify how a piece of data should be visualized. Anziché creare un'interfaccia utente personalizzata che può essere associata ai dati, è possibile aggirare il problema e fare in modo che siano i dati a stabilire il tipo di visualizzazione da creare.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.

L'applicazione degli stili è effettivamente un tipo di associazione dati sempliceStyling is really a lightweight form of data binding. e il suo utilizzo consente di associare un set di proprietà di una definizione condivisa a una o più istanze di un elemento.Using styling you can bind a set of properties from a shared definition to one or more instances of an element. Gli stili vengono applicati a un elemento in base al riferimento esplicito (impostando la Style proprietà) o in modo implicito associando uno stile al tipo CLR dell'elemento.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

La funzionalità più significativa dei controlli è l'applicazione di modelli.Control’s most significant feature is templating. Considerando il sistema di composizione di WPF come un sistema di rendering in modalità memorizzata, l'applicazione di modelli consente a un controllo di descriverne il rendering in modo dichiarativo e con parametri.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. Un oggetto ControlTemplate non è nient'altro che uno script per creare un set di elementi figlio, con binding alle proprietà offerte dal controllo.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 fornisce un set di proprietà predefinite,,, Foreground Background Padding , per citarne alcuni, che possono quindi essere usati dagli autori di modelli per personalizzare la visualizzazione di un controllo.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. L'implementazione di un controllo fornisce un modello dati e un modello di interazione.The implementation of a control provides a data model and interaction model. Il modello di interazione definisce un set di comandi (ad esempio, Chiudi per una finestra) e di associazioni a movimenti di input (ad esempio, fare clic sulla X rossa nell'angolo superiore della finestra).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). Il modello dati fornisce un set di proprietà per la personalizzazione del modello di interazione o della visualizzazione (stabilita dal modello).The data model provides a set of properties to either customize the interaction model or customize the display (determined by the template).

Questa suddivisione tra modello dati (proprietà), modello di interazione (comandi ed eventi) e modello di visualizzazione (modelli) consente una personalizzazione completa dell'aspetto e del comportamento di un controllo.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.

Una caratteristica comune del modello dati dei controlli è il modello di contenuto.A common aspect of the data model of controls is the content model. Se si osserva un controllo come Button , si noterà che è presente una proprietà denominata "Content" di tipo Object .If you look at a control like Button, you will see that it has a property named "Content" of type Object. In Windows Forms e ASP.NET questa proprietà è in genere una stringa, ma limita il tipo di contenuto che è possibile inserire in un pulsante.In Windows Forms and ASP.NET, this property would typically be a string – however that limits the type of content you can put in a button. Il contenuto di un pulsante può essere una stringa semplice, un oggetto dati complesso o l'intera struttura ad albero di un elemento.Content for a button can either be a simple string, a complex data object, or an entire element tree. Nel caso di un oggetto dati, il modello dati viene utilizzato per costruire una visualizzazione.In the case of a data object, the data template is used to construct a display.

RiepilogoSummary

WPF è progettato per consentire la creazione di sistemi di presentazione dinamici basati sui dati.WPF is designed to allow you to create dynamic, data driven presentation systems. Ogni parte del sistema è progettata per la creazione di oggetti utilizzando set di proprietà che ne definiscono il comportamento.Every part of the system is designed to create objects through property sets that drive behavior. L'associazione dati è una parte fondamentale del sistema ed è integrata a ogni livello.Data binding is a fundamental part of the system, and is integrated at every layer.

Le applicazioni tradizionali creano una visualizzazione e associano successivamente i dati.Traditional applications create a display and then bind to some data. In WPF tutte le informazioni sul controllo, ogni aspetto dello schermo, vengono generate da un tipo di data binding.In WPF, everything about the control, every aspect of the display, is generated by some type of data binding. Il testo che si trova nei pulsanti viene visualizzato creando un controllo composto all'interno del pulsante e associando la relativa visualizzazione alla proprietà del contenuto del pulsante.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.

Quando si inizia a sviluppare applicazioni basate su WPF, il suo aspetto è molto familiare.When you begin developing WPF based applications, it should feel very familiar. È possibile impostare proprietà, usare oggetti e associare dati nello stesso modo in cui è possibile usare Windows Forms o ASP.NET.You can set properties, use objects, and data bind in much the same way that you can using Windows Forms or ASP.NET. Con un'analisi più approfondita dell'architettura di WPF, si noterà che esiste la possibilità di creare applicazioni molto più ricche che considerano fondamentalmente i dati come driver di base dell'applicazione.With a deeper investigation into the architecture of WPF, you'll find that the possibility exists for creating much richer applications that fundamentally treat data as the core driver of the application.

Vedere ancheSee also