Confronto tra framework di Progettazione Windows Form e framework di Progettazione WPF

L'architettura di WPF Designer è sostanzialmente diversa dall'architettura di Progettazione Windows Form, che è caratterizzata dall'interfaccia IComponent e dallo spazio dei nomi System.ComponentModel. Se sono state create implementazioni personalizzate in fase di progettazione per i controlli Windows Form, si noterà che l'architettura di WPF Designer è più facile da utilizzare ed estendere.

L'architettura di WPF Designer mantiene le classi TypeConverter e TypeDescriptor del modello a oggetti di Progettazione Windows Form. Per la maggior parte degli altri aspetti, l'architettura di WPF Designer è diversa. Per ulteriori informazioni sull'architettura della fase di progettazione di Windows Form, vedere Estensione del supporto in fase di progettazione.

Principali differenze tra il framework ComponentModel e il framework WPF

Nella tabella seguente sono riepilogate le differenze tra l'architettura di WPF Designer e il framework System.ComponentModel.

Framework ComponentModel

Framework WPF Designer

Basato sulle interfacce IComponent, IContainer e ISite.

Basato sulla classe FrameworkElement.

Si basa su servizi per la fase di progettazione da un host.

Le finestre di progettazione pubblicano in modo dichiarativo i requisiti minimi.

Tipo di finestra di progettazione dedicato per ogni tipo di controllo.

È possibile eseguire un numero qualsiasi di funzionalità su un tipo di controllo.

Metadati hardcoded per ogni tipo di controllo; fissi in fase di compilazione del controllo.

Metadati distribuiti in un assembly distinto; possono essere personalizzati o sostituiti da strumenti. In questo modo è possibile aggiornare i metadati Design-Time in modo indipendente dal controllo.

Un oggetto IDesignerHost mantiene lo stato delle finestre di progettazione.

La classe EditingContext mantiene lo stato delle finestre di progettazione.

I servizi vengono raccolti e condivisi con un'implementazione di IServiceContainer.

La classe EditingContext mantiene i riferimenti ai servizi.

L'oggetto BehaviorService gestisce le interazioni tra tastiera, mouse e comandi.

L'architettura di strumenti di WPF Designer gestisce le interazioni tra tastiera, mouse e comandi.

Il modello a oggetti di modifica è costituito da controlli di runtime, con accesso ad associazione tardiva tramite la classe PropertyDescriptor.

Il modello a oggetti di modifica fornisce un livello di riferimenti indiretti per l'astrazione dei controlli di runtime. Gli editor di categorie consentono di modificare più proprietà in una singola interfaccia utente.

IComponent rispetto aFrameworkElement

Gli elementi WPF derivano dalla classe FrameworkElement, che fornisce la connessione tra i servizi di base WPF e le classi di elementi a livello di framework.

Gli elementi WPF non implementano l'interfaccia IComponent. Questo è uno dei principali motivi per cui in WPF Designer non viene utilizzato il framework System.ComponentModel. Pertanto, i controlli WPF non sono mai ospitati e non possono richiedere i servizi della finestra di progettazione dell'ambiente di progettazione System.ComponentModel.

Servizi per la fase di progettazione

Le finestre di progettazione nel framework System.ComponentModel richiedono i servizi dell'ambiente di progettazione. Nel framework WPF Designer è possibile completare la maggior parte delle attività senza eseguire query sull'ambiente per i servizi.

Nel framework System.ComponentModel i servizi della finestra di progettazione non sono garantiti per essere presenti in un host di progettazione, il che significa che il codice delle finestre di progettazione personalizzate deve sempre verificare l'esistenza di un riferimento null dopo una chiamata al metodo GetService. Il codice di progettazione deve degradare correttamente quando un servizio non è presente e in molti casi questo vincolo non può essere rispettato.

Nel framework di WPF Designer una finestra di progettazione personalizzata pubblica in modo dichiarativo i requisiti minimi. Se un host non è in grado di soddisfare il contratto, la finestra di progettazione non viene caricata. In questo modo l'implementazione complessiva diventa più semplice e affidabile.

Tipi di finestre di progettazione dedicate e separazione dei metadati

