Condividi tramite


Architettura di estensibilità di Progettazione WPF

WPF Designer per Visual Studio è un ambiente di modifica visiva per gli elementi WPF e Silverlight. WPF Designer°è basato su un framework con un'architettura estensibile, che è possibile estendere per personalizzare l'esperienza di progettazione.

Estendendo il framework di WPF Designer, è possibile personalizzare in misura notevole l'aspetto e il comportamento in fase di progettazione del contenuto WPF e Silverlight. È ad esempio possibile estendere WPF Designer nei seguenti modi:

  • Personalizzazione dei glifi di spostamento e ridimensionamento con grafica avanzata.

  • Aggiunta di un menu di scelta rapida all'area di progettazione che modifica lo stato di un controllo.

  • Modifica dell'aspetto e del comportamento in fase di progettazione di un controllo con strumenti diversi.

L'architettura di WPF Designer supporta le funzionalità espressive avanzate di WPF e Silverlight, consentendo la creazione di numerose modalità di progettazione visiva che in precedenza non erano possibili.

Per un esempio sulla modalità di implementazione di un'esperienza della fase di progettazione personalizzata per WPF e Visual Studio, vedere Procedura dettagliata: creazione di uno strumento decorativo visuale in fase di progettazione

Per il codice di esempio che mostra come creare esperienze di progettazione personalizzate per WPF e Silverlight, vedere il sito Esempi di estensibilità di WPF Designer.

Framework della finestra di progettazione WPF

Il framework di WPF Designer è modulare, ovvero con l'estensione della fase di progettazione vengono estesi solo gli elementi necessari per le funzionalità in uso. Non è necessario scrivere molto codice di supporto per abilitare le funzionalità di progettazione personalizzate.

Il modello a oggetti è costituito da cinque unità funzionali, descritte nella tabella seguente.

Unità funzionale

Descrizione

Modello di modifica

Interfaccia di programmazione per gli oggetti presenti nella finestra di progettazione.

Provider di funzionalità

Punto principale di estensibilità nel framework della finestra di progettazione.

Contesto di modifica

Archivio centrale per lo stato di una finestra di progettazione.

Comandi, attività e strumenti

Comandi, attività e strumenti per elaborare l'input dell'utente.

Metadati in fase di progettazione

Assembly contenenti il comportamento in fase di progettazione di un controllo per separare fisicamente la logica delle finestre di progettazione dalla logica di runtime.

Nell'immagine seguente sono illustrate le unità funzionali del framework di WPF Designer.

Modello a oggetti ad alto livello

Modello di modifica

L'ambiente di progettazione interagisce con i controlli di runtime tramite un'interfaccia di progettazione denominata modello di modifica. Il modello di modifica è costituito da tre sottounità funzionali: un modello, un wrapper pubblico che astrae il modello e una visualizzazione che rappresenta l'interfaccia utente del modello.

L'ambiente di progettazione comunica con il modello sottostante tramite il tipo ModelItem. Tutte le modifiche vengono apportate ai wrapper ModelItem, che influiscono sul modello sottostante. In questo modo il modello risulta semplice. I wrapper ModelItem gestiscono le funzionalità complesse della finestra di progettazione, ad esempio il supporto delle transazioni, il rilevamento degli annullamenti e le notifiche delle modifiche.

La classe ModelService fornisce il punto di ingresso per il modello di modifica e per le notifiche degli eventi globali.

La classe ViewService esegue il mapping tra le rappresentazioni visive e gli elementi del modello sottostante.

Per il funzionamento della finestra di progettazione, sono necessari entrambi i servizi. La classe DesignerView, responsabile dell'elaborazione dell'input dell'utente e del relativo routing ai comandi, richiede entrambi questi servizi per rimappare in modo accurato l'input dell'utente al modello.

Provider di funzionalità

Per estendere il comportamento in fase di progettazione dei tipi, utilizzare la classe FeatureProvider o FeatureConnector<TFeatureProviderType>. La classe FeatureConnector<TFeatureProviderType> gestisce un elenco di oggetti FeatureProvider.

