Qual è la differenza tra una libreria di controllo utente e una libreria di controllo personalizzata?


168

Sto solo arrivando per accelerare su WPF e vorrei creare un controllo WPF riutilizzabile.

Quando guardo le opzioni per la creazione di progetti in Visual Studio, vedo "Libreria controllo utente WPF" e "Libreria controllo personalizzato WPF". Non mi è chiaro quale sia la differenza tra loro e le mie ricerche su Google non hanno fornito spiegazioni decenti.

Mi piacerebbe capire le differenze tra loro e idealmente vedere alcuni esempi di quando usare l'uno rispetto all'altro.


2
Non dimenticare di annidare il contenuto o modificare il modello di un controllo come opzioni. In questo modo puoi apportare modifiche piuttosto drammatiche a un controllo senza dover scrivere un controllo personalizzato.
MichaC,

Proprio quello che ha detto MichaC. La parte migliore di WPF è che il modello dei controlli esistenti può avere un impatto enorme. Dovresti richiedere controlli personalizzati raramente. Ciò è diverso da WinForms in cui anche piccole modifiche a un controllo richiedono un nuovo controllo derivato.
Mikko Rantanen,

Ancora utile. Prendi un altro distintivo d'oro.
ouflak,

Risposte:


117

In pratica i controlli personalizzati sono qualcosa che si implementa a livello di codice mentre è possibile utilizzare XAML per i controlli utente. I controlli personalizzati estendono una delle classi della base di controllo WPF e forniscono funzionalità aggiuntive tramite il codice, pertanto tutta la logica e la rappresentazione aggiunte devono essere implementate all'interno del codice.

Un controllo utente è tecnicamente un normale controllo del contenuto che è possibile estendere in alcune parti del codice, ma di solito viene esteso inserendo altri controlli al suo interno. Così come Kent ha menzionato un UserControl è un'aggregazione di altri controlli. Ciò limita notevolmente ciò che è possibile fare con un controllo utente. È più facile da usare ma più limitato di un controllo personalizzato completo.

Questi controlli hanno una piccola differenza dal punto di vista del runtime. Quando si crea un'applicazione e si inserisce un UserControl, l'albero di controllo avrà al suo interno un modello UserControl concreto. Quindi, se consideriamo un esempio lame di un pulsante specializzato. Se si utilizzava un controllo utente, aggiungerebbe un pulsante all'interno <UserControl>dell'elemento. Quando si utilizza un controllo personalizzato, è probabile che si derivi il controllo stesso da un pulsante molto probabilmente. La differenza sarebbe visibile nell'albero logico.

Mentre il controllo personalizzato fornirebbe un albero logico simile a

  • Finestra
    • CustomButton

UserControl darebbe un albero logico di

  • Finestra
    • CustomButtonUserControl
      • Pulsante

Quindi, alla fine, UserControl è solo un normale ContentControl che puoi estendere un po 'e per il quale puoi predefinire il contenuto. Il controllo personalizzato offre una maggiore flessibilità al prezzo della facilità di implementazione in quanto devi fare tutta la logica e l'interazione nel codice invece di avere il vantaggio di XAML.

Anche se dopo tutto questo, non penso che ci sia molta differenza nei modelli di Visual Studio. Molto probabilmente il controllo personalizzato di Visual Studio crea solo un progetto con un controllo personalizzato vuoto mentre il progetto Controllo utente è un progetto con un controllo utente vuoto. Successivamente puoi aggiungere qualsiasi tipo di elemento al progetto.

Aggiornare

E la mia opinione su quando usare il controllo personalizzato e il controllo utente è che se riesci a fare qualcosa con un controllo utente e l'elemento di controllo extra nella struttura logica non ti disturba, usa un controllo utente in quanto sono molto più facili da creare e mantenere. Utilizzare un controllo personalizzato solo se si ha un motivo per non utilizzare un controllo utente.


2
È possibile utilizzare un controllo personalizzato per aggregare altri controlli?
17 del 26

E che dire del problema personalizzabile / templatable?
17 del 26

1
Non sono sicuro di cosa intendi per aggregazione. Non è possibile creare un controllo personalizzato aggregando altri controlli. Tuttavia, è possibile derivare da un controllo Panel come StackPanel, Grid o Panel stesso in modo da poter implementare un contenitore di layout con un controllo personalizzato (non sono sicuro se è possibile farlo con un Controllo utente).
Mikko Rantanen,

Sì, ma se si desidera semplicemente aggregare altri controlli, sarebbe probabilmente molto più semplice fare un controllo utente. A seconda di cosa si desidera fare, un controllo personalizzato può essere davvero difficile da scrivere, motivo per cui si dovrebbe scegliere di utilizzare un controllo utente anche se fornisce solo un sottoinsieme delle funzionalità.
MichaC,

1
Entrambi questi controlli dovrebbero essere personalizzabili / modellabili quando implementati nel modo corretto. Purtroppo il mio riferimento WPF è attualmente in ufficio, quindi non posso controllare i dettagli di implementazione.
Mikko Rantanen,

23

A Controlrappresenta un comportamento personalizzabile (templatable), mentre a UserControlè generalmente un'aggregazione di livello superiore di Controls specifica per un'applicazione.

Maggiori informazioni disponibili qui .


3
Questo è uno dei link che ho trovato che non ha spiegato molto bene le cose :). Immagino che una cosa che mi manca sia cosa significhi skinnable / templatable e perché non possa essere fatto con un controllo utente. Inoltre, l'ultima frase del post collegato è "In generale e semplicemente parlando, i controlli personalizzati hanno una maggiore flessibilità e riusabilità rispetto ai controlli utente". Se questo è vero, allora perché dovrei mai voler creare un controllo utente?
17 del 26
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.