Nel framework System.ComponentModel un tipo di finestra di progettazione è associato al componente corrispondente tramite l'attributo dei metadati DesignerAttribute. Questo significa che la relazione viene stabilita in fase di compilazione, forzando una dipendenza hardcoded tra il comportamento dei componenti in fase di esecuzione e in fase di progettazione. Per connettere una finestra di progettazione diversa, è necessario modificare la dichiarazione di DesignerAttribute e ricompilare la codebase del componente.

In WPF Designer i metadati della finestra di progettazione sono inseriti in un assembly distinto, separandoli fisicamente dall'implementazione in fase di esecuzione. Grazie a questa flessibilità, strumenti diversi possono offrire esperienze di progettazione completamente diverse per lo stesso tipo di runtime. Per ulteriori informazioni, vedere AttributeTable.

Modello a oggetti di modifica

Nel framework System.ComponentModel le finestre di progettazione personalizzate accedono ai controlli con associazione tardiva tramite la classe PropertyDescriptor. Questa regola non viene applicata dall'ambiente di progettazione e se uno sviluppatore si dimentica di accedere a un controllo tramite la classe PropertyDescriptor vengono generati dei bug.

Nel framework di WPF Designer le finestre di progettazione personalizzate interagiscono con i controlli di runtime tramite un modello a oggetti di modifica, che fornisce un livello di riferimenti indiretti tramite cui i controlli vengono astratti in un modello e in una visualizzazione. Questo modello a oggetti elimina la necessità di accedere ai controlli tramite la classe PropertyDescriptor.

Analogie con il framework della finestra di progettazione ComponentModel

I contesti di modifica rappresentano la base per WPF Designer. La classe EditingContext contiene lo stato contestuale relativo a una finestra di progettazione.

Il contesto di modifica è concettualmente simile all'interfaccia IDesignerHost nello spazio dei nomi System.ComponentModel.Design. L'interfaccia IDesignerHost definisce molte funzionalità nella relativa interfaccia, ma la classe EditingContext è orientata solo verso le funzionalità dei dati e del comportamento.

Il contesto di modifica espone i servizi in modo simile all'interfaccia IServiceContainer. Il contesto di modifica supporta l'enumerazione e non supporta la rimozione dei servizi aggiunti. Per ulteriori informazioni, vedere Architettura di modifica dei contesti.

Differenze nell'utilizzo degli attributi

Gli attributi delle finestre di progettazione hanno significati diversi nelle architetture di WPF Designer e di Windows Form. Nella tabella seguente sono illustrate le differenze di utilizzo degli attributi correlati alle finestre di progettazione tra i due framework.

Attributo

Finestra delle proprietà Windows Form

Finestra delle proprietà Progettazione WPF e controllo proprietà Expression Blend

AmbientValueAttribute

Specifica il valore da passare a una proprietà affinché questa ottenga il proprio valore da un'altra origine. Questo concetto è noto come ambiente.

N/D

BrowsableAttribute

Specifica se una proprietà o un evento deve essere visualizzato nella finestra delle proprietà.

Indica se visualizzare una proprietà o un evento in una finestra Proprietà. Se impostato in modo esplicito su true in una proprietà che non è normalmente visualizzata, tale proprietà verrà mostrata.

CategoryAttribute

Specifica il nome della categoria in cui raggruppare la proprietà o l'evento se visualizzato in un controllo PropertyGrid impostato sulla modalità Per categoria.

Specifica il nome della categoria in cui raggruppare la proprietà se visualizzato in una finestra delle proprietà.

DefaultValueAttribute

Specifica il valore predefinito per una proprietà.

Per il tipo di dati CLR, specifica il valore predefinito per una proprietà. Viene ignorato nelle proprietà di dipendenza.

DescriptionAttribute

Specifica una descrizione per una proprietà o un evento.

N/D

DisplayNameAttribute

Specifica il nome visualizzato per una proprietà, un evento o un metodo void pubblico che non accetta argomenti.

Specifica il nome che verrà visualizzato nella finestra delle proprietà per una proprietà cui è applicato questo attributo.