La classe FeatureProvider fornisce il punto di estensibilità di base. Un provider di funzionalità è una funzionalità o un componente aggiuntivo leggero che in genere non richiede molto all'ambiente di progettazione e viene creato ed eliminato in un determinato contesto. I provider di funzionalità vengono utilizzati per aggiungere nuove parti dell'interfaccia utente nell'area di progettazione o per modificare un comportamento di base. Ad esempio, con un provider di funzionalità è possibile aggiungere nuovi punti di controllo o modificare il comportamento di trascinamento tramite mouse.

Per accedere al livello più avanzato di estensibilità, derivare dalla classe FeatureConnector<TFeatureProviderType>. Questa classe espone un provider di servizi tramite il quale classi derivate di connettori di funzionalità possono gestire eventi e richieste e pubblicare servizi. Ad esempio, è possibile implementare un connettore di funzionalità per fornire l'interfaccia utente di selezione o la serializzazione specifica dell'oggetto.

In generale, implementare una funzionalità per estendere i concetti esistenti. Implementare un connettore di funzionalità per fornire nuovi concetti. Per ulteriori informazioni, vedere Provider di funzionalità e connettori di funzionalità.

Contesto di modifica

In una finestra di progettazione in esecuzione viene accumulata una quantità significativa di informazioni sullo stato. Ad esempio, lo stato della finestra di progettazione può indicare quali oggetti sono selezionati o il comportamento che si verifica quando viene premuto il pulsante sinistro del mouse. Poiché lo stato della finestra di progettazione è archiviato in una posizione centrale, può essere individuato quando necessario. La classe EditingContext rappresenta questo repository centrale dello stato per la finestra di progettazione.

La classe EditingContext separa lo stato in due categorie: dati e comportamento. I dati sono archiviati come tabella di elementi di contesto, mentre il comportamento come tabella di servizi. Entrambe le tabelle sono indicizzate per una chiave basata su tipo e sono enumerabili.

La classe ContextItem utilizza una singola parte dello stato nella finestra di progettazione. Gli elementi di contesto non sono modificabili, ma nuovi elementi di contesto possono sostituire quelli esistenti per simulare la modificabilità.

Ai servizi si accede tramite la proprietà Services, che restituisce un'istanza di ServiceManager, mentre agli elementi di contesto si accede tramite la proprietà Items, che restituisce un'istanza di ContextItemManager.

Comandi, attività e strumenti

L'architettura degli strumenti di WPF Designer è costituita da comandi, attività e strumenti. 

Un comando è un identificatore univoco che rappresenta alcuni comportamenti. Ad esempio, Taglia è un comando che indica di tagliare il testo corrente e di inserirlo negli Appunti. Il codice che implementa Taglia varia da un'applicazione all'altra e anche all'interno della stessa applicazione. Ad esempio, il taglio di testo in un documento di Word è un'implementazione diversa rispetto al taglio di testo nella casella di ricerca dello stesso documento. Indipendentemente dall'implementazione, il comando Taglia rimane costante.

In WPF Designer il sistema di comandi WPF è potenziato con l'introduzione del concetto di comando di strumento. Il comando di uno strumento implementa l'interfaccia ICommand ed è simile alla classe RoutedCommand.

Un' attività include un insieme di associazioni di comandi che consente di aggiungere comandi indirizzati. La classe DesignerView contiene codice che utilizza la stessa strategia di routing dei comandi di strumenti per trovare ed eseguire i comandi indirizzati definiti sulle attività. La classe DesignerView abilita attività che supportano comandi WPF comuni, ad esempio Copy.

Uno strumento è una classe che elabora l'input dell'utente. Tutto l'input dell'utente viene immesso nella finestra di progettazione come uno o più eventi di input. Questi eventi di input vengono passati allo strumento correntemente attivo, che li converte in associazioni di input. Se viene restituita un'associazione di input, viene eseguito il comando all'interno dell'associazione.

Uno strumento può rappresentare la modalità globale della finestra di progettazione. Ad esempio, se l'utente seleziona componenti nell'area di progettazione, la modalità di selezione è possibile perché lo strumento attivo offre associazioni di input e comandi che gestiscono la selezione. Quando l'utente crea una nuova istanza di un controllo, diventa attivo uno strumento diverso, che offre un set diverso di comandi associati alle stesse associazioni di input.

Metadati in fase di progettazione

