Cenni preliminari sugli elementi di base

Una percentuale elevata di classi in Windows Presentation Foundation (WPF) deriva da quattro classi alle quali viene comunemente fatto riferimento nella documentazione SDK come classi degli elementi di base. Queste classi sono UIElement, FrameworkElement, ContentElement e FrameworkContentElement. La classe DependencyObject è correlata in quanto si tratta di una classe di base comune di UIElement e ContentElement

Nel presente argomento sono contenute le seguenti sezioni.

  • API degli elementi di base nelle classi WPF
  • Scelta dell'elemento da cui derivare
  • Altre classi di base
  • Argomenti correlati

API degli elementi di base nelle classi WPF

UIElement e ContentElement derivano da DependencyObject, attraverso percorsi diversi. La differenza a questo livello è relativa alla modalità di utilizzo di UIElement o ContentElement in un'interfaccia utente e allo scopo che tali oggetti assolvono in un'applicazione. UIElement dispone anche di Visual nella propria gerarchia di classi, una classe che espone il supporto di grafica di basso livello sottostante a Windows Presentation Foundation (WPF). Visual fornisce un framework di rendering mediante la definizione di aree rettangolari indipendenti sullo schermo. In pratica, UIElement è destinato a elementi per i quali è previsto il supporto di un modello a oggetti più grande, il rendering e il layout in aree che è possibile descrivere come aree dello schermo rettangolari e un modello di contenuto più aperto, per consentire combinazioni diverse di elementi. ContentElement non deriva da Visual, ma è basato su un modello che prevede l'utilizzo di ContentElement da parte di altri elementi, quali un lettore o un visualizzatore destinati a interpretare gli elementi e produrre l'oggetto Visual completo da utilizzare in Windows Presentation Foundation (WPF). Alcune classi UIElement sono destinate a essere host di contenuto. Forniscono funzionalità di hosting e rendering per una o più classi ContentElement (DocumentViewer è un esempio di tale classe). ContentElement è utilizzato come classe di base per gli elementi con modelli a oggetti più piccoli e più indirizzati a contenuto tipo testo, informazioni o documenti che possono essere ospitati in un oggetto UIElement.

Livello di framework e livello principale

UIElement funge da classe di base per le classi FrameworkElement e ContentElement funge da classe di base per FrameworkContentElement. Il motivo per questo livello successivo di classi è il supporto di un livello principale WPF separato da un livello di framework WPF, una divisione che esiste anche nella modalità in cui vengono suddivise le APIs tra gli assembly PresentationCore e PresentationFramework. Il livello di framework WPF offre una soluzione più completa per le necessità di base delle applicazioni, inclusa l'implementazione del gestore di layout per le presentazioni. Il livello principale WPF è una modalità di utilizzare in modo esteso WPF senza l'overhead di assembly aggiuntivo. La distinzione tra questi livelli raramente è importante nella maggior parte degli scenari di sviluppo delle applicazioni tipici e, in genere, occorre considerare le APIs WPF come un tutto, senza preoccuparsi della differenza tra livello di framework WPF e livello principale WPF. Può essere necessario conoscere le distinzioni tra i livelli se in un progetto di applicazione si decide di sostituire quantità significative di funzionalità del livello di framework WPF, ad esempio se la soluzione complessiva dispone già di implementazioni personalizzate per la composizione e il layout dell'user interface (UI).

Scelta dell'elemento da cui derivare

Il modo ottimale per creare una classe personalizzata che estende WPF consiste nel derivare da una delle classi WPF mediante cui si ottiene la massima funzionalità desiderata tramite la gerarchia di classi esistente. In questa sezione vengono elencate le funzionalità fornite da tre delle più importanti classi di elementi che consentono di decidere da quale classe ereditare.

Per l'implementazione di un controllo, uno dei motivi più comuni per derivare da una classe WPF, è probabile che si desideri derivare da una classe che è un controllo pratico, una classe di base della famiglia dei controlli o almeno dalla classe di base Control. Per istruzioni ed esempi pratici, vedere Cenni preliminari sulla modifica di controlli.

Se non si crea un controllo e si desidera derivare da una classe più elevata nella gerarchia, nelle sezioni seguenti vengono fornite informazioni sulle caratteristiche definite in ogni classe degli elementi di base.

Se si crea una classe che deriva da DependencyObject, si ereditano le funzionalità seguenti:

  • Supporto di GetValue e SetValue e supporto del sistema delle proprietà generale.

  • Possibilità di utilizzare le proprietà di dipendenza e le proprietà associate implementate come proprietà di dipendenza.

Se si crea una classe che deriva da UIElement, si ereditano le funzionalità seguenti oltre a quelle fornite da DependencyObject:

