Windows Presentation Foundation (o WPF), nome in codice Avalon, è una libreria di classi del Framework .NET proprietarie Microsoft (introdotta con la versione 3.0) per lo sviluppo dell'interfaccia grafica delle applicazioni in ambienti Windows.
L'innovazione principale di WPF è la rimozione di ogni legame con il modello di sviluppo tradizionale di Windows, introdotto con la versione 1.0 del sistema operativo. Tutti i controlli sono stati riscritti (non si appoggiano più a quelli della libreria “user”) e il meccanismo basato su scambio di messaggi, cuore del modello di programmazione di Windows, viene incapsulato in code di eventi, semplificandolo e nascondendone la complessità.
WPF è basato su un sistema di grafica vettoriale che si appoggia alle DirectX per sfruttare l'accelerazione hardware delle moderne schede grafiche. WPF può essere impiegato per realizzare applicativi eseguibili anche all'interno del browser Microsoft Internet Explorer o di altri browser avanzati, purché sia presente il Framework. Il linguaggio usato per la creazione di una interfaccia utente in WPF è lo XAML (eXtensible Application Markup Language), basato su XML.
Il 4 dicembre 2018, durante la conferenza Microsoft Connect(); 2018, l'azienda ha reso open source Windows Presentation Foundation, Windows Forms e WinUI (Windows UI XAML Library), caricando su GitHub il codice sorgente[1].
L'architettura di Windows Presentation Foundation si basa sia su codice gestito sia su codice nativo. Comunque, le API pubbliche esposte sono disponibili soltanto come codice gestito. Mentre la maggior parte di WPF è in codice gestito, il motore di composizione che renderizza le applicazioni WPF è un componente nativo. Il suo nome è Media Integration Layer (MIL) e risiede in "milcore.dll". Esso si interfaccia direttamente con DirectX e provvede il supporto di base per le superfici 2D e 3D, effettua la manipolazione controllata nel tempo dei contenuti di una superficie con una vista per esporre animazioni costruite ad alto livello, esegue la composizione degli elementi individuali di una applicazione WPF nella scena finale 3D che rappresenta la UI dell'applicazione e quindi si incarica di renderizzarla sullo schermo. I media codec sono anche implementati come codice non gestito, e sono forniti da "windowscodecs.dll". Nella parte di codice gestito abbiamo il PresentationCore ("presentationcore.dll") che fornisce un wrapper per MIL e implementa il cuore dei servizi per WPF e il PresentationFramework ("presentationframework.dll") che implementa le novità incluse layouts, time-dependent, story-board based animations e data binding.
Tutte le applicazioni WPF sono composte da 2 thread: il thread per gestire la UI e l'altro thread detto render thread che in maniera nascosta gestisce le funzioni di rendering e repainting. Perciò rendering e repainting sono gestite da WPF stesso, senza intervento dello sviluppatore. Il thread per la UI ospita il Dispatcher (attraverso un'istanza dell'oggetto DispatcherObject), il quale mantiene una coda di operazioni che necessitano di essere eseguite sulla UI (come un albero fatto di oggetti Visual, detto albero visuale) ordinate per priorità. Gli eventi della UI, compreso il cambiamento di una proprietà che riguarda il layout, ed eventi causati dall'interazione dell'utente sono accodati nel dispatcher, il quale invoca i gestori degli eventi. Microsoft raccomanda che i gestori degli eventi aggiornino solo le proprietà per riflettere il nuovo contenuto come risposta; il nuovo contenuto sarà generato o recuperato dal render thread. Il render thread prende una copia dell'albero visuale e attraversa l'albero calcolando quali componenti saranno visibili e renderizzandoli come superfici Direct3D. Il render threads inoltre salva in una cache l'albero visuale, così devono essere comunicati solo i cambiamenti all'albero, e perciò soltanto i pixel cambiati risulteranno aggiornati. WPF supporta un modello di layout estendibile. Il layout è diviso in due fasi che svolgono le funzioni di misurare ed adattare. Nella fase di misura vengono ricorsivamente chiamati tutti gli elementi e viene determinato lo spazio che essi prendono. Nella fase di adattamento, gli elementi figli vengono ricorsivamente adattati nello spazio dei loro genitori, invocando l'algoritmo di layout del modulo in uso.