Nel framework di WPF Designer i metadati che definiscono il comportamento in fase di progettazione di un controllo sono specificati tramite attributi e inseriti in un assembly distinto. Diverse finestre di progettazione possono utilizzare assembly di metadati diversi con implementazioni in fase di progettazione completamente diverse. Per questo motivo, il comportamento in fase di esecuzione è distinto da quello in fase di progettazione ed è quindi possibile rivedere la finestra di progettazione separatamente dal controllo.

Per specificare un assembly che fornisca l'implementazione in fase di progettazione, contrassegnare l'assembly con ProvideMetadataAttribute e includere una classe che implementa l'interfaccia IProvideAttributeTable.

Per ulteriori informazioni, vedere Aggiunta di metadati della fase di progettazione.

Supporto in fase di progettazione in Expression Blend

WPF Designer supporta tutte le funzionalità del framework di estensibilità. Di seguito sono elencate le funzionalità supportate da Expression Blend.

  • Elementi grafici

  • Menu di scelta rapida

  • DesignModeValueProvider

  • Inizializzatori predefiniti

  • Tutte le funzionalità di ModelItem, ad esempio selezione e modifica

  • Estensibilità del finestra Proprietà

Expression Blend non supporta ParentAdapter e PlacementAdapter.

Assembly di Progettazione WPF

WPF Designer comprende diversi assembly che appartengono a una delle tre categorie seguenti: assembly pubblici, privati e specifici della finestra di progettazione.

Gli assembly pubblici espongono classi che è possibile utilizzare per aggiungere logica della fase di progettazione ai controlli.

Gli assembly privati e specifici della finestra di progettazione definiscono il set di funzionalità di WPF Designer e le relative interazioni con le finestre di progettazione come Visual Studio ed Expression Blend.

Le finestre di progettazione di WPF e Silverlight vengono installate come una sola entità. Non è disponibile un pacchetto separato per ogni finestra di progettazione.

Nella tabella seguente viene illustrato come vengono distribuite le funzionalità di WPF Designer.

Assembly

API pubblica

Descrizione

Microsoft.Windows.Design.Extensibility.dll

Fornisce un modello di estensibilità tramite attributi e logica di integrazione di Visual Studio SDK.

Microsoft.Windows.Design.Interaction.dll

Fornisce le classi di input dell'utente e visualizzazione.

Microsoft.Windows.Design.Markup.dll

No

Fornisce XAML e meccanismi dei modelli di documento.

Microsoft.VisualStudio.Xaml.dll

No

Fornisce le basi XAML per tutte le finestre di progettazione tramite un servizio, un backplane di dati, nonché la modifica di metadati.

Microsoft.Windows.Design.Host.dll

No

API privata per l'hosting di una finestra di progettazione (specifica di Visual Studio).

Microsoft.Windows.Design.Developer.dll

No

Implementazione di WPF Designer.

Microsoft.Windows.Design.Developer.WPF.dll

No

Microsoft.Windows.Design.Developer.Silverlight.dll

No

Microsoft.Windows.Design.Platform.dll

No

Livello piattaforma con classi astratte. Le implementazioni della piattaforma implementano classi astratte in questo assembly.

Microsoft.Windows.Design.Platform.WPF.dll

No

Fase di progettazione specifica della piattaforma per WPF.

Microsoft.Windows.Design.Platform.Silverlight.dll

No

Fase di progettazione specifica della piattaforma per Silverlight.

Microsoft.Expression.DesignModel.dll

No

Assembly in fase di progettazione di Expression Blend.

Microsoft.Expression.Platform.WPF.dll

No

Assembly in fase di progettazione di Expression Blend.

Microsoft.Expression.Platform.Silverlight.dll

No

Assembly in fase di progettazione di Expression Blend.

Nota

Gli assembly rappresentano limiti di funzionalità, non limiti di spazi dei nomi. Sono spesso presenti spazi dei nomi che si estendono a più di un assembly.

Architettura di Progettazione WPF e Progettazione Windows Form

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. Per ulteriori informazioni, vedere Confronto tra framework di Progettazione Windows Form e framework di Progettazione WPF.

Vedere anche

Concetti

Provider di funzionalità e connettori di funzionalità

Altre risorse

Aggiunta di metadati della fase di progettazione

Sviluppo di controlli Windows Form in fase di progettazione

Estensibilità di Progettazione WPF