# Windows Forms

Microsoft Windows Forms è il nome dato alla parte di GUI del framework Microsoft.NET, fornisce accesso al widgets nativo di Windows incapsulando l'esistente Win32 API in modalità managed code.
Anche se Microsoft Windows Forms è visto come un sostituto per il precedente e più complesso sistema Microsoft Foundation Classes basato su C++, non offre caratteristiche paragonabili, come ad esempio l'architettura "Vista/Documento" Model-View-Controller.
L'implementazione esiste all'interno del namespace System.Windows.Forms del framework.NET e cerca correttamente theme itself on Windows XP. Ci sono comunque significanti controversie con questo supporto riguardo ai tab sheets e i controlli piazzati in questi sheets.
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.
Altri toolkits di GUI per.NET includono:
* GTK#: un wrapper per il toolkit GTK+.
* VCL.NET: un wrapper della Borland per i widgets di Win32, fornito come parte del Delphi.NET.
* DotGNU: disegna i widgets autonomamente.

## Architettura

Un'applicazione Windows Form è un'applicazione basata su eventi supportata da.NET Framework di Microsoft. A differenza di un programma batch, trascorre la maggior parte del tempo semplicemente aspettando che l'utente faccia qualcosa, come riempire una casella di testo o fare clic su un pulsante.
Windows Forms fornisce l'accesso ai controlli comuni dell'interfaccia utente di Windows nativi racchiudendo l'API di Windows esistente nel codice gestito. Con l'aiuto di Windows Form,.NET Framework fornisce un'astrazione più completa sopra l'API Win32 rispetto a Visual Basic o MFC.
Windows Forms è simile alla libreria MFC (Microsoft Foundation Class) nello sviluppo di applicazioni client. Fornisce un wrapper costituito da un insieme di classi C++ per lo sviluppo di applicazioni Windows. Tuttavia, non fornisce un framework dell'applicazione predefinito come MFC. Ogni controllo in un'applicazione Windows Form è un'istanza concreta di una classe.

## Caratteristiche

Tutti gli elementi visivi nella libreria di classi Windows Form derivano dalla classe Control. Ciò fornisce la funzionalità minima di un elemento dell'interfaccia utente come posizione, dimensione, colore, carattere, testo, nonché eventi comuni come il clic e il trascinamento/rilascio. La classe Control ha anche il supporto di aggancio per consentire a un controllo di riorganizzare la sua posizione sotto il suo genitore. Il supporto di Microsoft Active Accessibility nella classe Control consente inoltre agli utenti con problemi di utilizzo di utilizzare meglio Windows Form.
Oltre a fornire l'accesso ai controlli nativi di Windows come pulsante, casella di testo, casella di controllo e visualizzazione elenco, Windows Forms ha aggiunto i propri controlli per l'hosting ActiveX, la disposizione del layout, la convalida e l'associazione di dati avanzati. Questi controlli vengono visualizzati utilizzando GDI +.

## Storia e futuro

Proprio come Abstract Window Toolkit (AWT), l'equivalente API Java, Windows Forms era un modo semplice e precoce per fornire componenti dell'interfaccia utente grafica a.NET Framework. Windows Forms si basa sull'API di Windows esistente e alcuni controlli si limitano a racchiudere i componenti di Windows sottostanti. Alcuni metodi consentono l'accesso diretto ai callback Win32, che non sono disponibili nelle piattaforme non Windows.
In.NET Framework 2.0, Windows Form ha ottenuto controlli di layout più ricchi, controlli toolstrip in stile Office 2003, componente multithreading, supporto per la fase di progettazione e data binding più ricco, nonché ClickOnce per la distribuzione basata sul Web.
Con il rilascio di.NET 3.0, Microsoft ha rilasciato una seconda API parallela per il rendering delle GUI: Windows Presentation Foundation (WPF) basata su DirectX, insieme a un linguaggio dichiarativo della GUI chiamato XAML.
Durante una sessione di domande e risposte alla conferenza Build 2014, Microsoft ha spiegato che Windows Forms era in modalità di manutenzione, senza l'aggiunta di nuove funzionalità, ma i bug trovati sarebbero comunque stati risolti. Più recentemente, negli aggiornamenti a.NET Framework versione 4.5 è stato introdotto un supporto migliorato per DPI elevati per vari controlli Windows Forms.

## Compatibilità con le versioni precedenti di XAML con Windows Form

Per lo sviluppo futuro, Microsoft ha sostituito Windows Forms con una voce GUI basata su XAML utilizzando framework come WPF e UWP. Tuttavia, il posizionamento del trascinamento della selezione dei componenti della GUI in modo simile a Windows Forms è ancora fornito in XAML sostituendo l'elemento XAML radice della pagina/finestra con un controllo dell'interfaccia utente "Canvas". Quando apporta questa modifica, l'utente può creare una finestra in modo simile a Windows Forms trascinando e rilasciando direttamente i componenti utilizzando la GUI di Visual Studio.
Sebbene XAML fornisca la compatibilità con le versioni precedenti del posizionamento mediante trascinamento tramite il controllo Canvas, i controlli XAML sono simili solo ai controlli Windows Form e non sono compatibili con le versioni precedenti uno a uno. Eseguono funzioni simili e hanno un aspetto simile, ma le proprietà e i metodi sono abbastanza diversi da richiedere la ri-mappatura da un'API all'altra.

## Implementazione alternativa

Mono è un progetto guidato da Xamarin (in precedenza Ximian, poi Novell) per creare un set di strumenti compatibile con.NET conforme allo standard Ecma.
Nel 2011, il supporto di Mono per System.Windows.Forms a partire da .NET 2.0 è stato annunciato come completo; System.Windows.Forms 2.0 funziona in modo nativo su Mac OS X. Tuttavia, System.Windows.Forms non è stato sviluppato attivamente su Mono. Piena compatibilità con .NET non era possibile, perché System.Windows.Forms di Microsoft è principalmente un wrapper dell'API di Windows e alcuni metodi consentono l'accesso diretto ai callback Win32, che non sono disponibili su piattaforme diverse da Windows. Un problema più significativo è che, dalla versione 5.2, Mono è stato aggiornato in modo che il suo valore predefinito presupponga una piattaforma a 64 bit. Tuttavia, System.Windows.Forms su Mono per la piattaforma Macintosh OS X è stato creato utilizzando un sottosistema a 32 bit, Carbon.