Se si crea una classe che deriva da FrameworkElement, si ereditano le funzionalità seguenti oltre a quelle fornite da UIElement:

  • Supporto per l'utilizzo di stili e storyboard. Per ulteriori informazioni, vedere Style e Cenni preliminari sugli storyboard.

  • Supporto per l'associazione dati Per ulteriori informazioni, vedere Cenni preliminari sull'associazione dati.

  • Supporto per i riferimenti di risorse dinamiche. Per ulteriori informazioni, vedere Cenni preliminari sulle risorse.

  • Supporto dell'ereditarietà dei valori di proprietà e altri flag nei metadati che agevolano la segnalazione di condizioni relative alle proprietà ai servizi del framework, ad esempio associazione dati, stili o implementazione del layout nel framework. Per ulteriori informazioni, vedere Metadati delle proprietà del framework.

  • Concetto di albero logico. Per ulteriori informazioni, vedere Strutture ad albero in WPF.

  • Supporto per l'implementazione pratica del sistema di layout al livello di framework WPF, incluso un override di OnPropertyChanged per rilevare le modifiche alle proprietà che hanno effetto sul layout.

Se si crea una classe che deriva da ContentElement, si ereditano le funzionalità seguenti oltre a quelle fornite da DependencyObject:

Se si crea una classe che deriva da FrameworkContentElement, si ottengono le funzionalità seguenti oltre a quelle fornite da ContentElement:

  • Supporto per l'utilizzo di stili e storyboard. Per ulteriori informazioni, vedere Style e Cenni preliminari sull'animazione.

  • Supporto per l'associazione dati Per ulteriori informazioni, vedere Cenni preliminari sull'associazione dati.

  • Supporto per i riferimenti di risorse dinamiche. Per ulteriori informazioni, vedere Cenni preliminari sulle risorse.

  • Supporto dell'ereditarietà dei valori di proprietà e altri flag nei metadati che agevolano la segnalazione di condizioni relative alle proprietà ai servizi del framework, come associazione dati, stili o implementazione del layout nel framework. Per ulteriori informazioni, vedere Metadati delle proprietà del framework.

  • Non si eredita l'accesso alle modifiche del sistema di layout (ad esempio ArrangeOverride). Le implementazioni del sistema di layout sono disponibili solo in FrameworkElement. Tuttavia, viene ereditato un override di OnPropertyChanged per rilevare le modifiche alle proprietà che hanno effetto sul layout e segnalarle a qualsiasi host del contenuto.

I modelli di contenuto sono documentati per una varietà di classi. Il modello di contenuto per una classe è un fattore possibile da considerare per trovare una classe adatta da cui derivare. Per ulteriori informazioni, vedere Modello di contenuto WPF.

Altre classi di base

DispatcherObject

DispatcherObject fornisce supporto per il modello di threading WPF e consente l'associazione di tutti gli oggetti creati per le applicazioni WPF a Dispatcher. Anche se non si deriva da UIElement, DependencyObject o Visual, è necessario considerare la possibilità di derivare da DispatcherObject per ottenere il supporto del modello di threading. Per ulteriori informazioni, vedere Modello di threading.

Visual

Visual implementa il concetto di un oggetto 2D che generalmente richiede la presentazione visiva in un'area approssimativamente rettangolare. Il rendering effettivo di Visual viene effettuato in altre classi (non è autonomo), ma la classe Visual fornisce un tipo noto utilizzato dai processi di rendering a vari livelli. Visual implementa l'hit testing, ma non espone eventi che segnalano valori positivi di hit testing, disponibili in UIElement). Per ulteriori informazioni, vedere Programmazione a livello visivo.

Oggetto Freezable

Freezable simula la non modificabilità in un oggetto modificabile fornendo i mezzi per generare copie dell'oggetto quando per motivi di prestazioni è necessario o utile un oggetto non modificabile. Il tipo Freezable fornisce una base comune per alcuni elementi grafici, ad esempio geometrie, pennelli e animazioni. Freezable non è un oggetto Visual. Può contenere proprietà che diventano sottoproprietà quando Freezable viene applicato per riempire un valore di proprietà di un altro oggetto e tali sottoproprietà possono influire sul rendering. Per ulteriori informazioni, vedere Cenni preliminari sugli oggetti Freezable.

Animatable

Animatable è una classe derivata da Freezable che specificamente aggiunge il livello di controllo animazione e alcuni membri dell'utilità per consentire di distinguere le proprietà attualmente animate da quelle non animate.

Controllo

Control è la classe di base destinata al tipo di oggetto noto come controllo o componente, a seconda della tecnologia. In genere, le classi di controlli WPF sono classi che rappresentano direttamente un controllo dell'interfaccia utente o sono parte della composizione di tale controllo. La funzionalità principale abilitata da Control è l'applicazione di modelli di controllo.

Vedere anche

Riferimenti

Control

Concetti

Cenni preliminari sulle proprietà di dipendenza

Cenni preliminari sulla modifica di controlli

Architettura WPF