2009-07-15 21 views
37

Recentemente ho fatto un UserControl, che ha avuto molto tempo, perché ho dovuto lavorare con le proprietà di dipendenza personalizzati e così via ...WPF ControlTemplate vs UserControl

In ogni modo, era solo un mucchio di 3 controlli: TextBox, Popup con Hierarchical Tree.

Ora mi sono reso conto che probabilmente potrei scrivere solo ControlTemplate. Quindi qual è il vantaggio dell'utilizzo di UserControl?

risposta

54

Qui ci sono tre casi da considerare: UserControl, ControlTemplate e custom Control. (Immagino che un DataTemplate non abbia bisogno di spiegazioni)

A controllo personalizzato è qualcosa che viene fornito quando si crea la funzionalità di base di un nuovo componente dell'interfaccia utente. Esistono diversi vantaggi e svantaggi per questo, ma, ad esempio, se si desidera un comportamento di selezione personalizzato di un oggetto ItemsControl, è meglio farlo sottoclasse Selector o MultiSelector (lo fa il wGrftoolkit DataGrid). Inoltre, se si desidera un oggetto che conterrebbe una nuova proprietà di dipendenza, nella maggior parte dei casi deriverà da Controllo.

Il principio di wpf qui contenuto è il paradigma del controllo "senza look", ovvero "assicurati di aspettarti che qualcuno stia tentando di modellare il tuo controllo, o almeno di farlo comportare bene nello scenario del tuo modello". I controlli personalizzati vengono generalmente creati tenendo presente la riutilizzabilità, spesso come parti di DLL di framework.

A ControlTemplate è essenzialmente una descrizione di un albero visivo sostitutivo e può essere impostato esplicitamente su FrameworkElements o come parte di uno stile. Questa è l'opzione a cui devi mirare quando il tuo obiettivo è principalmente quello di creare un'applicazione e di farlo. Puoi fare praticamente qualsiasi cosa con un ControlTemplate visivamente, se sei in grado di ottenere i binding e i trigger (e il possibile contenente Style stesso) correttamente. Tutto questo può essere dichiarato come una risorsa riutilizzata, per dare alla tua applicazione un "tema" comune.

Un UserControl è un controllo composito self-contained, con parti individualmente modificabili nella finestra di progettazione, ed è utilizzato al meglio, se hai bisogno di vedere i componenti e gestirli nella finestra di progettazione.Un ControlTemplate, d'altra parte, non espone i suoi componenti per la manipolazione nel designer (anche se sarà visibile). Generalmente si crea un UserControl per una pagina dei dettagli del cliente, o un browser di visualizzazione del prodotto, o qualsiasi altro caso in cui non si desidera creare un controllo completo, ma si desidera una vista dettagliata con il supporto completo del progettista.

Un caso particolare qui è se si utilizza il modello MVVM. Molte grandi implementazioni MVVM utilizzano UserControls come visualizzazioni e ControlTemplates e Styles come risorse utilizzate da tali visualizzazioni. La pratica MVVM minimizza anche la necessità di un controllo personalizzato e ha molti altri vantaggi.

(Per maggiori informazioni su MVVM, tra molti altri, Google per Josh Smith, Sacha Barber e articoli fantastici di Karl Shifflett)

3

Se si aggiungono le proprie proprietà di dipendenza, sarà necessario un proprio corso per definirle.

Come si desidera applicare un modello alla classe, questa classe personalizzata dovrà derivare da Control (come fa UserControl).

Il vantaggio principale di scrivere la propria classe Control -derived è che può essere ridefinito il suo modello per altri scenari di utilizzo, sia dall'utente all'interno dell'app, sia da altri utenti del tipo.

L'uso della classe UserControl è molto ridotto. In effetti, se lo guardi in Reflector.NET, vedrai che non ha praticamente alcun codice. In primo luogo, UserControl ridefinisce solo i metadati su alcune proprietà di dipendenza esistenti (come ad esempio rendendo il valore predefinito di FocusablePropertyfalse.)

A meno che non è necessario ridefinire il modello del controllo subito, si può lasciare come UserControl per ora e cambiala più tardi se necessario.

+0

ho capito che la differenza principale è che posso fornire nuove proprietà di dipendenza per tale controllo. Ma penso che tutte le altre modifiche potrebbero essere impostate in Stile, Trigger o Template. O? –