EditorAttribute

Specifica l'editor da utilizzare per modificare una proprietà.

Specifica l'editor da utilizzare per modificare una proprietà, inclusi gli editor di categorie per le proprietà a valore multiplo.

EditorBrowsableAttribute

N/D

EditorBrowsableState.Advanced inserisce un editor di categorie o una proprietà nell'espansore Avanzate.

HelpKeywordAttribute

Specifica la parola chiave relativa al contesto per una classe o un membro.

N/D

LocalizableAttribute

Indica se una proprietà deve essere localizzata.

N/D

PasswordPropertyTextAttribute

Indica che la rappresentazione di testo di un oggetto è nascosta da caratteri, ad esempio asterischi.

N/D

ReadOnlyAttribute

Indica se la proprietà a cui l'attributo è associato è di sola lettura o lettura/scrittura in fase di progettazione.

Indica se la proprietà a cui l'attributo è associato è di sola lettura o lettura/scrittura in fase di progettazione. Le proprietà contrassegnate da ReadOnlyAttribute visualizzeranno l'oggetto in sola lettura come editor di stringhe nel controllo proprietà.

RefreshPropertiesAttribute

Indica che la finestra delle proprietà deve essere aggiornata quando il valore della proprietà associata viene modificato.

N/D

TypeConverterAttribute

Specifica il tipo da utilizzare come convertitore per l'oggetto a cui l'attributo è associato.

Specifica il tipo da utilizzare come convertitore per l'oggetto a cui l'attributo è associato.

DefaultEventAttribute

Specifica l'evento predefinito per un componente.

Specifica l'evento predefinito per un componente, che determina il gestore eventi da creare con il doppio clic.

DefaultPropertyAttribute

Specifica la proprietà predefinita per un componente.

Specifica la proprietà predefinita per un componente, che determina la proprietà selezionata per impostazione predefinita.

DesignerAttribute

Specifica la classe utilizzata per implementare i servizi in fase di progettazione per un componente.

N/D

DesignerCategoryAttribute

Indica che la finestra di progettazione di una classe appartiene a una determinata categoria.

N/D

ToolboxItemAttribute

Rappresenta un attributo di un elemento della Casella degli strumenti.

N/D

ToolboxItemFilterAttribute

Specifica la stringa di filtro e il tipo di filtro da utilizzare per una Casella degli strumenti.

N/D

ToolboxBrowsableAttribute

N/D

Viene utilizzato per impedire la visualizzazione di un tipo nella Casella degli strumenti quando un assembly viene esaminato per individuare i tipi da aggiungere alla Casella degli strumenti.

NewItemTypesAttribute

N/D

Viene utilizzato per specificare gli elementi che vengono aggiunti alla casella combinata per l'editor dell'insieme o l'editor di proprietà secondarie. Consente di specificare una factory per la personalizzazione della creazione.

PropertyOrderAttribute

N/D

Viene utilizzato per specificare l'ordine di visualizzazione delle proprietà nella finestra delle proprietà.

Gli attributi seguenti vengono utilizzati nel framework di WPF Designer, ma non nel framework di Progettazione Windows Form.

Differenze nella specifica delle icone della Casella degli strumenti

Nel framework di Progettazione Windows Form le icone della Casella degli strumenti per i controlli personalizzati vengono specificate applicando ToolboxBitmapAttribute alla classe di controlli.

Nel framework di WPF Designer vengono utilizzate una risorsa incorporata e una convenzione di denominazione per specificare una bitmap della Casella degli strumenti. Inoltre, per limitare i tipi di un assembly disponibili per l'inserimento in una Casella degli strumenti, è possibile utilizzare ToolboxBrowsableAttribute.

Differenze nella specifica di metadati

In Windows Form i metadati delle finestre di progettazione vengono specificati in modo dichiarativo, applicando attributi quale DesignerAttribute.

Nell'architettura di WPF Designer architecture, i metadati delle finestre di progettazione vengono specificati in AttributeTable.

Vedere anche

Altre risorse

Estensibilità di Progettazione WPF

Estensione del supporto in fase di progettazione

Estensibilità di Progettazione WPF